OLD | NEW |
1 # Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 1 # Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
2 # | 2 # |
3 # Use of this source code is governed by a BSD-style license | 3 # Use of this source code is governed by a BSD-style license |
4 # that can be found in the LICENSE file in the root of the source | 4 # that can be found in the LICENSE file in the root of the source |
5 # tree. An additional intellectual property rights grant can be found | 5 # tree. An additional intellectual property rights grant can be found |
6 # in the file PATENTS. All contributing project authors may | 6 # in the file PATENTS. All contributing project authors may |
7 # be found in the AUTHORS file in the root of the source tree. | 7 # be found in the AUTHORS file in the root of the source tree. |
8 | 8 |
9 import json | 9 import json |
10 import os | 10 import os |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 if pattern.search(contents): | 248 if pattern.search(contents): |
249 violating_files.append(f) | 249 violating_files.append(f) |
250 if violating_files: | 250 if violating_files: |
251 return [output_api.PresubmitError( | 251 return [output_api.PresubmitError( |
252 'Depending on rtc_base is not allowed. Change your dependency to ' | 252 'Depending on rtc_base is not allowed. Change your dependency to ' |
253 'rtc_base_approved and possibly sanitize and move the desired source ' | 253 'rtc_base_approved and possibly sanitize and move the desired source ' |
254 'file(s) to rtc_base_approved.\nChanged GYP files:', | 254 'file(s) to rtc_base_approved.\nChanged GYP files:', |
255 items=violating_files)] | 255 items=violating_files)] |
256 return [] | 256 return [] |
257 | 257 |
| 258 def _CheckNoRtcBaseDepsGn(input_api, gn_files, output_api): |
| 259 pattern = input_api.re.compile(r'base:rtc_base\s*"') |
| 260 violating_files = [] |
| 261 for f in gn_files: |
| 262 gn_exceptions = ( |
| 263 os.path.join('base_tests', 'BUILD.gn'), |
| 264 os.path.join('desktop_capture', 'BUILD.gn'), |
| 265 os.path.join('p2p', 'BUILD.gn'), |
| 266 os.path.join('sdk', 'BUILD.gn'), |
| 267 os.path.join('webrtc_test_common', 'BUILD.gn'), |
| 268 os.path.join('webrtc_tests', 'BUILD.gn'), |
| 269 |
| 270 # TODO(ehmaldonado): Clean up references to rtc_base in these files. |
| 271 # See https://bugs.chromium.org/p/webrtc/issues/detail?id=3806 |
| 272 os.path.join('webrtc', 'BUILD.gn'), |
| 273 os.path.join('xmllite', 'BUILD.gn'), |
| 274 os.path.join('xmpp', 'BUILD.gn'), |
| 275 os.path.join('modules', 'BUILD.gn'), |
| 276 os.path.join('audio_device', 'BUILD.gn'), |
| 277 os.path.join('pc', 'BUILD.gn'), |
| 278 ) |
| 279 if f.LocalPath().endswith(gn_exceptions): |
| 280 continue |
| 281 contents = input_api.ReadFile(f) |
| 282 if pattern.search(contents): |
| 283 violating_files.append(f) |
| 284 if violating_files: |
| 285 return [output_api.PresubmitError( |
| 286 'Depending on rtc_base is not allowed. Change your dependency to ' |
| 287 'rtc_base_approved and possibly sanitize and move the desired source ' |
| 288 'file(s) to rtc_base_approved.\nChanged GN files:', |
| 289 items=violating_files)] |
| 290 return [] |
| 291 |
258 def _CheckNoSourcesAboveGyp(input_api, gyp_files, output_api): | 292 def _CheckNoSourcesAboveGyp(input_api, gyp_files, output_api): |
259 # Disallow referencing source files with paths above the GYP file location. | 293 # Disallow referencing source files with paths above the GYP file location. |
260 source_pattern = input_api.re.compile(r'\'sources\'.*?\[(.*?)\]', | 294 source_pattern = input_api.re.compile(r'\'sources\'.*?\[(.*?)\]', |
261 re.MULTILINE | re.DOTALL) | 295 re.MULTILINE | re.DOTALL) |
262 file_pattern = input_api.re.compile(r"'((\.\./.*?)|(<\(webrtc_root\).*?))'") | 296 file_pattern = input_api.re.compile(r"'((\.\./.*?)|(<\(webrtc_root\).*?))'") |
263 violating_gyp_files = set() | 297 violating_gyp_files = set() |
264 violating_source_entries = [] | 298 violating_source_entries = [] |
265 for gyp_file in gyp_files: | 299 for gyp_file in gyp_files: |
266 if 'supplement.gypi' in gyp_file.LocalPath(): | 300 if 'supplement.gypi' in gyp_file.LocalPath(): |
267 # Exclude supplement.gypi from this check, as the LSan and TSan | 301 # Exclude supplement.gypi from this check, as the LSan and TSan |
(...skipping 12 matching lines...) Expand all Loading... |
280 return [output_api.PresubmitError( | 314 return [output_api.PresubmitError( |
281 'Referencing source files above the directory of the GYP file is not ' | 315 'Referencing source files above the directory of the GYP file is not ' |
282 'allowed. Please introduce new GYP targets and/or GYP files in the ' | 316 'allowed. Please introduce new GYP targets and/or GYP files in the ' |
283 'proper location instead.\n' | 317 'proper location instead.\n' |
284 'Invalid source entries:\n' | 318 'Invalid source entries:\n' |
285 '%s\n' | 319 '%s\n' |
286 'Violating GYP files:' % '\n'.join(violating_source_entries), | 320 'Violating GYP files:' % '\n'.join(violating_source_entries), |
287 items=violating_gyp_files)] | 321 items=violating_gyp_files)] |
288 return [] | 322 return [] |
289 | 323 |
| 324 def _CheckNoSourcesAboveGn(input_api, gn_files, output_api): |
| 325 # Disallow referencing source files with paths above the GN file location. |
| 326 source_pattern = input_api.re.compile(r' +sources \+?= \[(.*?)\]', |
| 327 re.MULTILINE | re.DOTALL) |
| 328 file_pattern = input_api.re.compile(r'"((\.\./.*?)|(//.*?))"') |
| 329 violating_gn_files = set() |
| 330 violating_source_entries = [] |
| 331 for gn_file in gn_files: |
| 332 contents = input_api.ReadFile(gn_file) |
| 333 for source_block_match in source_pattern.finditer(contents): |
| 334 # Find all source list entries starting with ../ in the source block |
| 335 # (exclude overrides entries). |
| 336 for file_list_match in file_pattern.finditer(source_block_match.group(1)): |
| 337 source_file = file_list_match.group(1) |
| 338 if 'overrides/' not in source_file: |
| 339 violating_source_entries.append(source_file) |
| 340 violating_gn_files.add(gn_file) |
| 341 if violating_gn_files: |
| 342 return [output_api.PresubmitError( |
| 343 'Referencing source files above the directory of the GN file is not ' |
| 344 'allowed. Please introduce new GYP targets and/or GN files in the ' |
| 345 'proper location instead.\n' |
| 346 'Invalid source entries:\n' |
| 347 '%s\n' |
| 348 'Violating GN files:' % '\n'.join(violating_source_entries), |
| 349 items=violating_gn_files)] |
| 350 return [] |
| 351 |
290 def _CheckGypChanges(input_api, output_api): | 352 def _CheckGypChanges(input_api, output_api): |
291 source_file_filter = lambda x: input_api.FilterSourceFile( | 353 source_file_filter = lambda x: input_api.FilterSourceFile( |
292 x, white_list=(r'.+\.(gyp|gypi)$',)) | 354 x, white_list=(r'.+\.(gyp|gypi)$',)) |
293 | 355 |
294 gyp_files = [] | 356 gyp_files = [] |
295 for f in input_api.AffectedSourceFiles(source_file_filter): | 357 for f in input_api.AffectedSourceFiles(source_file_filter): |
296 if f.LocalPath().startswith('webrtc'): | 358 if f.LocalPath().startswith('webrtc'): |
297 gyp_files.append(f) | 359 gyp_files.append(f) |
298 | 360 |
299 result = [] | 361 result = [] |
300 if gyp_files: | 362 if gyp_files: |
301 result.append(output_api.PresubmitNotifyResult( | 363 result.append(output_api.PresubmitNotifyResult( |
302 'As you\'re changing GYP files: please make sure corresponding ' | 364 'As you\'re changing GYP files: please make sure corresponding ' |
303 'BUILD.gn files are also updated.\nChanged GYP files:', | 365 'BUILD.gn files are also updated.\nChanged GYP files:', |
304 items=gyp_files)) | 366 items=gyp_files)) |
305 result.extend(_CheckNoRtcBaseDeps(input_api, gyp_files, output_api)) | 367 result.extend(_CheckNoRtcBaseDeps(input_api, gyp_files, output_api)) |
306 result.extend(_CheckNoSourcesAboveGyp(input_api, gyp_files, output_api)) | 368 result.extend(_CheckNoSourcesAboveGyp(input_api, gyp_files, output_api)) |
307 return result | 369 return result |
308 | 370 |
| 371 def _CheckGnChanges(input_api, output_api): |
| 372 source_file_filter = lambda x: input_api.FilterSourceFile( |
| 373 x, white_list=(r'.+\.(gn|gni)$',)) |
| 374 |
| 375 gn_files = [] |
| 376 for f in input_api.AffectedSourceFiles(source_file_filter): |
| 377 if f.LocalPath().startswith('webrtc'): |
| 378 gn_files.append(f) |
| 379 |
| 380 result = [] |
| 381 if gn_files: |
| 382 result.append(output_api.PresubmitNotifyResult( |
| 383 'As you\'re changing GN files: please make sure corresponding GYP' |
| 384 'files are also updated.\nChanged GN files:', |
| 385 items=gn_files)) |
| 386 result.extend(_CheckNoRtcBaseDepsGn(input_api, gn_files, output_api)) |
| 387 result.extend(_CheckNoSourcesAboveGn(input_api, gn_files, output_api)) |
| 388 return result |
| 389 |
309 def _CheckUnwantedDependencies(input_api, output_api): | 390 def _CheckUnwantedDependencies(input_api, output_api): |
310 """Runs checkdeps on #include statements added in this | 391 """Runs checkdeps on #include statements added in this |
311 change. Breaking - rules is an error, breaking ! rules is a | 392 change. Breaking - rules is an error, breaking ! rules is a |
312 warning. | 393 warning. |
313 """ | 394 """ |
314 # Copied from Chromium's src/PRESUBMIT.py. | 395 # Copied from Chromium's src/PRESUBMIT.py. |
315 | 396 |
316 # We need to wait until we have an input_api object and use this | 397 # We need to wait until we have an input_api object and use this |
317 # roundabout construct to import checkdeps because this file is | 398 # roundabout construct to import checkdeps because this file is |
318 # eval-ed and thus doesn't have __file__. | 399 # eval-ed and thus doesn't have __file__. |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 results.extend(input_api.canned_checks.CheckChangeHasNoTabs( | 563 results.extend(input_api.canned_checks.CheckChangeHasNoTabs( |
483 input_api, output_api)) | 564 input_api, output_api)) |
484 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace( | 565 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace( |
485 input_api, output_api)) | 566 input_api, output_api)) |
486 results.extend(input_api.canned_checks.CheckChangeTodoHasOwner( | 567 results.extend(input_api.canned_checks.CheckChangeTodoHasOwner( |
487 input_api, output_api)) | 568 input_api, output_api)) |
488 results.extend(_CheckNativeApiHeaderChanges(input_api, output_api)) | 569 results.extend(_CheckNativeApiHeaderChanges(input_api, output_api)) |
489 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api)) | 570 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api)) |
490 results.extend(_CheckNoFRIEND_TEST(input_api, output_api)) | 571 results.extend(_CheckNoFRIEND_TEST(input_api, output_api)) |
491 results.extend(_CheckGypChanges(input_api, output_api)) | 572 results.extend(_CheckGypChanges(input_api, output_api)) |
| 573 results.extend(_CheckGnChanges(input_api, output_api)) |
492 results.extend(_CheckUnwantedDependencies(input_api, output_api)) | 574 results.extend(_CheckUnwantedDependencies(input_api, output_api)) |
493 results.extend(_CheckJSONParseErrors(input_api, output_api)) | 575 results.extend(_CheckJSONParseErrors(input_api, output_api)) |
494 results.extend(_RunPythonTests(input_api, output_api)) | 576 results.extend(_RunPythonTests(input_api, output_api)) |
495 return results | 577 return results |
496 | 578 |
497 | 579 |
498 def CheckChangeOnUpload(input_api, output_api): | 580 def CheckChangeOnUpload(input_api, output_api): |
499 results = [] | 581 results = [] |
500 results.extend(_CommonChecks(input_api, output_api)) | 582 results.extend(_CommonChecks(input_api, output_api)) |
501 results.extend( | 583 results.extend( |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 for builder in masters[master]: | 620 for builder in masters[master]: |
539 if 'presubmit' in builder: | 621 if 'presubmit' in builder: |
540 # Do not trigger presubmit builders, since they're likely to fail | 622 # Do not trigger presubmit builders, since they're likely to fail |
541 # (e.g. OWNERS checks before finished code review), and we're running | 623 # (e.g. OWNERS checks before finished code review), and we're running |
542 # local presubmit anyway. | 624 # local presubmit anyway. |
543 pass | 625 pass |
544 else: | 626 else: |
545 try_config[master][builder] = ['defaulttests'] | 627 try_config[master][builder] = ['defaulttests'] |
546 | 628 |
547 return try_config | 629 return try_config |
OLD | NEW |