Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /cc /PRESUBMIT.py
blob: d064d9c782b89b53ce5574fb67662a7b646ed26f [file] [log] [blame]
Avi Drissman3f7a9d82022-09-08 20:55:42[diff] [blame]1# Copyright 2012 The Chromium Authors
danakj@chromium.org69085bc52012-10-15 16:41:58[diff] [blame]2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Top-level presubmit script for cc.
6
danakj@chromium.org94be7f702014-02-03 19:06:45[diff] [blame]7See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
8for more details about the presubmit API built into depot_tools.
danakj@chromium.org69085bc52012-10-15 16:41:58[diff] [blame]9"""
10
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]11import re
12
Tiago Vignatti91108182023-02-16 16:18:38[diff] [blame]13PRESUBMIT_VERSION='2.0.0'
14
tfarina26ef0f02015-02-02 14:50:25[diff] [blame]15CC_SOURCE_FILES=(r'^cc[\\/].*\.(cc|h)$',)
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]16
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]17def_CheckChangeLintsClean(input_api, output_api):
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]18 allowlist= CC_SOURCE_FILES
19 denylist=None
20 source_filter=lambda x: input_api.FilterSourceFile(x, allowlist, denylist)
enne@chromium.orgcf824592013-04-09 05:46:00[diff] [blame]21
tfarina2d649012015-02-26 12:58:26[diff] [blame]22return input_api.canned_checks.CheckChangeLintsClean(
23 input_api, output_api, source_filter, lint_filters=[], verbose_level=1)
enne@chromium.orgcf824592013-04-09 05:46:00[diff] [blame]24
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]25def_CheckAsserts(input_api, output_api, allowlist=CC_SOURCE_FILES,
Josip Sokcevic8b6cc432020-08-05 17:45:33[diff] [blame]26 denylist=None):
Sadrul Habib Chowdhuryc1f75b22020-07-25 13:27:25[diff] [blame]27 denylist= tuple(denylistor input_api.DEFAULT_FILES_TO_SKIP)
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]28 source_file_filter=lambda x: input_api.FilterSourceFile(x, allowlist,
29 denylist)
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]30
31 assert_files=[]
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]32
33for fin input_api.AffectedSourceFiles(source_file_filter):
34 contents= input_api.ReadFile(f,'rb')
35# WebKit ASSERT() is not allowed.
enne@chromium.orgf4a4b0e2012-10-22 22:01:37[diff] [blame]36if re.search(r"\bASSERT\(", contents):
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]37 assert_files.append(f.LocalPath())
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]38
39if assert_files:
40return[output_api.PresubmitError(
41'These files use ASSERT instead of using DCHECK:',
42 items=assert_files)]
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]43return[]
44
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]45def_CheckStdAbs(input_api, output_api,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]46 allowlist=CC_SOURCE_FILES, denylist=None):
Sadrul Habib Chowdhuryc1f75b22020-07-25 13:27:25[diff] [blame]47 denylist= tuple(denylistor input_api.DEFAULT_FILES_TO_SKIP)
shawnsingh@google.com81d205442013-07-29 21:42:03[diff] [blame]48 source_file_filter=lambda x: input_api.FilterSourceFile(x,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]49 allowlist,
50 denylist)
shawnsingh@google.com81d205442013-07-29 21:42:03[diff] [blame]51
52 using_std_abs_files=[]
53 found_fabs_files=[]
54 missing_std_prefix_files=[]
55
56for fin input_api.AffectedSourceFiles(source_file_filter):
57 contents= input_api.ReadFile(f,'rb')
58if re.search(r"using std::f?abs;", contents):
59 using_std_abs_files.append(f.LocalPath())
60if re.search(r"\bfabsf?\(", contents):
61 found_fabs_files.append(f.LocalPath());
shawnsingh@chromium.orgdbddc7462013-09-06 06:33:31[diff] [blame]62
63 no_std_prefix= r"(?<!std::)"
64# Matches occurrences of abs/absf/fabs/fabsf without a "std::" prefix.
65 abs_without_prefix= r"%s(\babsf?\()"% no_std_prefix
66 fabs_without_prefix= r"%s(\bfabsf?\()"% no_std_prefix
67# Skips matching any lines that have "// NOLINT".
68 no_nolint= r"(?![^\n]*//\s+NOLINT)"
69
70 expression= re.compile("(%s|%s)%s"%
71(abs_without_prefix, fabs_without_prefix, no_nolint))
72if expression.search(contents):
shawnsingh@google.com81d205442013-07-29 21:42:03[diff] [blame]73 missing_std_prefix_files.append(f.LocalPath())
74
75 result=[]
76if using_std_abs_files:
77 result.append(output_api.PresubmitError(
78'These files have "using std::abs" which is not permitted.',
79 items=using_std_abs_files))
80if found_fabs_files:
81 result.append(output_api.PresubmitError(
82'std::abs() should be used instead of std::fabs() for consistency.',
83 items=found_fabs_files))
84if missing_std_prefix_files:
85 result.append(output_api.PresubmitError(
86'These files use abs(), absf(), fabs(), or fabsf() without qualifying '
87'the std namespace. Please use std::abs() in all places.',
88 items=missing_std_prefix_files))
89return result
90
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]91def_CheckPassByValue(input_api,
danakj@chromium.org7add2e0b2013-04-23 05:16:42[diff] [blame]92 output_api,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]93 allowlist=CC_SOURCE_FILES,
94 denylist=None):
Sadrul Habib Chowdhuryc1f75b22020-07-25 13:27:25[diff] [blame]95 denylist= tuple(denylistor input_api.DEFAULT_FILES_TO_SKIP)
danakj@chromium.org7add2e0b2013-04-23 05:16:42[diff] [blame]96 source_file_filter=lambda x: input_api.FilterSourceFile(x,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]97 allowlist,
98 denylist)
danakj@chromium.org7add2e0b2013-04-23 05:16:42[diff] [blame]99
100 local_errors=[]
101
kylechare68cc4a2017-04-05 18:01:05[diff] [blame]102# Well-defined simple classes the same size as a primitive type.
danakj@chromium.org7add2e0b2013-04-23 05:16:42[diff] [blame]103 pass_by_value_types=['base::Time',
104'base::TimeTicks',
danakj@chromium.org7add2e0b2013-04-23 05:16:42[diff] [blame]105]
106
107for fin input_api.AffectedSourceFiles(source_file_filter):
108 contents= input_api.ReadFile(f,'rb')
Fabrice de Gansbeaed632021-06-23 17:21:04[diff] [blame]109 sep='|'
danakj@chromium.org7add2e0b2013-04-23 05:16:42[diff] [blame]110 match= re.search(
Fabrice de Gansbeaed632021-06-23 17:21:04[diff] [blame]111 r'\bconst +'+'(?P<type>(%s))&'% sep.join(pass_by_value_types),
danakj@chromium.org7add2e0b2013-04-23 05:16:42[diff] [blame]112 contents)
113if match:
114 local_errors.append(output_api.PresubmitError(
115'%s passes %s by const ref instead of by value.'%
116(f.LocalPath(), match.group('type'))))
117return local_errors
enne@chromium.orgd936f902013-01-06 05:08:07[diff] [blame]118
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]119def_CheckTodos(input_api, output_api):
enne@chromium.org6dc0b6f2013-06-26 20:21:59[diff] [blame]120 errors=[]
121
122 source_file_filter=lambda x: x
123for fin input_api.AffectedSourceFiles(source_file_filter):
124 contents= input_api.ReadFile(f,'rb')
enne@chromium.org932aff42013-06-27 12:59:27[diff] [blame]125if('FIX'+'ME')in contents:
enne@chromium.org6dc0b6f2013-06-26 20:21:59[diff] [blame]126 errors.append(f.LocalPath())
127
128if errors:
129return[output_api.PresubmitError(
kylechare68cc4a2017-04-05 18:01:05[diff] [blame]130'All TODO comments should be of the form TODO(name/bug). '+
weiliangc941dbec2014-08-28 18:56:16[diff] [blame]131'Use TODO instead of FIX'+'ME',
enne@chromium.org6dc0b6f2013-06-26 20:21:59[diff] [blame]132 items=errors)]
133return[]
134
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]135def_CheckDoubleAngles(input_api, output_api, allowlist=CC_SOURCE_FILES,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]136 denylist=None):
danakj6496cba2014-10-16 01:31:08[diff] [blame]137 errors=[]
138
139 source_file_filter=lambda x: input_api.FilterSourceFile(x,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]140 allowlist,
141 denylist)
danakj6496cba2014-10-16 01:31:08[diff] [blame]142for fin input_api.AffectedSourceFiles(source_file_filter):
143 contents= input_api.ReadFile(f,'rb')
144if('> >')in contents:
145 errors.append(f.LocalPath())
146
147if errors:
148return[output_api.PresubmitError('Use >> instead of > >:', items=errors)]
149return[]
150
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]151def_FindUnquotedQuote(contents, pos):
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]152 match= re.search(r"(?<!\\)(?P<quote>\")", contents[pos:])
153return-1ifnot matchelse match.start("quote")+ pos
154
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]155def_FindUselessIfdefs(input_api, output_api):
enne@chromium.org3f52c8932014-06-13 08:46:38[diff] [blame]156 errors=[]
157 source_file_filter=lambda x: x
158for fin input_api.AffectedSourceFiles(source_file_filter):
159 contents= input_api.ReadFile(f,'rb')
160if re.search(r'#if\s*0\s', contents):
161 errors.append(f.LocalPath())
162if errors:
163return[output_api.PresubmitError(
164'Don\'t use #if '+'0; just delete the code.',
165 items=errors)]
166return[]
167
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]168def_FindNamespaceInBlock(pos, namespace, contents, allowlist=[]):
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]169 open_brace=-1
170 close_brace=-1
171 quote=-1
172 name=-1
173 brace_count=1
174 quote_count=0
175while pos< len(contents)and brace_count>0:
176if open_brace< pos: open_brace= contents.find("{", pos)
177if close_brace< pos: close_brace= contents.find("}", pos)
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]178if quote< pos: quote=_FindUnquotedQuote(contents, pos)
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]179if name< pos: name= contents.find(("%s::"% namespace), pos)
180
181if name<0:
182returnFalse# The namespace is not used at all.
183if open_brace<0:
184 open_brace= len(contents)
185if close_brace<0:
186 close_brace= len(contents)
187if quote<0:
188 quote= len(contents)
189
190 next= min(open_brace, min(close_brace, min(quote, name)))
191
192if next== open_brace:
193 brace_count+=1
194elif next== close_brace:
195 brace_count-=1
196elif next== quote:
197 quote_count=0if quote_countelse1
198elif next== nameandnot quote_count:
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]199 in_allowlist=False
200for win allowlist:
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]201if re.match(w, contents[next:]):
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]202 in_allowlist=True
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]203break
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]204ifnot in_allowlist:
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]205returnTrue
206 pos= next+1
207returnFalse
208
209# Checks for the use of cc:: within the cc namespace, which is usually
210# redundant.
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]211def_CheckNamespace(input_api, output_api):
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]212 errors=[]
213
214 source_file_filter=lambda x: x
215for fin input_api.AffectedSourceFiles(source_file_filter):
216 contents= input_api.ReadFile(f,'rb')
217 match= re.search(r'namespace\s*cc\s*{', contents)
218if match:
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]219 allowlist=[]
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]220if_FindNamespaceInBlock(match.end(),
221'cc',
222 contents,
223 allowlist=allowlist):
danakj@chromium.orge51444a2013-12-10 23:05:01[diff] [blame]224 errors.append(f.LocalPath())
225
226if errors:
227return[output_api.PresubmitError(
228'Do not use cc:: inside of the cc namespace.',
229 items=errors)]
230return[]
231
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]232def_CheckForUseOfWrongClock(input_api,
mithro@mithis.comd2f1d582014-05-01 08:43:53[diff] [blame]233 output_api,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]234 allowlist=CC_SOURCE_FILES,
235 denylist=None):
mithro@mithis.comd2f1d582014-05-01 08:43:53[diff] [blame]236"""Make sure new lines of code don't use a clock susceptible to skew."""
Sadrul Habib Chowdhuryc1f75b22020-07-25 13:27:25[diff] [blame]237 denylist= tuple(denylistor input_api.DEFAULT_FILES_TO_SKIP)
mithro@mithis.comd2f1d582014-05-01 08:43:53[diff] [blame]238 source_file_filter=lambda x: input_api.FilterSourceFile(x,
Sadrul Habib Chowdhury8eb63d1f2020-07-02 22:27:11[diff] [blame]239 allowlist,
240 denylist)
mithro@mithis.comd2f1d582014-05-01 08:43:53[diff] [blame]241# Regular expression that should detect any explicit references to the
242# base::Time type (or base::Clock/DefaultClock), whether in using decls,
243# typedefs, or to call static methods.
244 base_time_type_pattern= r'(^|\W)base::(Time|Clock|DefaultClock)(\W|$)'
245
246# Regular expression that should detect references to the base::Time class
247# members, such as a call to base::Time::Now.
248 base_time_member_pattern= r'(^|\W)(Time|Clock|DefaultClock)::'
249
250# Regular expression to detect "using base::Time" declarations. We want to
251# prevent these from triggerring a warning. For example, it's perfectly
252# reasonable for code to be written like this:
253#
254# using base::Time;
255# ...
256# int64 foo_us = foo_s * Time::kMicrosecondsPerSecond;
257 using_base_time_decl_pattern= r'^\s*using\s+(::)?base::Time\s*;'
258
259# Regular expression to detect references to the kXXX constants in the
260# base::Time class. We want to prevent these from triggerring a warning.
261 base_time_konstant_pattern= r'(^|\W)Time::k\w+'
262
263 problem_re= input_api.re.compile(
264 r'('+ base_time_type_pattern+ r')|('+ base_time_member_pattern+ r')')
265 exception_re= input_api.re.compile(
266 r'('+ using_base_time_decl_pattern+ r')|('+
267 base_time_konstant_pattern+ r')')
268 problems=[]
269for fin input_api.AffectedSourceFiles(source_file_filter):
270for line_number, linein f.ChangedContents():
271if problem_re.search(line):
272ifnot exception_re.search(line):
273 problems.append(
274' %s:%d\n %s'%(f.LocalPath(), line_number, line.strip()))
275
276if problems:
277return[output_api.PresubmitPromptOrNotify(
278'You added one or more references to the base::Time class and/or one\n'
279'of its member functions (or base::Clock/DefaultClock). In cc code,\n'
280'it is most certainly incorrect! Instead use base::TimeTicks.\n\n'
281'\n'.join(problems))]
282else:
283return[]
enne@chromium.org6dc0b6f2013-06-26 20:21:59[diff] [blame]284
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]285defCheckChangeOnUpload(input_api, output_api):
286 results=[]
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]287 results+=_CheckAsserts(input_api, output_api)
288 results+=_CheckStdAbs(input_api, output_api)
289 results+=_CheckPassByValue(input_api, output_api)
290 results+=_CheckChangeLintsClean(input_api, output_api)
Tiago Vignatti6b6659a2023-02-20 19:53:06[diff] [blame]291 results+=_CheckTodos(input_api, output_api)
292 results+=_CheckDoubleAngles(input_api, output_api)
293 results+=_CheckNamespace(input_api, output_api)
294 results+=_CheckForUseOfWrongClock(input_api, output_api)
295 results+=_FindUselessIfdefs(input_api, output_api)
danakj@chromium.org1d993172012-10-18 18:15:04[diff] [blame]296return results

[8]ページ先頭

©2009-2025 Movatter.jp