Make PRESUBMIT.py check changes on src/WATCHLISTS
First, parse WATCHLISTS. If it parses, scan the lines to check that:
- the entries are sorted
- WATCHLIST_DEFINITIONS matches WATCHLISTS.
The scanner doesn't parse the dictionary literal but extracts names
using re assuming that:
- the lines providing the name of rules matches a regexp pattern
- WATCHLIST_DEFINITIONS comes before WATCHLISTS
as it's sufficient for this purpose.
Stop grouping blink_.* rules and separating from the others in
WATCHLISTS_DEFINTIONS. WATCHLISTS already has them mixed.
As a bonus, remove an unused method GetDefaultTryConfigs().
Bug:
Change-Id: I92ccc1e4d31b9bdfb97f5cf187ee44191397c895
Reviewed-on: https://chromium-review.googlesource.com/593708
Commit-Queue: Paweł Hajdan Jr. <[email protected]>
Reviewed-by: Dirk Pranke <[email protected]>
Cr-Commit-Position: refs/heads/master@{#491353}
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 1161de84..b2d62f5 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -2134,6 +2134,64 @@
return results
+
+def _CheckEntriesInWATCHLISTSAreSorted(contents, input_api, output_api):
+ watchlists_start_re = input_api.re.compile(r"^ 'WATCHLISTS'")
+ entry_re = input_api.re.compile(r"^ '([\dA-Za-z_]+)'")
+
+ watchlist_definitions = []
+ watchlists = []
+
+ in_watchlists = False
+ for line in contents.split('\n'):
+ if not in_watchlists and watchlists_start_re.match(line) is not None:
+ in_watchlists = True
+ continue
+
+ m = entry_re.match(line)
+ if m is not None:
+ name = m.group(1)
+ if not in_watchlists:
+ watchlist_definitions.append(name)
+ else:
+ watchlists.append(name)
+
+ results = []
+
+ sorted_watchlist_definitions = sorted(watchlist_definitions)
+ if sorted_watchlist_definitions != watchlist_definitions:
+ results.append(output_api.PresubmitError(
+ 'WATCHLIST_DEFINITIONS entries are not sorted'))
+
+ sorted_watchlists = sorted(watchlists)
+ if sorted_watchlists != watchlists:
+ results.append(output_api.PresubmitError(
+ 'WATCHLISTS entries are not sorted'))
+
+ if watchlist_definitions != watchlists:
+ results.append(output_api.PresubmitError(
+ 'WATCHLIST_DEFINITIONS doesn\'t match WATCHLISTS'))
+
+ return results
+
+
+def _CheckWATCHLISTS(input_api, output_api):
+ for f in input_api.AffectedFiles(include_deletes=False):
+ if f.LocalPath() == 'WATCHLISTS':
+ contents = input_api.ReadFile(f, 'r')
+
+ try:
+ input_api.ast.literal_eval(contents)
+ except ValueError:
+ return [output_api.PresubmitError('Cannot parse WATCHLISTS' + e)]
+ except TypeError:
+ return [output_api.PresubmitError('Cannot parse WATCHLISTS' + e)]
+
+ return _CheckEntriesInWATCHLISTSAreSorted(contents, input_api, output_api)
+
+ return []
+
+
def _AndroidSpecificOnUploadChecks(input_api, output_api):
"""Groups checks that target android code."""
results = []
@@ -2195,6 +2253,7 @@
results.extend(_CheckUselessForwardDeclarations(input_api, output_api))
results.extend(_CheckForRiskyJsFeatures(input_api, output_api))
results.extend(_CheckForRelativeIncludes(input_api, output_api))
+ results.extend(_CheckWATCHLISTS(input_api, output_api))
if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()):
results.extend(input_api.canned_checks.RunUnitTestsInDirectory(
@@ -2472,19 +2531,6 @@
return master
-def GetDefaultTryConfigs(bots):
- """Returns a list of ('bot', set(['tests']), filtered by [bots].
- """
-
- builders_and_tests = dict((bot, set(['defaulttests'])) for bot in bots)
-
- # Build up the mapping from tryserver master to bot/test.
- out = dict()
- for bot, tests in builders_and_tests.iteritems():
- out.setdefault(GetTryServerMasterForBot(bot), {})[bot] = tests
- return out
-
-
def CheckChangeOnCommit(input_api, output_api):
results = []
results.extend(_CommonChecks(input_api, output_api))