blob: 375978d122d8a62c2441930b0961775f84d9414f [file] [log] [blame]
[email protected]a18130a2012-01-03 17:52:081# Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]ca8d19842009-02-19 16:33:122# 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 Chromium.
6
[email protected]f1293792009-07-31 18:09:567See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
[email protected]50d7d721e2009-11-15 17:56:188for more details about the presubmit API built into gcl.
[email protected]ca8d19842009-02-19 16:33:129"""
10
[email protected]eea609a2011-11-18 13:10:1211
[email protected]9d16ad12011-12-14 20:49:4712import re
13
14
[email protected]379e7dd2010-01-28 17:39:2115_EXCLUDED_PATHS = (
[email protected]3e4eb112011-01-18 03:29:5416 r"^breakpad[\\\/].*",
[email protected]a18130a2012-01-03 17:52:0817 r"^native_client_sdk[\\\/].*",
18 r"^net[\\\/]tools[\\\/]spdyshark[\\\/].*",
[email protected]3e4eb112011-01-18 03:29:5419 r"^skia[\\\/].*",
20 r"^v8[\\\/].*",
21 r".*MakeFile$",
[email protected]1084ccc2012-03-14 03:22:5322 r".+_autogen\.h$",
[email protected]4306417642009-06-11 00:33:4023)
[email protected]ca8d19842009-02-19 16:33:1224
[email protected]ca8d19842009-02-19 16:33:1225
[email protected]eea609a2011-11-18 13:10:1226_TEST_ONLY_WARNING = (
27 'You might be calling functions intended only for testing from\n'
28 'production code. It is OK to ignore this warning if you know what\n'
29 'you are doing, as the heuristics used to detect the situation are\n'
30 'not perfect. The commit queue will not block on this warning.\n'
31 'Email [email protected] if you have questions.')
32
33
[email protected]127f18ec2012-06-16 05:05:5934_BANNED_OBJC_FUNCTIONS = (
35 (
36 'addTrackingRect:',
37 ('The use of -[NSView addTrackingRect:owner:userData:assumeInside:] is'
38 'prohibited. Please use CrTrackingArea instead.',
39 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
40 ),
41 False,
42 ),
43 (
44 'NSTrackingArea',
45 ('The use of NSTrackingAreas is prohibited. Please use CrTrackingArea',
46 'instead.',
47 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
48 ),
49 False,
50 ),
51 (
52 'convertPointFromBase:',
53 ('The use of -[NSView convertPointFromBase:] is almost certainly wrong.',
54 'Please use |convertPoint:(point) fromView:nil| instead.',
55 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
56 ),
57 True,
58 ),
59 (
60 'convertPointToBase:',
61 ('The use of -[NSView convertPointToBase:] is almost certainly wrong.',
62 'Please use |convertPoint:(point) toView:nil| instead.',
63 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
64 ),
65 True,
66 ),
67 (
68 'convertRectFromBase:',
69 ('The use of -[NSView convertRectFromBase:] is almost certainly wrong.',
70 'Please use |convertRect:(point) fromView:nil| instead.',
71 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
72 ),
73 True,
74 ),
75 (
76 'convertRectToBase:',
77 ('The use of -[NSView convertRectToBase:] is almost certainly wrong.',
78 'Please use |convertRect:(point) toView:nil| instead.',
79 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
80 ),
81 True,
82 ),
83 (
84 'convertSizeFromBase:',
85 ('The use of -[NSView convertSizeFromBase:] is almost certainly wrong.',
86 'Please use |convertSize:(point) fromView:nil| instead.',
87 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
88 ),
89 True,
90 ),
91 (
92 'convertSizeToBase:',
93 ('The use of -[NSView convertSizeToBase:] is almost certainly wrong.',
94 'Please use |convertSize:(point) toView:nil| instead.',
95 'http://dev.chromium.org/developers/coding-style/cocoa-dos-and-donts',
96 ),
97 True,
98 ),
99)
100
101
102_BANNED_CPP_FUNCTIONS = (
103)
104
105
[email protected]eea609a2011-11-18 13:10:12106
[email protected]22c9bd72011-03-27 16:47:39107def _CheckNoInterfacesInBase(input_api, output_api):
[email protected]6a4c8e682010-12-19 03:31:34108 """Checks to make sure no files in libbase.a have |@interface|."""
[email protected]839c1392011-04-29 20:15:19109 pattern = input_api.re.compile(r'^\s*@interface', input_api.re.MULTILINE)
[email protected]6a4c8e682010-12-19 03:31:34110 files = []
[email protected]22c9bd72011-03-27 16:47:39111 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
[email protected]a766a1322011-09-08 20:46:05112 if (f.LocalPath().startswith('base/') and
[email protected]0b2f07b02011-05-02 17:29:00113 not f.LocalPath().endswith('_unittest.mm')):
[email protected]6a4c8e682010-12-19 03:31:34114 contents = input_api.ReadFile(f)
115 if pattern.search(contents):
116 files.append(f)
117
118 if len(files):
119 return [ output_api.PresubmitError(
120 'Objective-C interfaces or categories are forbidden in libbase. ' +
121 'See http://groups.google.com/a/chromium.org/group/chromium-dev/' +
122 'browse_thread/thread/efb28c10435987fd',
123 files) ]
124 return []
125
[email protected]650c9082010-12-14 14:33:44126
[email protected]55459852011-08-10 15:17:19127def _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api):
128 """Attempts to prevent use of functions intended only for testing in
129 non-testing code. For now this is just a best-effort implementation
130 that ignores header files and may have some false positives. A
131 better implementation would probably need a proper C++ parser.
132 """
133 # We only scan .cc files and the like, as the declaration of
134 # for-testing functions in header files are hard to distinguish from
135 # calls to such functions without a proper C++ parser.
[email protected]403bfbc92012-06-11 23:30:09136 platform_specifiers = r'(_(android|chromeos|gtk|mac|posix|win))?'
[email protected]55459852011-08-10 15:17:19137 source_extensions = r'\.(cc|cpp|cxx|mm)$'
138 file_inclusion_pattern = r'.+%s' % source_extensions
[email protected]19e77fd2011-10-20 05:24:05139 file_exclusion_patterns = (
[email protected]e21ce382012-01-04 18:48:25140 r'.*[/\\](test_|mock_).+%s' % source_extensions,
[email protected]c762d252012-02-28 02:07:24141 r'.+_test_(base|support|util)%s' % source_extensions,
[email protected]403bfbc92012-06-11 23:30:09142 r'.+_(api|browser|perf|unit|ui)?test%s%s' % (platform_specifiers,
143 source_extensions),
[email protected]19e77fd2011-10-20 05:24:05144 r'.+profile_sync_service_harness%s' % source_extensions,
145 )
146 path_exclusion_patterns = (
147 r'.*[/\\](test|tool(s)?)[/\\].*',
148 # At request of folks maintaining this folder.
149 r'chrome[/\\]browser[/\\]automation[/\\].*',
150 )
[email protected]55459852011-08-10 15:17:19151
152 base_function_pattern = r'ForTest(ing)?|for_test(ing)?'
153 inclusion_pattern = input_api.re.compile(r'(%s)\s*\(' % base_function_pattern)
154 exclusion_pattern = input_api.re.compile(
155 r'::[A-Za-z0-9_]+(%s)|(%s)[^;]+\{' % (
156 base_function_pattern, base_function_pattern))
157
158 def FilterFile(affected_file):
[email protected]19e77fd2011-10-20 05:24:05159 black_list = (file_exclusion_patterns + path_exclusion_patterns +
[email protected]3afb12a42011-08-15 13:48:33160 _EXCLUDED_PATHS + input_api.DEFAULT_BLACK_LIST)
[email protected]55459852011-08-10 15:17:19161 return input_api.FilterSourceFile(
162 affected_file,
163 white_list=(file_inclusion_pattern, ),
164 black_list=black_list)
165
166 problems = []
167 for f in input_api.AffectedSourceFiles(FilterFile):
168 local_path = f.LocalPath()
169 lines = input_api.ReadFile(f).splitlines()
170 line_number = 0
171 for line in lines:
172 if (inclusion_pattern.search(line) and
173 not exclusion_pattern.search(line)):
174 problems.append(
175 '%s:%d\n %s' % (local_path, line_number, line.strip()))
176 line_number += 1
177
178 if problems:
[email protected]eea609a2011-11-18 13:10:12179 if not input_api.is_committing:
180 return [output_api.PresubmitPromptWarning(_TEST_ONLY_WARNING, problems)]
181 else:
182 # We don't warn on commit, to avoid stopping commits going through CQ.
183 return [output_api.PresubmitNotifyResult(_TEST_ONLY_WARNING, problems)]
[email protected]55459852011-08-10 15:17:19184 else:
185 return []
186
187
[email protected]10689ca2011-09-02 02:31:54188def _CheckNoIOStreamInHeaders(input_api, output_api):
189 """Checks to make sure no .h files include <iostream>."""
190 files = []
191 pattern = input_api.re.compile(r'^#include\s*<iostream>',
192 input_api.re.MULTILINE)
193 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
194 if not f.LocalPath().endswith('.h'):
195 continue
196 contents = input_api.ReadFile(f)
197 if pattern.search(contents):
198 files.append(f)
199
200 if len(files):
201 return [ output_api.PresubmitError(
202 'Do not #include <iostream> in header files, since it inserts static ' +
203 'initialization into every file including the header. Instead, ' +
204 '#include <ostream>. See http://crbug.com/94794',
205 files) ]
206 return []
207
208
[email protected]8ea5d4b2011-09-13 21:49:22209def _CheckNoNewWStrings(input_api, output_api):
210 """Checks to make sure we don't introduce use of wstrings."""
[email protected]55463aa62011-10-12 00:48:27211 problems = []
[email protected]8ea5d4b2011-09-13 21:49:22212 for f in input_api.AffectedFiles():
[email protected]b5c24292011-11-28 14:38:20213 if (not f.LocalPath().endswith(('.cc', '.h')) or
214 f.LocalPath().endswith('test.cc')):
215 continue
[email protected]8ea5d4b2011-09-13 21:49:22216
[email protected]b5c24292011-11-28 14:38:20217 for line_num, line in f.ChangedContents():
[email protected]8ea5d4b2011-09-13 21:49:22218 if 'wstring' in line:
[email protected]55463aa62011-10-12 00:48:27219 problems.append(' %s:%d' % (f.LocalPath(), line_num))
[email protected]8ea5d4b2011-09-13 21:49:22220
[email protected]55463aa62011-10-12 00:48:27221 if not problems:
222 return []
223 return [output_api.PresubmitPromptWarning('New code should not use wstrings.'
224 ' If you are calling an API that accepts a wstring, fix the API.\n' +
225 '\n'.join(problems))]
[email protected]8ea5d4b2011-09-13 21:49:22226
227
[email protected]2a8ac9c2011-10-19 17:20:44228def _CheckNoDEPSGIT(input_api, output_api):
229 """Make sure .DEPS.git is never modified manually."""
230 if any(f.LocalPath().endswith('.DEPS.git') for f in
231 input_api.AffectedFiles()):
232 return [output_api.PresubmitError(
233 'Never commit changes to .DEPS.git. This file is maintained by an\n'
234 'automated system based on what\'s in DEPS and your changes will be\n'
235 'overwritten.\n'
236 'See http://code.google.com/p/chromium/wiki/UsingNewGit#Rolling_DEPS\n'
237 'for more information')]
238 return []
239
240
[email protected]b5c24292011-11-28 14:38:20241def _CheckNoFRIEND_TEST(input_api, output_api):
242 """Make sure that gtest's FRIEND_TEST() macro is not used, the
243 FRIEND_TEST_ALL_PREFIXES() macro from base/gtest_prod_util.h should be used
244 instead since that allows for FLAKY_, FAILS_ and DISABLED_ prefixes."""
245 problems = []
246
247 file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
248 for f in input_api.AffectedFiles(file_filter=file_filter):
249 for line_num, line in f.ChangedContents():
250 if 'FRIEND_TEST(' in line:
251 problems.append(' %s:%d' % (f.LocalPath(), line_num))
252
253 if not problems:
254 return []
255 return [output_api.PresubmitPromptWarning('Chromium code should not use '
[email protected]24a4ac62011-11-29 15:30:33256 'gtest\'s FRIEND_TEST() macro. Include base/gtest_prod_util.h and use '
[email protected]b5c24292011-11-28 14:38:20257 'FRIEND_TEST_ALL_PREFIXES() instead.\n' + '\n'.join(problems))]
258
259
[email protected]7bbc7d12012-03-22 21:44:41260def _CheckNoScopedAllowIO(input_api, output_api):
261 """Make sure that ScopedAllowIO is not used."""
262 problems = []
263
264 file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
265 for f in input_api.AffectedFiles(file_filter=file_filter):
266 for line_num, line in f.ChangedContents():
267 if 'ScopedAllowIO' in line:
268 problems.append(' %s:%d' % (f.LocalPath(), line_num))
269
270 if not problems:
271 return []
272 return [output_api.PresubmitPromptWarning('New code should not use '
273 'ScopedAllowIO. Post a task to the blocking pool or the FILE thread '
274 'instead.\n' + '\n'.join(problems))]
275
276
[email protected]10e38b62012-06-04 14:21:27277def _CheckNoFilePathWatcherDelegate(input_api, output_api):
278 """Make sure that FilePathWatcher::Delegate is not used."""
279 problems = []
280
281 file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
282 for f in input_api.AffectedFiles(file_filter=file_filter):
283 for line_num, line in f.ChangedContents():
284 if 'FilePathWatcher::Delegate' in line:
285 problems.append(' %s:%d' % (f.LocalPath(), line_num))
286
287 if not problems:
288 return []
289 return [output_api.PresubmitPromptWarning('New code should not use '
290 'FilePathWatcher::Delegate. Use the callback interface instead.\n' +
291 '\n'.join(problems))]
292
293
[email protected]127f18ec2012-06-16 05:05:59294def _CheckNoBannedFunctions(input_api, output_api):
295 """Make sure that banned functions are not used."""
296 warnings = []
297 errors = []
298
299 file_filter = lambda f: f.LocalPath().endswith(('.mm', '.m', '.h'))
300 for f in input_api.AffectedFiles(file_filter=file_filter):
301 for line_num, line in f.ChangedContents():
302 for func_name, message, error in _BANNED_OBJC_FUNCTIONS:
303 if func_name in line:
304 problems = warnings;
305 if error:
306 problems = errors;
307 problems.append(' %s:%d:' % (f.LocalPath(), line_num))
308 for message_line in message:
309 problems.append(' %s' % message_line)
310
311 file_filter = lambda f: f.LocalPath().endswith(('.cc', '.mm', '.h'))
312 for f in input_api.AffectedFiles(file_filter=file_filter):
313 for line_num, line in f.ChangedContents():
314 for func_name, message, error in _BANNED_CPP_FUNCTIONS:
315 if func_name in line:
316 problems = warnings;
317 if error:
318 problems = errors;
319 problems.append(' %s:%d:' % (f.LocalPath(), line_num))
320 for message_line in message:
321 problems.append(' %s' % message_line)
322
323 result = []
324 if (warnings):
325 result.append(output_api.PresubmitPromptWarning(
326 'Banned functions were used.\n' + '\n'.join(warnings)))
327 if (errors):
328 result.append(output_api.PresubmitError(
329 'Banned functions were used.\n' + '\n'.join(errors)))
330 return result
331
332
333
[email protected]22c9bd72011-03-27 16:47:39334def _CommonChecks(input_api, output_api):
335 """Checks common to both upload and commit."""
336 results = []
337 results.extend(input_api.canned_checks.PanProjectChecks(
338 input_api, output_api, excluded_paths=_EXCLUDED_PATHS))
339 results.extend(_CheckNoInterfacesInBase(input_api, output_api))
[email protected]66daa702011-05-28 14:41:46340 results.extend(_CheckAuthorizedAuthor(input_api, output_api))
[email protected]55459852011-08-10 15:17:19341 results.extend(
342 _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api))
[email protected]10689ca2011-09-02 02:31:54343 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api))
[email protected]8ea5d4b2011-09-13 21:49:22344 results.extend(_CheckNoNewWStrings(input_api, output_api))
[email protected]2a8ac9c2011-10-19 17:20:44345 results.extend(_CheckNoDEPSGIT(input_api, output_api))
[email protected]b5c24292011-11-28 14:38:20346 results.extend(_CheckNoFRIEND_TEST(input_api, output_api))
[email protected]7bbc7d12012-03-22 21:44:41347 results.extend(_CheckNoScopedAllowIO(input_api, output_api))
[email protected]10e38b62012-06-04 14:21:27348 results.extend(_CheckNoFilePathWatcherDelegate(input_api, output_api))
[email protected]127f18ec2012-06-16 05:05:59349 results.extend(_CheckNoBannedFunctions(input_api, output_api))
[email protected]22c9bd72011-03-27 16:47:39350 return results
[email protected]1f7b4172010-01-28 01:17:34351
[email protected]b337cb5b2011-01-23 21:24:05352
353def _CheckSubversionConfig(input_api, output_api):
354 """Verifies the subversion config file is correctly setup.
355
356 Checks that autoprops are enabled, returns an error otherwise.
357 """
358 join = input_api.os_path.join
359 if input_api.platform == 'win32':
360 appdata = input_api.environ.get('APPDATA', '')
361 if not appdata:
362 return [output_api.PresubmitError('%APPDATA% is not configured.')]
363 path = join(appdata, 'Subversion', 'config')
364 else:
365 home = input_api.environ.get('HOME', '')
366 if not home:
367 return [output_api.PresubmitError('$HOME is not configured.')]
368 path = join(home, '.subversion', 'config')
369
370 error_msg = (
371 'Please look at http://dev.chromium.org/developers/coding-style to\n'
372 'configure your subversion configuration file. This enables automatic\n'
[email protected]c6a3c10b2011-01-24 16:14:20373 'properties to simplify the project maintenance.\n'
374 'Pro-tip: just download and install\n'
375 'http://src.chromium.org/viewvc/chrome/trunk/tools/build/slave/config\n')
[email protected]b337cb5b2011-01-23 21:24:05376
377 try:
378 lines = open(path, 'r').read().splitlines()
379 # Make sure auto-props is enabled and check for 2 Chromium standard
380 # auto-prop.
381 if (not '*.cc = svn:eol-style=LF' in lines or
382 not '*.pdf = svn:mime-type=application/pdf' in lines or
383 not 'enable-auto-props = yes' in lines):
384 return [
[email protected]79ed7e62011-02-21 21:08:53385 output_api.PresubmitNotifyResult(
[email protected]b337cb5b2011-01-23 21:24:05386 'It looks like you have not configured your subversion config '
[email protected]b5359c02011-02-01 20:29:56387 'file or it is not up-to-date.\n' + error_msg)
[email protected]b337cb5b2011-01-23 21:24:05388 ]
389 except (OSError, IOError):
390 return [
[email protected]79ed7e62011-02-21 21:08:53391 output_api.PresubmitNotifyResult(
[email protected]b337cb5b2011-01-23 21:24:05392 'Can\'t find your subversion config file.\n' + error_msg)
393 ]
394 return []
395
396
[email protected]66daa702011-05-28 14:41:46397def _CheckAuthorizedAuthor(input_api, output_api):
398 """For non-googler/chromites committers, verify the author's email address is
399 in AUTHORS.
400 """
[email protected]9bb9cb82011-06-13 20:43:01401 # TODO(maruel): Add it to input_api?
402 import fnmatch
403
[email protected]66daa702011-05-28 14:41:46404 author = input_api.change.author_email
[email protected]9bb9cb82011-06-13 20:43:01405 if not author:
406 input_api.logging.info('No author, skipping AUTHOR check')
[email protected]66daa702011-05-28 14:41:46407 return []
[email protected]c99663292011-05-31 19:46:08408 authors_path = input_api.os_path.join(
[email protected]66daa702011-05-28 14:41:46409 input_api.PresubmitLocalPath(), 'AUTHORS')
410 valid_authors = (
411 input_api.re.match(r'[^#]+\s+\<(.+?)\>\s*$', line)
412 for line in open(authors_path))
[email protected]ac54b132011-06-06 18:11:18413 valid_authors = [item.group(1).lower() for item in valid_authors if item]
[email protected]9bb9cb82011-06-13 20:43:01414 if input_api.verbose:
415 print 'Valid authors are %s' % ', '.join(valid_authors)
[email protected]d8b50be2011-06-15 14:19:44416 if not any(fnmatch.fnmatch(author.lower(), valid) for valid in valid_authors):
[email protected]66daa702011-05-28 14:41:46417 return [output_api.PresubmitPromptWarning(
418 ('%s is not in AUTHORS file. If you are a new contributor, please visit'
419 '\n'
420 'http://www.chromium.org/developers/contributing-code and read the '
421 '"Legal" section\n'
422 'If you are a chromite, verify the contributor signed the CLA.') %
423 author)]
424 return []
425
426
[email protected]1f7b4172010-01-28 01:17:34427def CheckChangeOnUpload(input_api, output_api):
428 results = []
429 results.extend(_CommonChecks(input_api, output_api))
[email protected]fe5f57c52009-06-05 14:25:54430 return results
[email protected]ca8d19842009-02-19 16:33:12431
432
433def CheckChangeOnCommit(input_api, output_api):
[email protected]fe5f57c52009-06-05 14:25:54434 results = []
[email protected]1f7b4172010-01-28 01:17:34435 results.extend(_CommonChecks(input_api, output_api))
[email protected]dd805fe2009-10-01 08:11:51436 # TODO(thestig) temporarily disabled, doesn't work in third_party/
437 #results.extend(input_api.canned_checks.CheckSvnModifiedDirectories(
438 # input_api, output_api, sources))
[email protected]fe5f57c52009-06-05 14:25:54439 # Make sure the tree is 'open'.
[email protected]806e98e2010-03-19 17:49:27440 results.extend(input_api.canned_checks.CheckTreeIsOpen(
[email protected]7f238152009-08-12 19:00:34441 input_api,
442 output_api,
[email protected]4efa42142010-08-26 01:29:26443 json_url='http://chromium-status.appspot.com/current?format=json'))
[email protected]806e98e2010-03-19 17:49:27444 results.extend(input_api.canned_checks.CheckRietveldTryJobExecution(input_api,
[email protected]4ddc5df2011-12-12 03:05:04445 output_api, 'http://codereview.chromium.org',
[email protected]c1ba4c52012-03-09 14:23:28446 ('win_rel', 'linux_rel', 'mac_rel, win:compile'),
447 '[email protected]'))
[email protected]806e98e2010-03-19 17:49:27448
[email protected]3e4eb112011-01-18 03:29:54449 results.extend(input_api.canned_checks.CheckChangeHasBugField(
450 input_api, output_api))
451 results.extend(input_api.canned_checks.CheckChangeHasTestField(
452 input_api, output_api))
[email protected]c4b47562011-12-05 23:39:41453 results.extend(input_api.canned_checks.CheckChangeHasDescription(
454 input_api, output_api))
[email protected]b337cb5b2011-01-23 21:24:05455 results.extend(_CheckSubversionConfig(input_api, output_api))
[email protected]fe5f57c52009-06-05 14:25:54456 return results
[email protected]ca8d19842009-02-19 16:33:12457
458
[email protected]5efb2a822011-09-27 23:06:13459def GetPreferredTrySlaves(project, change):
[email protected]50c30092012-02-15 04:21:36460 affected_files = change.LocalPaths()
461 only_objc_files = all(f.endswith(('.mm', '.m')) for f in affected_files)
[email protected]5efb2a822011-09-27 23:06:13462 if only_objc_files:
[email protected]4ddc5df2011-12-12 03:05:04463 return ['mac_rel']
[email protected]1f2629892012-05-07 19:23:12464 preferred = ['win_rel', 'linux_rel', 'mac_rel', 'linux_clang:compile']
[email protected]9d16ad12011-12-14 20:49:47465 aura_re = '_aura[^/]*[.][^/]*'
[email protected]50c30092012-02-15 04:21:36466 if any(re.search(aura_re, f) for f in affected_files):
[email protected]e9b23882012-02-03 01:05:49467 preferred.append('linux_chromeos')
[email protected]d3b7e7cca2012-03-01 21:25:06468 # Nothing in chrome/
469 android_re_list = ('^base/',
470 '^build/common.gypi$',
471 '^content/',
472 '^ipc/',
473 '^jingle/',
474 '^media/',
475 '^net/',
476 '^sql/')
477 # Nothing that looks like win-only or aura-only
478 win_re = '_win\.(cc|h)$'
479 possibly_android = True
480 for non_android_re in (aura_re, win_re):
481 if all(re.search(non_android_re, f) for f in affected_files):
482 possibly_android = False
483 break
484 if possibly_android:
485 for f in change.AffectedFiles():
486 if any(re.search(r, f.LocalPath()) for r in android_re_list):
487 preferred.append('android')
488 break
[email protected]9d16ad12011-12-14 20:49:47489 return preferred