diff options
author | rmistry <rmistry@google.com> | 2015-03-12 07:48:40 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-12 07:48:40 -0700 |
commit | 01cbf6c4673b805ab80e2b37e35eb4c89b135a1b (patch) | |
tree | f3fae603d7b10ef611d2564ba1d3efb5a2375051 /PRESUBMIT.py | |
parent | 2e1c47e13551dfc592bd3d92074f3f4b69c4b6a9 (diff) |
Make presubmit check that #if or #ifdef does not come before includes.
BUG=skia:3362
Review URL: https://codereview.chromium.org/998273002
Diffstat (limited to 'PRESUBMIT.py')
-rw-r--r-- | PRESUBMIT.py | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index a4d90c8a8e..d62249a605 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py @@ -77,6 +77,47 @@ def _PythonChecks(input_api, output_api): white_list=affected_python_files) +def _IfDefChecks(input_api, output_api): + """Ensures if/ifdef are not before includes. See skbug/3362 for details.""" + comment_block_start_pattern = re.compile('^\s*\/\*.*$') + comment_block_middle_pattern = re.compile('^\s+\*.*') + comment_block_end_pattern = re.compile('^\s+\*\/.*$') + single_line_comment_pattern = re.compile('^\s*//.*$') + def is_comment(line): + return (comment_block_start_pattern.match(line) or + comment_block_middle_pattern.match(line) or + comment_block_end_pattern.match(line) or + single_line_comment_pattern.match(line)) + + empty_line_pattern = re.compile('^\s*$') + def is_empty_line(line): + return empty_line_pattern.match(line) + + failing_files = [] + for affected_file in input_api.AffectedSourceFiles(None): + affected_file_path = affected_file.LocalPath() + if affected_file_path.endswith('.cpp') or affected_file_path.endswith('.h'): + f = open(affected_file_path) + for line in f.xreadlines(): + if is_comment(line) or is_empty_line(line): + continue + # The below will be the first real line after comments and newlines. + if line.startswith('#if 0 '): + pass + elif line.startswith('#if ') or line.startswith('#ifdef '): + failing_files.append(affected_file_path) + break + + results = [] + if failing_files: + results.append( + output_api.PresubmitError( + 'The following files have #if or #ifdef before includes:\n%s\n\n' + 'See skbug.com/3362 for why this should be fixed.' % + '\n'.join(failing_files))) + return results + + def _CommonChecks(input_api, output_api): """Presubmit checks common to upload and commit.""" results = [] @@ -90,6 +131,7 @@ def _CommonChecks(input_api, output_api): _CheckChangeHasEol( input_api, output_api, source_file_filter=sources)) results.extend(_PythonChecks(input_api, output_api)) + results.extend(_IfDefChecks(input_api, output_api)) return results |