Index: tools/presubmit.py |
diff --git a/tools/presubmit.py b/tools/presubmit.py |
index 0e86063d6de89f2ef8911c4b721ca36d62c54c0b..3f0fa2b913917dcba3e1f4d60eebcffef3a48e7e 100755 |
--- a/tools/presubmit.py |
+++ b/tools/presubmit.py |
@@ -35,6 +35,7 @@ except ImportError, e: |
md5er = md5.new |
+import json |
import optparse |
import os |
from os.path import abspath, join, dirname, basename, exists |
@@ -407,7 +408,51 @@ def CheckExternalReferenceRegistration(workspace): |
[sys.executable, join(workspace, "tools", "external-reference-check.py")]) |
return code == 0 |
+ |
+def _CheckStatusFileForDuplicateKeys(filepath): |
+ comma_space_bracket = re.compile(", *]") |
+ lines = [] |
+ with open(filepath) as f: |
+ for line in f.readlines(): |
+ # Skip all-comment lines. |
+ if line.lstrip().startswith("#"): continue |
+ # Strip away comments at the end of the line. |
+ comment_start = line.find("#") |
+ if comment_start != -1: |
+ line = line[:comment_start] |
+ line = line.strip() |
+ # Strip away trailing commas within the line. |
+ line = comma_space_bracket.sub("]", line) |
+ if len(line) > 0: |
+ lines.append(line) |
+ |
+ # Strip away trailing commas at line ends. Ugh. |
+ for i in range(len(lines) - 1): |
+ if (lines[i].endswith(",") and len(lines[i + 1]) > 0 and |
+ lines[i + 1][0] in ("}", "]")): |
+ lines[i] = lines[i][:-1] |
+ |
+ contents = "\n".join(lines) |
+ # JSON wants double-quotes. |
+ contents = contents.replace("'", '"') |
+ # Fill in keywords (like PASS, SKIP). |
+ for key in statusfile.KEYWORDS: |
+ contents = re.sub(r"\b%s\b" % key, "\"%s\"" % key, contents) |
+ |
+ status = {"success": True} |
+ def check_pairs(pairs): |
+ keys = {} |
+ for key, value in pairs: |
+ if key in keys: |
+ print("%s: Error: duplicate key %s" % (filepath, key)) |
+ status["success"] = False |
+ keys[key] = True |
+ |
+ json.loads(contents, object_pairs_hook=check_pairs) |
+ return status["success"] |
+ |
def CheckStatusFiles(workspace): |
+ success = True |
suite_paths = utils.GetSuitePaths(join(workspace, "test")) |
for root in suite_paths: |
suite_path = join(workspace, "test", root) |
@@ -415,8 +460,10 @@ def CheckStatusFiles(workspace): |
suite = testsuite.TestSuite.LoadTestSuite(suite_path) |
if suite and exists(status_file_path): |
if not statusfile.PresubmitCheck(status_file_path): |
Michael Achenbach
2015/11/27 14:24:20
suggestion: Maybe rewrite this with:
success &= C
Jakob Kummerow
2015/11/27 14:43:26
Done.
|
- return False |
- return True |
+ success = False |
+ if not _CheckStatusFileForDuplicateKeys(status_file_path): |
+ success = False |
+ return success |
def CheckAuthorizedAuthor(input_api, output_api): |
"""For non-googler/chromites committers, verify the author's email address is |