Index: presubmit_canned_checks.py |
=================================================================== |
--- presubmit_canned_checks.py (revision 79277) |
+++ presubmit_canned_checks.py (working copy) |
@@ -4,6 +4,9 @@ |
"""Generic presubmit checks that can be reused by other presubmit checks.""" |
+import time |
+ |
+ |
### Description checks |
def CheckChangeHasTestField(input_api, output_api): |
@@ -679,3 +682,126 @@ |
approvers.append(m['sender']) |
return set(approvers) |
+ |
+_TEXT_FILES = ( |
M-A Ruel
2011/03/24 17:08:04
Maybe better to be local variables?
bradn
2011/03/24 17:29:03
Done.
|
+ r".*\.txt", |
+ r".*\.json", |
+) |
+ |
+_LICENSE_HEADER = ( |
+ r".*? Copyright \(c\) %(year)s The %(project)s Authors\. " |
M-A Ruel
2011/03/24 17:08:04
I prefer ' but I'm silly.
bradn
2011/03/24 17:29:03
Done.
|
+ r"All rights reserved\.\n" |
+ r".*? Use of this source code is governed by a BSD-style license that can " |
+ "be\n" |
+ r".*? found in the LICENSE file\." |
+ "\n" |
+) |
+ |
+ |
+def _CheckConstNSObject(input_api, output_api, source_file_filter): |
+ """Checks to make sure no objective-c files have |const NSSomeClass*|.""" |
+ pattern = input_api.re.compile(r'const\s+NS\w*\s*\*') |
+ files = [] |
+ for f in input_api.AffectedSourceFiles(source_file_filter): |
+ if f.LocalPath().endswith('.h') or f.LocalPath().endswith('.mm'): |
M-A Ruel
2011/03/24 17:08:04
source_file_filter should be doing the filtering a
bradn
2011/03/24 17:29:03
Done.
|
+ contents = input_api.ReadFile(f) |
+ if pattern.search(contents): |
+ files.append(f) |
+ |
+ if len(files): |
M-A Ruel
2011/03/24 17:08:04
if files:
bradn
2011/03/24 17:29:03
Done.
|
+ if input_api.is_committing: |
+ res_type = output_api.PresubmitPromptWarning |
+ else: |
+ res_type = output_api.PresubmitNotifyResult |
+ return [ res_type('|const NSClass*| is wrong, see ' + |
+ 'http://dev.chromium.org/developers/clang-mac', |
+ files) ] |
+ return [] |
+ |
+ |
+def _CheckSingletonInHeaders(input_api, output_api, source_file_filter): |
+ """Checks to make sure no header files have |Singleton<|.""" |
+ pattern = input_api.re.compile(r'Singleton<') |
+ files = [] |
+ for f in input_api.AffectedSourceFiles(source_file_filter): |
+ if (f.LocalPath().endswith('.h') or f.LocalPath().endswith('.hxx') or |
+ f.LocalPath().endswith('.hpp') or f.LocalPath().endswith('.inl')): |
+ contents = input_api.ReadFile(f) |
+ if pattern.search(contents): |
+ files.append(f) |
+ |
+ if len(files): |
M-A Ruel
2011/03/24 17:08:04
if files:
bradn
2011/03/24 17:29:03
Done.
|
+ return [ output_api.PresubmitError( |
+ 'Found Singleton<T> in the following header files.\n' + |
+ 'Please move them to an appropriate source file so that the ' + |
+ 'template gets instantiated in a single compilation unit.', |
+ files) ] |
+ return [] |
+ |
+ |
+def PanProjectChecks(input_api, output_api, |
+ excluded_paths=None, text_files=None, |
+ license_header=None, project_name=None): |
+ """Checks that ALL chromium orbit projects should use. |
+ |
+ These are checks to be run on all Chromium orbit project, including: |
+ Chromium |
+ Native Client |
+ V8 |
+ When you update this function, please take this broad scope into account. |
+ Args: |
+ input_api: Bag of input related interfaces. |
+ output_api: Bag of output related interfaces. |
+ excluded_paths: Don't include these paths in common checks. |
+ text_files: Which file are to be treated as documentation text files. |
+ license_header: What license header should be on files. |
+ project_name: What is the name of the project as it appears in the license. |
+ Returns: |
+ A list of warning or error objects. |
+ """ |
+ if excluded_paths is None: |
+ excluded_paths = tuple() |
+ if text_files is None: |
+ text_files = _TEXT_FILES |
+ if project_name is None: |
M-A Ruel
2011/03/24 17:08:04
project_name = project_name or 'Chromium'
same fo
bradn
2011/03/24 17:29:03
Done.
|
+ project_name = 'Chromium' |
+ if license_header is None: |
+ license_header = _LICENSE_HEADER % { |
+ 'year': time.strftime("%Y"), |
+ 'project': project_name, |
+ } |
+ |
+ results = [] |
+ # What does this code do? |
M-A Ruel
2011/03/24 17:08:04
funny but unnecessary.
bradn
2011/03/24 17:29:03
Done.
|
+ # It loads the default black list (e.g. third_party, experimental, etc) and |
+ # add our black list (breakpad, skia and v8 are still not following |
+ # google style and are not really living this repository). |
+ # See presubmit_support.py InputApi.FilterSourceFile for the (simple) usage. |
+ black_list = input_api.DEFAULT_BLACK_LIST + excluded_paths |
+ white_list = input_api.DEFAULT_WHITE_LIST + text_files |
+ sources = lambda x: input_api.FilterSourceFile(x, black_list=black_list) |
+ text_files = lambda x: input_api.FilterSourceFile(x, black_list=black_list, |
+ white_list=white_list) |
+ |
+ # TODO(dpranke): enable upload as well |
M-A Ruel
2011/03/24 17:08:04
I'm not sure Dirk is ready to enable it for NaCl a
bradn
2011/03/24 17:29:03
Uh, NaCl's trying it out, that's what's prompted t
|
+ if input_api.is_committing: |
+ results.extend(input_api.canned_checks.CheckOwners( |
+ input_api, output_api, source_file_filter=sources)) |
+ |
+ results.extend(input_api.canned_checks.CheckLongLines( |
+ input_api, output_api, source_file_filter=sources)) |
+ results.extend(input_api.canned_checks.CheckChangeHasNoTabs( |
+ input_api, output_api, source_file_filter=sources)) |
+ results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace( |
+ input_api, output_api, source_file_filter=sources)) |
+ results.extend(input_api.canned_checks.CheckChangeSvnEolStyle( |
+ input_api, output_api, source_file_filter=text_files)) |
+ results.extend(input_api.canned_checks.CheckSvnForCommonMimeTypes( |
+ input_api, output_api)) |
+ results.extend(input_api.canned_checks.CheckLicense( |
+ input_api, output_api, license_header, source_file_filter=sources)) |
+ results.extend(_CheckConstNSObject( |
+ input_api, output_api, source_file_filter=sources)) |
+ results.extend(_CheckSingletonInHeaders( |
+ input_api, output_api, source_file_filter=sources)) |
+ return results |