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 depot_tools. | 8 for more details about the presubmit API built into depot_tools. |
9 """ | 9 """ |
10 | 10 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
51 ) | 51 ) |
52 | 52 |
53 | 53 |
54 _TEST_ONLY_WARNING = ( | 54 _TEST_ONLY_WARNING = ( |
55 'You might be calling functions intended only for testing from\n' | 55 'You might be calling functions intended only for testing from\n' |
56 'production code. It is OK to ignore this warning if you know what\n' | 56 'production code. It is OK to ignore this warning if you know what\n' |
57 'you are doing, as the heuristics used to detect the situation are\n' | 57 'you are doing, as the heuristics used to detect the situation are\n' |
58 'not perfect. The commit queue will not block on this warning.') | 58 'not perfect. The commit queue will not block on this warning.') |
59 | 59 |
60 | 60 |
61 _INCLUDE_IMPORT_WARNING = ( | |
62 'You are including ObjC headers or importing C++ headers. Remember to use ' | |
63 'the right #include/#import directive.') | |
64 | |
65 | |
61 _INCLUDE_ORDER_WARNING = ( | 66 _INCLUDE_ORDER_WARNING = ( |
62 'Your #include order seems to be broken. Remember to use the right ' | 67 'Your #include order seems to be broken. Remember to use the right ' |
63 'collation (LC_COLLATE=C) and check\nhttps://google.github.io/styleguide/' | 68 'collation (LC_COLLATE=C) and check\nhttps://google.github.io/styleguide/' |
64 'cppguide.html#Names_and_Order_of_Includes') | 69 'cppguide.html#Names_and_Order_of_Includes') |
65 | 70 |
66 | 71 |
67 _BANNED_OBJC_FUNCTIONS = ( | 72 _BANNED_OBJC_FUNCTIONS = ( |
68 ( | 73 ( |
69 'addTrackingRect:', | 74 'addTrackingRect:', |
70 ( | 75 ( |
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
764 if pattern.match(line): | 769 if pattern.match(line): |
765 errors.append(' %s:%d' % (f.LocalPath(), line_num)) | 770 errors.append(' %s:%d' % (f.LocalPath(), line_num)) |
766 | 771 |
767 results = [] | 772 results = [] |
768 if errors: | 773 if errors: |
769 results.append(output_api.PresubmitError( | 774 results.append(output_api.PresubmitError( |
770 'Header files should not include ui/aura/window_property.h', errors)) | 775 'Header files should not include ui/aura/window_property.h', errors)) |
771 return results | 776 return results |
772 | 777 |
773 | 778 |
779 def _CheckIncludeImportInFile(input_api, f, changed_linenums): | |
780 """Checks the include/import coherence in file f.""" | |
Eugene But (OOO till 7-30)
2016/12/23 16:25:08
Could you please document the rules, about @end/@c
Olivier
2016/12/26 14:49:29
Done.
| |
781 custom_include_pattern = input_api.re.compile(r'\s*#include "(?P<FILE>.*)"') | |
782 custom_import_pattern = input_api.re.compile(r'\s*#import "(?P<FILE>.*)"') | |
783 guard_pattern = input_api.re.compile( | |
784 r'\s*#if !?defined\(__OBJC__\).*') | |
785 objc_pattern = input_api.re.compile( | |
786 r'\s*(@interface|@end|@implementation|@protocol|#import).*') | |
787 contents = f.NewContents() | |
788 warnings = [] | |
789 line_num = 0 | |
790 for line in contents: | |
Eugene But (OOO till 7-30)
2016/12/23 16:25:08
Could you please add implementation comments. The
Olivier
2016/12/26 14:49:29
Done.
| |
791 line_num += 1 | |
792 is_imported = False | |
793 included_file = "" | |
794 match_cpp = custom_include_pattern.match(line) | |
795 if match_cpp: | |
796 match_dict = match_cpp.groupdict() | |
797 included_file = match_dict['FILE'] | |
798 match_objc = custom_import_pattern.match(line) | |
799 if match_objc: | |
800 match_dict = match_objc.groupdict() | |
801 included_file = match_dict['FILE'] | |
802 is_imported = True | |
803 if included_file == "": | |
804 continue | |
805 included_absolute_path = input_api.os_path.join( | |
806 input_api.change.RepositoryRoot(), included_file) | |
807 if not input_api.os_path.isfile(included_absolute_path): | |
808 # Included file may need a custom -I flag. | |
809 # Ignore it. | |
810 continue | |
811 has_objc = False | |
812 ignore_objc = False | |
813 for included_line in open(included_absolute_path, 'r'): | |
814 match_guard = guard_pattern.match(included_line) | |
815 if match_guard: | |
816 ignore_objc = True | |
817 break | |
818 match_objc = objc_pattern.match(included_line) | |
819 if match_objc: | |
820 has_objc = True | |
821 break | |
Eugene But (OOO till 7-30)
2016/12/23 16:25:09
This is a complex body with multiple loops continu
Olivier
2016/12/26 14:49:29
Done.
| |
822 if ignore_objc: | |
823 # There is an Objective C guard, the file is internded to be included or | |
824 # imported. | |
825 continue | |
826 if has_objc and not is_imported: | |
827 warnings.append('%s:%d %s' % (f.LocalPath(), line_num, line)) | |
828 warnings.append('Header is included but has Objective C instructions.') | |
829 if not has_objc and is_imported: | |
830 warnings.append('%s:%d %s' % (f.LocalPath(), line_num, line)) | |
831 warnings.append('Header is imported but has no Objective C instructions.') | |
832 return warnings | |
833 | |
834 | |
835 def _CheckIncludeImport(input_api, output_api): | |
836 """Checks that C++ files are included, ObjC files imported | |
Eugene But (OOO till 7-30)
2016/12/23 16:25:08
nit: s/files/headers
Olivier
2016/12/26 14:49:29
Done.
| |
837 """ | |
838 def FileFilterIncludeImport(affected_file): | |
839 black_list = (_EXCLUDED_PATHS + input_api.DEFAULT_BLACK_LIST) | |
840 return input_api.FilterSourceFile(affected_file, black_list=black_list) | |
841 | |
842 warnings = [] | |
843 for f in input_api.AffectedFiles(file_filter=FileFilterIncludeImport): | |
Eugene But (OOO till 7-30)
2016/12/23 16:25:08
Usage of filter is discouraged by Python Style Gui
Olivier
2016/12/26 14:49:29
All other tests use this structure and I cannot ch
| |
844 if f.LocalPath().endswith(('.cc', '.h', '.mm')): | |
845 changed_linenums = set(line_num for line_num, _ in f.ChangedContents()) | |
846 warnings.extend(_CheckIncludeImportInFile(input_api, f, changed_linenums)) | |
847 | |
848 results = [] | |
849 if warnings: | |
850 results.append(output_api.PresubmitPromptOrNotify(_INCLUDE_IMPORT_WARNING, | |
851 warnings)) | |
852 return results | |
853 | |
854 | |
774 def _CheckIncludeOrderForScope(scope, input_api, file_path, changed_linenums): | 855 def _CheckIncludeOrderForScope(scope, input_api, file_path, changed_linenums): |
775 """Checks that the lines in scope occur in the right order. | 856 """Checks that the lines in scope occur in the right order. |
776 | 857 |
777 1. C system files in alphabetical order | 858 1. C system files in alphabetical order |
778 2. C++ system files in alphabetical order | 859 2. C++ system files in alphabetical order |
779 3. Project's .h files | 860 3. Project's .h files |
780 """ | 861 """ |
781 | 862 |
782 c_system_include_pattern = input_api.re.compile(r'\s*#include <.*\.h>') | 863 c_system_include_pattern = input_api.re.compile(r'\s*#include <.*\.h>') |
783 cpp_system_include_pattern = input_api.re.compile(r'\s*#include <.*>') | 864 cpp_system_include_pattern = input_api.re.compile(r'\s*#include <.*>') |
(...skipping 1255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2039 results.extend(_CheckNoUNIT_TESTInSourceFiles(input_api, output_api)) | 2120 results.extend(_CheckNoUNIT_TESTInSourceFiles(input_api, output_api)) |
2040 results.extend(_CheckDCHECK_IS_ONHasBraces(input_api, output_api)) | 2121 results.extend(_CheckDCHECK_IS_ONHasBraces(input_api, output_api)) |
2041 results.extend(_CheckNoNewWStrings(input_api, output_api)) | 2122 results.extend(_CheckNoNewWStrings(input_api, output_api)) |
2042 results.extend(_CheckNoDEPSGIT(input_api, output_api)) | 2123 results.extend(_CheckNoDEPSGIT(input_api, output_api)) |
2043 results.extend(_CheckNoBannedFunctions(input_api, output_api)) | 2124 results.extend(_CheckNoBannedFunctions(input_api, output_api)) |
2044 results.extend(_CheckNoPragmaOnce(input_api, output_api)) | 2125 results.extend(_CheckNoPragmaOnce(input_api, output_api)) |
2045 results.extend(_CheckNoTrinaryTrueFalse(input_api, output_api)) | 2126 results.extend(_CheckNoTrinaryTrueFalse(input_api, output_api)) |
2046 results.extend(_CheckUnwantedDependencies(input_api, output_api)) | 2127 results.extend(_CheckUnwantedDependencies(input_api, output_api)) |
2047 results.extend(_CheckFilePermissions(input_api, output_api)) | 2128 results.extend(_CheckFilePermissions(input_api, output_api)) |
2048 results.extend(_CheckNoAuraWindowPropertyHInHeaders(input_api, output_api)) | 2129 results.extend(_CheckNoAuraWindowPropertyHInHeaders(input_api, output_api)) |
2130 results.extend(_CheckIncludeImport(input_api, output_api)) | |
2049 results.extend(_CheckIncludeOrder(input_api, output_api)) | 2131 results.extend(_CheckIncludeOrder(input_api, output_api)) |
2050 results.extend(_CheckForVersionControlConflicts(input_api, output_api)) | 2132 results.extend(_CheckForVersionControlConflicts(input_api, output_api)) |
2051 results.extend(_CheckPatchFiles(input_api, output_api)) | 2133 results.extend(_CheckPatchFiles(input_api, output_api)) |
2052 results.extend(_CheckHardcodedGoogleHostsInLowerLayers(input_api, output_api)) | 2134 results.extend(_CheckHardcodedGoogleHostsInLowerLayers(input_api, output_api)) |
2053 results.extend(_CheckNoAbbreviationInPngFileName(input_api, output_api)) | 2135 results.extend(_CheckNoAbbreviationInPngFileName(input_api, output_api)) |
2054 results.extend(_CheckForInvalidOSMacros(input_api, output_api)) | 2136 results.extend(_CheckForInvalidOSMacros(input_api, output_api)) |
2055 results.extend(_CheckForInvalidIfDefinedMacros(input_api, output_api)) | 2137 results.extend(_CheckForInvalidIfDefinedMacros(input_api, output_api)) |
2056 results.extend(_CheckFlakyTestUsage(input_api, output_api)) | 2138 results.extend(_CheckFlakyTestUsage(input_api, output_api)) |
2057 results.extend(_CheckAddedDepsHaveTargetApprovals(input_api, output_api)) | 2139 results.extend(_CheckAddedDepsHaveTargetApprovals(input_api, output_api)) |
2058 results.extend( | 2140 results.extend( |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2322 results.extend(input_api.canned_checks.CheckTreeIsOpen( | 2404 results.extend(input_api.canned_checks.CheckTreeIsOpen( |
2323 input_api, | 2405 input_api, |
2324 output_api, | 2406 output_api, |
2325 json_url='http://chromium-status.appspot.com/current?format=json')) | 2407 json_url='http://chromium-status.appspot.com/current?format=json')) |
2326 | 2408 |
2327 results.extend(input_api.canned_checks.CheckChangeHasBugField( | 2409 results.extend(input_api.canned_checks.CheckChangeHasBugField( |
2328 input_api, output_api)) | 2410 input_api, output_api)) |
2329 results.extend(input_api.canned_checks.CheckChangeHasDescription( | 2411 results.extend(input_api.canned_checks.CheckChangeHasDescription( |
2330 input_api, output_api)) | 2412 input_api, output_api)) |
2331 return results | 2413 return results |
OLD | NEW |