Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Unified Diff: PRESUBMIT.py

Issue 998273002: Make presubmit check that #if or #ifdef does not come before includes (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Cleanup Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: PRESUBMIT.py
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index a4d90c8a8e88d1fec2dad3af6fe2e7472e3a396b..089670fe80154699ad99f26aa3aa32b7f8616583 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -77,6 +77,46 @@ 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."""
+ copyright_start_pattern = re.compile('\/\*\w*\n')
+ copyright_middle_pattern = re.compile(' \*.*\n')
+ copyright_end_pattern = re.compile(' \*\/.*\n')
borenet 2015/03/12 12:47:48 Suggest using '^\/\*w*$' etc
rmistry 2015/03/12 13:13:59 Yes, I forgot to do this. Done.
+ def is_in_copyright_block(line):
+ return (copyright_start_pattern.match(line) or
+ copyright_middle_pattern.match(line) or
+ copyright_end_pattern.match(line))
+
+ empty_line_pattern = re.compile('\w*\n\w*')
borenet 2015/03/12 12:47:48 Shouldn't this be '^$' ? Why match characters in
rmistry 2015/03/12 13:13:59 This is to treat lines that have only whitespaces
+ 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_in_copyright_block(line) or is_empty_line(line):
+ continue
+ # The below will be the first real line after the copyright block and
+ # newlines.
+ if line.startswith('#if 0 '):
+ pass
borenet 2015/03/12 12:47:48 Why not break here?
rmistry 2015/03/12 13:13:59 Either way works. I prefer having less places to e
+ 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 +130,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
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698