| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Top-level presubmit script for Chromium. | 5 """Top-level presubmit script for Chromium. |
| 6 | 6 |
| 7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts | 7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts |
| 8 for more details about the presubmit API built into gcl. | 8 for more details about the presubmit API built into gcl. |
| 9 """ | 9 """ |
| 10 | 10 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 ) | 50 ) |
| 51 | 51 |
| 52 _TEST_ONLY_WARNING = ( | 52 _TEST_ONLY_WARNING = ( |
| 53 'You might be calling functions intended only for testing from\n' | 53 'You might be calling functions intended only for testing from\n' |
| 54 'production code. It is OK to ignore this warning if you know what\n' | 54 'production code. It is OK to ignore this warning if you know what\n' |
| 55 'you are doing, as the heuristics used to detect the situation are\n' | 55 'you are doing, as the heuristics used to detect the situation are\n' |
| 56 'not perfect. The commit queue will not block on this warning.\n' | 56 'not perfect. The commit queue will not block on this warning.\n' |
| 57 'Email joi@chromium.org if you have questions.') | 57 'Email joi@chromium.org if you have questions.') |
| 58 | 58 |
| 59 | 59 |
| 60 _HTTPS_ONLY_WARNING = ( | |
| 61 'You should prefer to refer to HTTPS URLs, rather than HTTP URLs.\n' | |
| 62 'Do not bypass this warning if there is an equivalent HTTPS endpoint\n' | |
| 63 'that you could refer to instead. (Contact: palmer@chromium.org)') | |
| 64 | |
| 65 | |
| 66 _INCLUDE_ORDER_WARNING = ( | 60 _INCLUDE_ORDER_WARNING = ( |
| 67 'Your #include order seems to be broken. Send mail to\n' | 61 'Your #include order seems to be broken. Send mail to\n' |
| 68 'marja@chromium.org if this is not the case.') | 62 'marja@chromium.org if this is not the case.') |
| 69 | 63 |
| 70 | 64 |
| 71 _BANNED_OBJC_FUNCTIONS = ( | 65 _BANNED_OBJC_FUNCTIONS = ( |
| 72 ( | 66 ( |
| 73 'addTrackingRect:', | 67 'addTrackingRect:', |
| 74 ( | 68 ( |
| 75 'The use of -[NSView addTrackingRect:owner:userData:assumeInside:] is' | 69 'The use of -[NSView addTrackingRect:owner:userData:assumeInside:] is' |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 _TEST_CODE_EXCLUDED_PATHS + | 187 _TEST_CODE_EXCLUDED_PATHS + |
| 194 input_api.DEFAULT_BLACK_LIST) | 188 input_api.DEFAULT_BLACK_LIST) |
| 195 return input_api.FilterSourceFile( | 189 return input_api.FilterSourceFile( |
| 196 affected_file, | 190 affected_file, |
| 197 white_list=(file_inclusion_pattern, ), | 191 white_list=(file_inclusion_pattern, ), |
| 198 black_list=black_list) | 192 black_list=black_list) |
| 199 | 193 |
| 200 problems = [] | 194 problems = [] |
| 201 for f in input_api.AffectedSourceFiles(FilterFile): | 195 for f in input_api.AffectedSourceFiles(FilterFile): |
| 202 local_path = f.LocalPath() | 196 local_path = f.LocalPath() |
| 203 for line_number, line in enumerate(input_api.ReadFile(f).splitlines()): | 197 lines = input_api.ReadFile(f).splitlines() |
| 204 if inclusion_pattern.search(line) and not exclusion_pattern.search(line): | 198 line_number = 0 |
| 199 for line in lines: |
| 200 if (inclusion_pattern.search(line) and |
| 201 not exclusion_pattern.search(line)): |
| 205 problems.append( | 202 problems.append( |
| 206 '%s:%d\n %s' % (local_path, line_number + 1, line.strip())) | 203 '%s:%d\n %s' % (local_path, line_number, line.strip())) |
| 204 line_number += 1 |
| 207 | 205 |
| 208 if problems: | 206 if problems: |
| 209 if input_api.is_committing: | 207 if not input_api.is_committing: |
| 208 return [output_api.PresubmitPromptWarning(_TEST_ONLY_WARNING, problems)] |
| 209 else: |
| 210 # We don't warn on commit, to avoid stopping commits going through CQ. | 210 # We don't warn on commit, to avoid stopping commits going through CQ. |
| 211 return [output_api.PresubmitNotifyResult(_TEST_ONLY_WARNING, problems)] | 211 return [output_api.PresubmitNotifyResult(_TEST_ONLY_WARNING, problems)] |
| 212 else: | 212 else: |
| 213 return [output_api.PresubmitPromptWarning(_TEST_ONLY_WARNING, problems)] | 213 return [] |
| 214 | |
| 215 return [] | |
| 216 | |
| 217 | |
| 218 def _CheckNoHttpUrls(input_api, output_api): | |
| 219 """Attempts to prevent use of http:// URLs. Production Chrome code, and | |
| 220 Chromium infrastructure code, should strive to use https:// URLs (preferably | |
| 221 HSTS and with pinned public keys, as well). Some URLs will not be | |
| 222 translatable, but gradually the number of those should diminish. | |
| 223 """ | |
| 224 | |
| 225 # Include all sorts of files, both code and infrastructure scripts. | |
| 226 file_inclusion_pattern = r'.+\.(h|cc|cpp|cxx|mm|py|bat|sh)$' | |
| 227 | |
| 228 inclusion_pattern = input_api.re.compile(r'''["']http:/''', | |
| 229 input_api.re.IGNORECASE) | |
| 230 | |
| 231 # Allow http:/ in comments. https://chromium.org and | |
| 232 # https://cr{bug,osbug,rev}.com don't work yet. See e.g. | |
| 233 # https://code.google.com/p/chromium/issues/detail?id=106096. | |
| 234 # TODO(palmer): Remove this once 106096 and its dependent bugs are fixed. | |
| 235 exclusion_pattern = input_api.re.compile(r'(#|//|/\*| \*).*http:/', | |
| 236 input_api.re.IGNORECASE) | |
| 237 | |
| 238 def FilterFile(affected_file): | |
| 239 black_list = (_TEST_CODE_EXCLUDED_PATHS + | |
| 240 input_api.DEFAULT_BLACK_LIST) | |
| 241 return input_api.FilterSourceFile( | |
| 242 affected_file, | |
| 243 white_list=(file_inclusion_pattern, ), | |
| 244 black_list=black_list) | |
| 245 | |
| 246 problems = [] | |
| 247 for f in input_api.AffectedSourceFiles(FilterFile): | |
| 248 local_path = f.LocalPath() | |
| 249 for line_number, line in enumerate(input_api.ReadFile(f).splitlines()): | |
| 250 if inclusion_pattern.search(line) and not exclusion_pattern.search(line): | |
| 251 problems.append( | |
| 252 '%s:%d\n %s' % (local_path, line_number + 1, line.strip())) | |
| 253 | |
| 254 if problems: | |
| 255 if input_api.is_committing: | |
| 256 # We don't warn on commit, to avoid stopping commits going through CQ. | |
| 257 return [output_api.PresubmitNotifyResult(_HTTPS_ONLY_WARNING, problems)] | |
| 258 else: | |
| 259 return [output_api.PresubmitPromptWarning(_HTTPS_ONLY_WARNING, problems)] | |
| 260 | |
| 261 return [] | |
| 262 | 214 |
| 263 | 215 |
| 264 def _CheckNoIOStreamInHeaders(input_api, output_api): | 216 def _CheckNoIOStreamInHeaders(input_api, output_api): |
| 265 """Checks to make sure no .h files include <iostream>.""" | 217 """Checks to make sure no .h files include <iostream>.""" |
| 266 files = [] | 218 files = [] |
| 267 pattern = input_api.re.compile(r'^#include\s*<iostream>', | 219 pattern = input_api.re.compile(r'^#include\s*<iostream>', |
| 268 input_api.re.MULTILINE) | 220 input_api.re.MULTILINE) |
| 269 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): | 221 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): |
| 270 if not f.LocalPath().endswith('.h'): | 222 if not f.LocalPath().endswith('.h'): |
| 271 continue | 223 continue |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 error_descriptions.append(description_with_path) | 414 error_descriptions.append(description_with_path) |
| 463 else: | 415 else: |
| 464 warning_descriptions.append(description_with_path) | 416 warning_descriptions.append(description_with_path) |
| 465 | 417 |
| 466 results = [] | 418 results = [] |
| 467 if error_descriptions: | 419 if error_descriptions: |
| 468 results.append(output_api.PresubmitError( | 420 results.append(output_api.PresubmitError( |
| 469 'You added one or more #includes that violate checkdeps rules.', | 421 'You added one or more #includes that violate checkdeps rules.', |
| 470 error_descriptions)) | 422 error_descriptions)) |
| 471 if warning_descriptions: | 423 if warning_descriptions: |
| 472 if input_api.is_committing: | 424 if not input_api.is_committing: |
| 425 warning_factory = output_api.PresubmitPromptWarning |
| 426 else: |
| 473 # We don't want to block use of the CQ when there is a warning | 427 # We don't want to block use of the CQ when there is a warning |
| 474 # of this kind, so we only show a message when committing. | 428 # of this kind, so we only show a message when committing. |
| 475 warning_factory = output_api.PresubmitNotifyResult | 429 warning_factory = output_api.PresubmitNotifyResult |
| 476 else: | |
| 477 warning_factory = output_api.PresubmitPromptWarning | |
| 478 results.append(warning_factory( | 430 results.append(warning_factory( |
| 479 'You added one or more #includes of files that are temporarily\n' | 431 'You added one or more #includes of files that are temporarily\n' |
| 480 'allowed but being removed. Can you avoid introducing the\n' | 432 'allowed but being removed. Can you avoid introducing the\n' |
| 481 '#include? See relevant DEPS file(s) for details and contacts.', | 433 '#include? See relevant DEPS file(s) for details and contacts.', |
| 482 warning_descriptions)) | 434 warning_descriptions)) |
| 483 return results | 435 return results |
| 484 | 436 |
| 485 | 437 |
| 486 def _CheckFilePermissions(input_api, output_api): | 438 def _CheckFilePermissions(input_api, output_api): |
| 487 """Check that all files have their permissions properly set.""" | 439 """Check that all files have their permissions properly set.""" |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 """ | 597 """ |
| 646 | 598 |
| 647 warnings = [] | 599 warnings = [] |
| 648 for f in input_api.AffectedFiles(): | 600 for f in input_api.AffectedFiles(): |
| 649 if f.LocalPath().endswith(('.cc', '.h')): | 601 if f.LocalPath().endswith(('.cc', '.h')): |
| 650 changed_linenums = set(line_num for line_num, _ in f.ChangedContents()) | 602 changed_linenums = set(line_num for line_num, _ in f.ChangedContents()) |
| 651 warnings.extend(_CheckIncludeOrderInFile(input_api, f, changed_linenums)) | 603 warnings.extend(_CheckIncludeOrderInFile(input_api, f, changed_linenums)) |
| 652 | 604 |
| 653 results = [] | 605 results = [] |
| 654 if warnings: | 606 if warnings: |
| 655 if input_api.is_committing: | 607 if not input_api.is_committing: |
| 608 results.append(output_api.PresubmitPromptWarning(_INCLUDE_ORDER_WARNING, |
| 609 warnings)) |
| 610 else: |
| 656 # We don't warn on commit, to avoid stopping commits going through CQ. | 611 # We don't warn on commit, to avoid stopping commits going through CQ. |
| 657 results.append(output_api.PresubmitNotifyResult(_INCLUDE_ORDER_WARNING, | 612 results.append(output_api.PresubmitNotifyResult(_INCLUDE_ORDER_WARNING, |
| 658 warnings)) | 613 warnings)) |
| 659 else: | |
| 660 results.append(output_api.PresubmitPromptWarning(_INCLUDE_ORDER_WARNING, | |
| 661 warnings)) | |
| 662 return results | 614 return results |
| 663 | 615 |
| 664 | 616 |
| 665 def _CheckForVersionControlConflictsInFile(input_api, f): | 617 def _CheckForVersionControlConflictsInFile(input_api, f): |
| 666 pattern = input_api.re.compile('^(?:<<<<<<<|>>>>>>>) |^=======$') | 618 pattern = input_api.re.compile('^(?:<<<<<<<|>>>>>>>) |^=======$') |
| 667 errors = [] | 619 errors = [] |
| 668 for line_num, line in f.ChangedContents(): | 620 for line_num, line in f.ChangedContents(): |
| 669 if pattern.match(line): | 621 if pattern.match(line): |
| 670 errors.append(' %s:%d %s' % (f.LocalPath(), line_num, line)) | 622 errors.append(' %s:%d %s' % (f.LocalPath(), line_num, line)) |
| 671 return errors | 623 return errors |
| (...skipping 27 matching lines...) Expand all Loading... |
| 699 input_api.DEFAULT_BLACK_LIST)) | 651 input_api.DEFAULT_BLACK_LIST)) |
| 700 | 652 |
| 701 pattern = input_api.re.compile('"[^"]*google\.com[^"]*"') | 653 pattern = input_api.re.compile('"[^"]*google\.com[^"]*"') |
| 702 problems = [] # items are (filename, line_number, line) | 654 problems = [] # items are (filename, line_number, line) |
| 703 for f in input_api.AffectedSourceFiles(FilterFile): | 655 for f in input_api.AffectedSourceFiles(FilterFile): |
| 704 for line_num, line in f.ChangedContents(): | 656 for line_num, line in f.ChangedContents(): |
| 705 if pattern.search(line): | 657 if pattern.search(line): |
| 706 problems.append((f.LocalPath(), line_num, line)) | 658 problems.append((f.LocalPath(), line_num, line)) |
| 707 | 659 |
| 708 if problems: | 660 if problems: |
| 709 if input_api.is_committing: | 661 if not input_api.is_committing: |
| 662 warning_factory = output_api.PresubmitPromptWarning |
| 663 else: |
| 710 # We don't want to block use of the CQ when there is a warning | 664 # We don't want to block use of the CQ when there is a warning |
| 711 # of this kind, so we only show a message when committing. | 665 # of this kind, so we only show a message when committing. |
| 712 warning_factory = output_api.PresubmitNotifyResult | 666 warning_factory = output_api.PresubmitNotifyResult |
| 713 else: | |
| 714 warning_factory = output_api.PresubmitPromptWarning | |
| 715 return [warning_factory( | 667 return [warning_factory( |
| 716 'Most layers below src/chrome/ should not hardcode service URLs.\n' | 668 'Most layers below src/chrome/ should not hardcode service URLs.\n' |
| 717 'Are you sure this is correct? (Contact: joi@chromium.org)', | 669 'Are you sure this is correct? (Contact: joi@chromium.org)', |
| 718 [' %s:%d: %s' % ( | 670 [' %s:%d: %s' % ( |
| 719 problem[0], problem[1], problem[2]) for problem in problems])] | 671 problem[0], problem[1], problem[2]) for problem in problems])] |
| 720 | 672 else: |
| 721 return [] | 673 return [] |
| 722 | 674 |
| 723 | 675 |
| 724 def _CommonChecks(input_api, output_api): | 676 def _CommonChecks(input_api, output_api): |
| 725 """Checks common to both upload and commit.""" | 677 """Checks common to both upload and commit.""" |
| 726 results = [] | 678 results = [] |
| 727 results.extend(input_api.canned_checks.PanProjectChecks( | 679 results.extend(input_api.canned_checks.PanProjectChecks( |
| 728 input_api, output_api, excluded_paths=_EXCLUDED_PATHS)) | 680 input_api, output_api, excluded_paths=_EXCLUDED_PATHS)) |
| 729 results.extend(_CheckAuthorizedAuthor(input_api, output_api)) | 681 results.extend(_CheckAuthorizedAuthor(input_api, output_api)) |
| 730 results.extend( | 682 results.extend( |
| 731 _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api)) | 683 _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api)) |
| 732 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api)) | 684 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api)) |
| 733 results.extend(_CheckNoUNIT_TESTInSourceFiles(input_api, output_api)) | 685 results.extend(_CheckNoUNIT_TESTInSourceFiles(input_api, output_api)) |
| 734 results.extend(_CheckNoNewWStrings(input_api, output_api)) | 686 results.extend(_CheckNoNewWStrings(input_api, output_api)) |
| 735 results.extend(_CheckNoDEPSGIT(input_api, output_api)) | 687 results.extend(_CheckNoDEPSGIT(input_api, output_api)) |
| 736 results.extend(_CheckNoBannedFunctions(input_api, output_api)) | 688 results.extend(_CheckNoBannedFunctions(input_api, output_api)) |
| 737 results.extend(_CheckNoPragmaOnce(input_api, output_api)) | 689 results.extend(_CheckNoPragmaOnce(input_api, output_api)) |
| 738 results.extend(_CheckNoTrinaryTrueFalse(input_api, output_api)) | 690 results.extend(_CheckNoTrinaryTrueFalse(input_api, output_api)) |
| 739 results.extend(_CheckUnwantedDependencies(input_api, output_api)) | 691 results.extend(_CheckUnwantedDependencies(input_api, output_api)) |
| 740 results.extend(_CheckFilePermissions(input_api, output_api)) | 692 results.extend(_CheckFilePermissions(input_api, output_api)) |
| 741 results.extend(_CheckNoAuraWindowPropertyHInHeaders(input_api, output_api)) | 693 results.extend(_CheckNoAuraWindowPropertyHInHeaders(input_api, output_api)) |
| 742 results.extend(_CheckIncludeOrder(input_api, output_api)) | 694 results.extend(_CheckIncludeOrder(input_api, output_api)) |
| 743 results.extend(_CheckForVersionControlConflicts(input_api, output_api)) | 695 results.extend(_CheckForVersionControlConflicts(input_api, output_api)) |
| 744 results.extend(_CheckPatchFiles(input_api, output_api)) | 696 results.extend(_CheckPatchFiles(input_api, output_api)) |
| 745 results.extend(_CheckHardcodedGoogleHostsInLowerLayers(input_api, output_api)) | 697 results.extend(_CheckHardcodedGoogleHostsInLowerLayers(input_api, output_api)) |
| 746 results.extend(_CheckNoHttpUrls(input_api, output_api)) | |
| 747 | 698 |
| 748 if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()): | 699 if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()): |
| 749 results.extend(input_api.canned_checks.RunUnitTestsInDirectory( | 700 results.extend(input_api.canned_checks.RunUnitTestsInDirectory( |
| 750 input_api, output_api, | 701 input_api, output_api, |
| 751 input_api.PresubmitLocalPath(), | 702 input_api.PresubmitLocalPath(), |
| 752 whitelist=[r'.+_test\.py$'])) | 703 whitelist=[r'.+_test\.py$'])) |
| 753 return results | 704 return results |
| 754 | 705 |
| 755 | 706 |
| 756 def _CheckSubversionConfig(input_api, output_api): | 707 def _CheckSubversionConfig(input_api, output_api): |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 author)] | 776 author)] |
| 826 return [] | 777 return [] |
| 827 | 778 |
| 828 | 779 |
| 829 def _CheckPatchFiles(input_api, output_api): | 780 def _CheckPatchFiles(input_api, output_api): |
| 830 problems = [f.LocalPath() for f in input_api.AffectedFiles() | 781 problems = [f.LocalPath() for f in input_api.AffectedFiles() |
| 831 if f.LocalPath().endswith(('.orig', '.rej'))] | 782 if f.LocalPath().endswith(('.orig', '.rej'))] |
| 832 if problems: | 783 if problems: |
| 833 return [output_api.PresubmitError( | 784 return [output_api.PresubmitError( |
| 834 "Don't commit .rej and .orig files.", problems)] | 785 "Don't commit .rej and .orig files.", problems)] |
| 835 | 786 else: |
| 836 return [] | 787 return [] |
| 837 | 788 |
| 838 | 789 |
| 839 def CheckChangeOnUpload(input_api, output_api): | 790 def CheckChangeOnUpload(input_api, output_api): |
| 840 results = [] | 791 results = [] |
| 841 results.extend(_CommonChecks(input_api, output_api)) | 792 results.extend(_CommonChecks(input_api, output_api)) |
| 842 return results | 793 return results |
| 843 | 794 |
| 844 | 795 |
| 845 def CheckChangeOnCommit(input_api, output_api): | 796 def CheckChangeOnCommit(input_api, output_api): |
| 846 results = [] | 797 results = [] |
| 847 results.extend(_CommonChecks(input_api, output_api)) | 798 results.extend(_CommonChecks(input_api, output_api)) |
| 848 # TODO(thestig) temporarily disabled, doesn't work in third_party/ | 799 # TODO(thestig) temporarily disabled, doesn't work in third_party/ |
| 849 #results.extend(input_api.canned_checks.CheckSvnModifiedDirectories( | 800 #results.extend(input_api.canned_checks.CheckSvnModifiedDirectories( |
| 850 # input_api, output_api, sources)) | 801 # input_api, output_api, sources)) |
| 851 # Make sure the tree is 'open'. | 802 # Make sure the tree is 'open'. |
| 852 results.extend(input_api.canned_checks.CheckTreeIsOpen( | 803 results.extend(input_api.canned_checks.CheckTreeIsOpen( |
| 853 input_api, | 804 input_api, |
| 854 output_api, | 805 output_api, |
| 855 json_url='https://chromium-status.appspot.com/current?format=json')) | 806 json_url='http://chromium-status.appspot.com/current?format=json')) |
| 856 results.extend(input_api.canned_checks.CheckRietveldTryJobExecution(input_api, | 807 results.extend(input_api.canned_checks.CheckRietveldTryJobExecution(input_api, |
| 857 output_api, 'https://codereview.chromium.org', | 808 output_api, 'http://codereview.chromium.org', |
| 858 ('win_rel', 'linux_rel', 'mac_rel, win:compile'), | 809 ('win_rel', 'linux_rel', 'mac_rel, win:compile'), |
| 859 'tryserver@chromium.org')) | 810 'tryserver@chromium.org')) |
| 860 | 811 |
| 861 results.extend(input_api.canned_checks.CheckChangeHasBugField( | 812 results.extend(input_api.canned_checks.CheckChangeHasBugField( |
| 862 input_api, output_api)) | 813 input_api, output_api)) |
| 863 results.extend(input_api.canned_checks.CheckChangeHasDescription( | 814 results.extend(input_api.canned_checks.CheckChangeHasDescription( |
| 864 input_api, output_api)) | 815 input_api, output_api)) |
| 865 results.extend(_CheckSubversionConfig(input_api, output_api)) | 816 results.extend(_CheckSubversionConfig(input_api, output_api)) |
| 866 return results | 817 return results |
| 867 | 818 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 898 'win7_aura', | 849 'win7_aura', |
| 899 'win_rel', | 850 'win_rel', |
| 900 ] | 851 ] |
| 901 | 852 |
| 902 # Match things like path/aura/file.cc and path/file_aura.cc. | 853 # Match things like path/aura/file.cc and path/file_aura.cc. |
| 903 # Same for chromeos. | 854 # Same for chromeos. |
| 904 if any(re.search('[/_](aura|chromeos)', f) for f in files): | 855 if any(re.search('[/_](aura|chromeos)', f) for f in files): |
| 905 trybots += ['linux_chromeos_clang:compile', 'linux_chromeos_asan'] | 856 trybots += ['linux_chromeos_clang:compile', 'linux_chromeos_asan'] |
| 906 | 857 |
| 907 return trybots | 858 return trybots |
| OLD | NEW |