Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /ios /PRESUBMIT.py
blob: 8984e045942017ed543d78b70c30074fc593c613 [file] [log] [blame]
Avi Drissmanea1be232022-09-14 23:29:06[diff] [blame]1# Copyright 2017 The Chromium Authors
Sylvain Defresnefcda19f2017-06-27 10:14:01[diff] [blame]2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
Sylvain Defresnefcda19f2017-06-27 10:14:01[diff] [blame]4"""Presubmit script for ios.
5
6See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
7for more details about the presubmit API built into depot_tools.
8"""
9
stkhapugin@chromium.org0066f732017-12-28 10:33:08[diff] [blame]10import os
Gauthier Ambard3803d8f2025-01-07 19:36:07[diff] [blame]11import xml.etree.ElementTreeasElementTree
stkhapugin@chromium.org0066f732017-12-28 10:33:08[diff] [blame]12
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]13NULLABILITY_PATTERN= r'(nonnull|nullable|_Nullable|_Nonnull)'
Sylvain Defresnefcda19f2017-06-27 10:14:01[diff] [blame]14TODO_PATTERN= r'TO[D]O\(([^\)]*)\)'
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]15BUG_PATTERN= r'^(crbug\.com|b)/\d+$'
16DEPRECATED_BUG_PATTERN= r'^b/\d+$'
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]17INCLUDE_PATTERN= r'^#include'
Gauthier Ambardf85c5f12022-09-14 11:26:54[diff] [blame]18PIPE_IN_COMMENT_PATTERN= r'//.*[^|]\|(?!\|)'
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]19IOS_PACKAGE_PATTERN= r'^ios'
Louis Romeroe33c2da2023-01-19 14:18:53[diff] [blame]20BOXED_BOOL_PATTERN= r'@\((YES|NO)\)'
Federica Germinario2ce51a82025-01-27 14:44:10[diff] [blame]21USER_DEFAULTS_PATTERN= r'\[NSUserDefaults standardUserDefaults]'
Gauthier Ambard7fc07bf2018-01-02 09:48:09[diff] [blame]22
Benjamin Williams715f0232025-02-20 12:44:09[diff] [blame]23# Color management constants
24COLOR_SHARED_DIR='ios/chrome/common/ui/colors/'
25COLOR_FILE_PATTERN='.colorset/Contents.json'
26
27
28defFormatMessageWithFiles(message, errors):
29"""Helper to format warning/error messages with affected files."""
30ifnot errors:
31return message
32return'\n'.join([message+'\n\nAffected file(s):']+ errors)+'\n'
33
Gauthier Ambard7fc07bf2018-01-02 09:48:09[diff] [blame]34defIsSubListOf(needle, hay):
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]35"""Returns whether there is a slice of |hay| equal to |needle|."""
36for i, linein enumerate(hay):
37if line== needle[0]:
38if needle== hay[i:i+ len(needle)]:
39returnTrue
40returnFalse
41
stkhapugin@chromium.org0066f732017-12-28 10:33:08[diff] [blame]42
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]43def_CheckNullabilityAnnotations(input_api, output_api):
Daniel Bratell5cb4c1e22024-04-17 07:49:06[diff] [blame]44""" Checks whether there are nullability annotations in ios code.
45
46 They are accepted in ios/web_view/public since it tries to mimic
47 the platform library but not anywhere else.
48 """
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]49 nullability_regex= input_api.re.compile(NULLABILITY_PATTERN)
Sylvain Defresnefcda19f2017-06-27 10:14:01[diff] [blame]50
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]51 errors=[]
52for fin input_api.AffectedFiles():
Daniel Bratell5cb4c1e22024-04-17 07:49:06[diff] [blame]53if f.LocalPath().startswith('ios/web_view/public/'):
54# ios/web_view/public tries to mimic an existing API that
55# might have nullability in it and that is acceptable.
56continue
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]57for line_num, linein f.ChangedContents():
58if nullability_regex.search(line):
59 errors.append('%s:%s'%(f.LocalPath(), line_num))
60ifnot errors:
61return[]
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]62
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]63 plural_suffix=''if len(errors)==1else's'
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]64 warning_message=('Found Nullability annotation%(plural)s. '
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]65'Prefer DCHECKs in ios code to check for nullness:'%{
66'plural': plural_suffix
67})
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]68
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]69return[output_api.PresubmitPromptWarning(warning_message, items=errors)]
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]70
71
72def_CheckBugInToDo(input_api, output_api):
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]73""" Checks whether TODOs in ios code are identified by a bug number."""
74 errors=[]
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]75 warnings=[]
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]76for fin input_api.AffectedFiles():
77for line_num, linein f.ChangedContents():
78if_HasToDoWithNoBug(input_api, line):
79 errors.append('%s:%s'%(f.LocalPath(), line_num))
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]80if_HasToDoWithDeprecatedBug(input_api, line):
81 warnings.append('%s:%s'%(f.LocalPath(), line_num))
82ifnot errorsandnot warnings:
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]83return[]
Sylvain Defresnefcda19f2017-06-27 10:14:01[diff] [blame]84
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]85 output=[]
86if errors:
Gauthier Ambard304538e2025-01-07 14:07:05[diff] [blame]87 singular_article='a 'if len(errors)==1else''
88 plural_suffix=''if len(errors)==1else's'
89 error_message='\n'.join([
90'Found TO'
91'DO%(plural)s without %(a)sbug number%(plural)s (expected format '
92'is \"TO'
93'DO(crbug.com/######)\"):'%{
94'plural': plural_suffix,
95'a': singular_article
96}
97]+ errors)+'\n'
98 output.append(output_api.PresubmitError(error_message))
Sylvain Defresnefcda19f2017-06-27 10:14:01[diff] [blame]99
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]100if warnings:
Gauthier Ambard304538e2025-01-07 14:07:05[diff] [blame]101 singular_article='a 'if len(warnings)==1else''
102 plural_suffix=''if len(warnings)==1else's'
103 warning_message='\n'.join([
104'Found TO'
105'DO%(plural)s with %(a)sdeprecated bug link%(plural)s (found '
106'"b/#####\", expected format is \"crbug.com/######"):'%{
107'plural': plural_suffix,
108'a': singular_article
109}
110]+ warnings)+'\n'
111 output.append(output_api.PresubmitPromptWarning(warning_message))
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]112
113return output
Sylvain Defresnefcda19f2017-06-27 10:14:01[diff] [blame]114
115
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]116def_CheckHasNoIncludeDirectives(input_api, output_api):
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]117""" Checks that #include preprocessor directives are not present."""
118 errors=[]
119for fin input_api.AffectedFiles():
120ifnot_IsInIosPackage(input_api, f.LocalPath()):
121continue
122 _, ext= os.path.splitext(f.LocalPath())
123if ext!='.mm':
124continue
125for line_num, linein f.ChangedContents():
126if_HasIncludeDirective(input_api, line):
127 errors.append('%s:%s'%(f.LocalPath(), line_num))
128ifnot errors:
129return[]
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]130
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]131 singular_plural='it'if len(errors)==1else'them'
132 plural_suffix=''if len(errors)==1else's'
133 error_message='\n'.join([
134'Found usage of `#include` preprocessor directive%(plural)s! Please, '
135'replace %(singular_plural)s with `#import` preprocessor '
136'directive%(plural)s instead. '
137'Consider replacing all existing `#include` with `#import` (if any) in '
138'this file for the code clean up. See '
139'https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main'
140'/styleguide/objective-c/objective-c.md'
141'#import-and-include-in-the-directory for more details. '
142'\n\nAffected file%(plural)s:'%{
143'plural': plural_suffix,
144'singular_plural': singular_plural
145}
146]+ errors)+'\n'
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]147
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]148return[output_api.PresubmitError(error_message)]
149
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]150
Gauthier Ambardf85c5f12022-09-14 11:26:54[diff] [blame]151def_CheckHasNoPipeInComment(input_api, output_api):
152""" Checks that comments don't contain pipes."""
153 pipe_regex= input_api.re.compile(PIPE_IN_COMMENT_PATTERN)
154
155 errors=[]
156for fin input_api.AffectedFiles():
157ifnot_IsInIosPackage(input_api, f.LocalPath()):
158continue
159for line_num, linein f.ChangedContents():
160if pipe_regex.search(line):
161 errors.append('%s:%s'%(f.LocalPath(), line_num))
162ifnot errors:
163return[]
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]164 warning_message='\n'.join([
Gauthier Ambardf85c5f12022-09-14 11:26:54[diff] [blame]165'Please use backticks "`" instead of pipes "|" if you need to quote'
166' variable names and symbols in comments.\n'
167'Found potential uses of pipes in:'
168]+ errors)+'\n'
169
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]170return[output_api.PresubmitPromptWarning(warning_message)]
Gauthier Ambardf85c5f12022-09-14 11:26:54[diff] [blame]171
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]172def_CheckCanImproveTestUsingExpectNSEQ(input_api, output_api):
173""" Checks that test files use EXPECT_NSEQ when possible."""
174 errors=[]
175# Substrings that should not be used together with EXPECT_TRUE or
176# EXPECT_FALSE in tests.
177 wrong_patterns=["isEqualToString:","isEqualToData:","isEqualToArray:"]
178for fin input_api.AffectedFiles():
179ifnot'_unittest.'in f.LocalPath():
Gauthier Ambard304538e2025-01-07 14:07:05[diff] [blame]180continue
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]181for line_num, linein f.ChangedContents():
182if line.startswith(("EXPECT_TRUE","EXPECT_FALSE")):
Gauthier Ambard304538e2025-01-07 14:07:05[diff] [blame]183# Condition is in one line.
184if any(xin linefor xin wrong_patterns):
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]185 errors.append('%s:%s'%(f.LocalPath(), line_num))
Gauthier Ambard304538e2025-01-07 14:07:05[diff] [blame]186# Condition is split on multiple lines.
187elifnot line.endswith(";"):
188# Check this is not the last line.
189if line_num< len(f.NewContents()):
190 next_line= f.NewContents()[line_num]
191if any(xin next_linefor xin wrong_patterns):
192 errors.append('%s:%s'%(f.LocalPath(), line_num))
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]193
194ifnot errors:
195return[]
196
197 plural_suffix=''if len(errors)==1else's'
198 warning_message='\n'.join([
199'Found possible improvement in unittest. Prefer using'
200' EXPECT_NSEQ() or EXPECT_NSNE() when possible.'
201'\n\nAffected file%(plural)s:'%{
202'plural': plural_suffix,
203}
204]+ errors)+'\n'
205
206return[output_api.PresubmitPromptWarning(warning_message)]
207
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]208def_IsInIosPackage(input_api, path):
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]209""" Returns True if path is within ios package"""
210 ios_package_regex= input_api.re.compile(IOS_PACKAGE_PATTERN)
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]211
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]212return ios_package_regex.search(path)
213
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]214
215def_HasIncludeDirective(input_api, line):
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]216""" Returns True if #include is found in the line"""
217 include_regex= input_api.re.compile(INCLUDE_PATTERN)
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]218
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]219return include_regex.search(line)
220
Petro Akzhygitovdb9b351622022-07-01 08:21:50[diff] [blame]221
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]222def_HasToDoWithNoBug(input_api, line):
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]223""" Returns True if TODO is not identified by a bug number."""
224 todo_regex= input_api.re.compile(TODO_PATTERN)
Tomasz Jurkiewicz55a0aa182023-03-01 18:53:46[diff] [blame]225 bug_regex= input_api.re.compile(BUG_PATTERN)
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]226
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]227 todo_match= todo_regex.search(line)
228ifnot todo_match:
229returnFalse
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]230
Tomasz Jurkiewicz55a0aa182023-03-01 18:53:46[diff] [blame]231returnnot bug_regex.match(todo_match.group(1))
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]232
Mark Cogancc4c1ea2024-03-07 09:31:29[diff] [blame]233def_HasToDoWithDeprecatedBug(input_api, line):
234""" Returns True if TODO is identified by a deprecated bug number format."""
235 todo_regex= input_api.re.compile(TODO_PATTERN)
236 deprecated_bug_regex= input_api.re.compile(DEPRECATED_BUG_PATTERN)
237
238 todo_match= todo_regex.search(line)
239ifnot todo_match:
240returnFalse
241return deprecated_bug_regex.match(todo_match.group(1))
242
Louis Romeroe33c2da2023-01-19 14:18:53[diff] [blame]243def_CheckHasNoBoxedBOOL(input_api, output_api):
244""" Checks that there are no @(YES) or @(NO)."""
245 boxed_BOOL_regex= input_api.re.compile(BOXED_BOOL_PATTERN)
246
247 errors=[]
248for fin input_api.AffectedFiles():
249for line_num, linein f.ChangedContents():
250if boxed_BOOL_regex.search(line):
251 errors.append('%s:%s'%(f.LocalPath(), line_num))
252ifnot errors:
253return[]
254
255 plural_suffix=''if len(errors)==1else's'
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]256 warning_message=('Found boxed BOOL%(plural)s. '
Louis Romeroe33c2da2023-01-19 14:18:53[diff] [blame]257'Prefer @YES or @NO in ios code:'%{
258'plural': plural_suffix
259})
260
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]261return[output_api.PresubmitPromptWarning(warning_message, items=errors)]
Nohemi Fernandeza3833372020-03-23 17:22:19[diff] [blame]262
Justin Cohen5f8ac412024-10-15 15:09:19[diff] [blame]263def_CheckNoTearDownEGTest(input_api, output_api):
264""" Checks that `- (void)tearDown {` is not present in an egtest.mm"""
265 errors=[]
266for fin input_api.AffectedFiles():
267ifnot'_egtest.'in f.LocalPath():
Gauthier Ambard304538e2025-01-07 14:07:05[diff] [blame]268continue
Justin Cohen5f8ac412024-10-15 15:09:19[diff] [blame]269for line_num, linein f.ChangedContents():
270if line.startswith("- (void)tearDown {"):
271 errors.append('%s:%s'%(f.LocalPath(), line_num))
272
273ifnot errors:
274return[]
275 warning_message='\n'.join([
276'To support hermetic EarlGrey test cases, tearDown has been renamed '
277'to tearDownHelper, and will soon be removed. If tearDown is really '
278'necessary for this test, please use addTeardownBlock'
279]+ errors)+'\n'
280
281return[output_api.PresubmitError(warning_message)]
282
Gauthier Ambard3803d8f2025-01-07 19:36:07[diff] [blame]283
284def_IsAlphabeticallySortedXML(file):
285"""Check that the `file` is alphabetically sorted"""
286 parser=ElementTree.XMLParser(target=ElementTree.TreeBuilder(
287 insert_comments=True))
dpapadc885f142025-02-21 23:05:50[diff] [blame]288with open(file,'r', encoding='utf8')as xml_file:
Gauthier Ambard3803d8f2025-01-07 19:36:07[diff] [blame]289 tree=ElementTree.parse(xml_file, parser)
290 root= tree.getroot()
291
292 original_tree_string=ElementTree.tostring(root, encoding='utf8')
293
294 messages_element= tree.findall('.//messages')[0]
295 messages= messages_element.findall('message')
296 messages.sort(key=lambda message: message.attrib["name"])
297for messagein messages:
298 messages_element.remove(message)
299for messagein messages:
300 messages_element.append(message)
301 ordered_tree_string=ElementTree.tostring(root, encoding='utf8')
302return ordered_tree_string== original_tree_string
303
304
305def_CheckOrderedStringFile(input_api, output_api):
306""" Checks that the string files are alphabetically ordered"""
307 errors=[]
Gauthier Ambard7a243cc2025-03-18 13:45:30[diff] [blame]308for fin input_api.AffectedFiles(include_deletes=False):
Gauthier Ambard3803d8f2025-01-07 19:36:07[diff] [blame]309ifnot f.LocalPath().endswith("_strings.grd"):
310continue
311ifnot_IsAlphabeticallySortedXML(f.AbsoluteLocalPath()):
312 errors.append(' python3 ios/tools/order_string_file.py '+
313 f.LocalPath())
314
315ifnot errors:
316return[]
317 warning_message='\n'.join(
318['Files not alphabetically sorted, try running:']+ errors)+'\n'
319
320return[output_api.PresubmitPromptWarning(warning_message)]
321
322
Federica Germinario2ce51a82025-01-27 14:44:10[diff] [blame]323def_CheckNotUsingNSUserDefaults(input_api, output_api):
324""" Checks the added code to limit new usage of NSUserDefaults """
325 user_defaults_regex= input_api.re.compile(USER_DEFAULTS_PATTERN)
326
327 errors=[]
328for fin input_api.AffectedFiles():
329if(not f.LocalPath().endswith('.mm')):
330continue
331for line_num, linein f.ChangedContents():
332if user_defaults_regex.search(line):
333 errors.append('%s:%s'%(f.LocalPath(), line_num))
334
335ifnot errors:
336return[]
337 warning_message='\n'.join([
338'A new use of NSUserDefaults was added. If this is a newly added key '
339'consider storing it to PrefService instead.'
340]+ errors)+'\n'
341
342return[output_api.PresubmitPromptWarning(warning_message)]
343
344
Benjamin Williams715f0232025-02-20 12:44:09[diff] [blame]345def_CheckNewColorIntroduction(input_api, output_api):
346"""Checks for new or modified colorset files.
347
348 Ensures colors are properly added to the shared directory.
349 """
350 results=[]
351
352 affected_files=[
353 ffor fin input_api.AffectedFiles()
354if f.LocalPath().endswith(COLOR_FILE_PATTERN)
355]
356
357 warnings={
358'shared_added':[],
359'shared_modified':[],
360'other_modified':[]
361}
362 errors=[]
363
364for affected_filein affected_files:
365 action= affected_file.Action()
366 local_path= affected_file.LocalPath()
367 file_path_error='%s'%(affected_file.LocalPath())
368
369if COLOR_SHARED_DIRin local_path:
370if action=='A':
371 warnings['shared_added'].append(file_path_error)
372elif action=='M':
373 warnings['shared_modified'].append(file_path_error)
374else:
375if action=='A':
376 errors.append(file_path_error)
377elif action=='M':
378 warnings['other_modified'].append(file_path_error)
379
380 output=[]
381
382if errors:
383 error_message=('New color(s) must be added to the %s directory.'%
384 COLOR_SHARED_DIR)
385 output.append(
386 output_api.PresubmitError(
387FormatMessageWithFiles(error_message, errors)))
388
389 warning_message=('Please ensure the color does not already exist in the '
390'shared %s directory.'% COLOR_SHARED_DIR)
391
392if warnings['shared_added']:
393 shared_added_message=('New color(s) added in %s. %s'%
394(COLOR_SHARED_DIR, warning_message))
395 output.append(
396 output_api.PresubmitPromptWarning(
397FormatMessageWithFiles(shared_added_message,
398 warnings['shared_added'])))
399
400if warnings['shared_modified']:
401 shared_modified_message=('Color(s) modified in %s. %s'%
402(COLOR_SHARED_DIR, warning_message))
403 output.append(
404 output_api.PresubmitPromptWarning(
405FormatMessageWithFiles(shared_modified_message,
406 warnings['shared_modified'])))
407
408if warnings['other_modified']:
409 modified_message=('Color(s) modified. %s'% warning_message)
410 output.append(
411 output_api.PresubmitPromptWarning(
412FormatMessageWithFiles(modified_message,
413 warnings['other_modified'])))
414
415return output
416
dpapad5c828832025-02-25 19:47:12[diff] [blame]417def_CheckStyleESLint(input_api, output_api):
418 results=[]
419
420try:
421import sys
422 old_sys_path= sys.path[:]
423 cwd= input_api.PresubmitLocalPath()
424 sys.path+=[input_api.os_path.join(cwd,'..','tools')]
425from web_dev_styleimport presubmit_support
426 results+= presubmit_support.CheckStyleESLint(input_api, output_api)
427finally:
428 sys.path= old_sys_path
429
430return results
431
Federica Germinario94204012025-04-16 18:20:59[diff] [blame]432def_CheckUIGraphicsBeginImageContextWithOptions(input_api, output_api):
433""" Checks that UIGraphicsBeginImageContextWithOptions is not used"""
434 deprecated_regex= input_api.re.compile(
435 r'UIGraphicsBeginImageContextWithOptions\(')
436
437 errors=[]
438for fin input_api.AffectedFiles():
439if(not f.LocalPath().endswith('.mm')):
440continue
441for line_num, linein f.ChangedContents():
442if deprecated_regex.search(line):
443 errors.append('%s:%s'%(f.LocalPath(), line_num))
444
445ifnot errors:
446return[]
447 error_message='\n'.join([
448'UIGraphicsBeginImageContextWithOptions is deprecated, use '
449'UIGraphicsImageRenderer instead.'
450]+ errors)+'\n'
451
452return[output_api.PresubmitError(error_message)]
453
dpapadc885f142025-02-21 23:05:50[diff] [blame]454defCheckChange(input_api, output_api):
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]455 results=[]
456 results.extend(_CheckBugInToDo(input_api, output_api))
457 results.extend(_CheckNullabilityAnnotations(input_api, output_api))
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]458 results.extend(_CheckHasNoIncludeDirectives(input_api, output_api))
Gauthier Ambardf85c5f12022-09-14 11:26:54[diff] [blame]459 results.extend(_CheckHasNoPipeInComment(input_api, output_api))
Louis Romeroe33c2da2023-01-19 14:18:53[diff] [blame]460 results.extend(_CheckHasNoBoxedBOOL(input_api, output_api))
Justin Cohen5f8ac412024-10-15 15:09:19[diff] [blame]461 results.extend(_CheckNoTearDownEGTest(input_api, output_api))
Federica Germinario6aeebd42024-09-17 11:59:15[diff] [blame]462 results.extend(_CheckCanImproveTestUsingExpectNSEQ(input_api, output_api))
Gauthier Ambard3803d8f2025-01-07 19:36:07[diff] [blame]463 results.extend(_CheckOrderedStringFile(input_api, output_api))
Federica Germinario2ce51a82025-01-27 14:44:10[diff] [blame]464 results.extend(_CheckNotUsingNSUserDefaults(input_api, output_api))
Benjamin Williams715f0232025-02-20 12:44:09[diff] [blame]465 results.extend(_CheckNewColorIntroduction(input_api, output_api))
dpapad5c828832025-02-25 19:47:12[diff] [blame]466 results.extend(_CheckStyleESLint(input_api, output_api))
Federica Germinario94204012025-04-16 18:20:59[diff] [blame]467 results.extend(
468_CheckUIGraphicsBeginImageContextWithOptions(input_api, output_api))
Gauthier Ambard1981d622022-09-13 09:34:49[diff] [blame]469return results
dpapadc885f142025-02-21 23:05:50[diff] [blame]470
471defCheckChangeOnUpload(input_api, output_api):
472returnCheckChange(input_api, output_api)
473
474defCheckChangeOnCommit(input_api, output_api):
475returnCheckChange(input_api, output_api)

[8]ページ先頭

©2009-2025 Movatter.jp