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))