Index: PRESUBMIT.py |
diff --git a/PRESUBMIT.py b/PRESUBMIT.py |
index f850b03948c9b2e1a03a9960ef8f54a3bc2d9cb2..c7e956a0b2b03beb45fb3f1b6639b62360dced67 100644 |
--- a/PRESUBMIT.py |
+++ b/PRESUBMIT.py |
@@ -8,11 +8,97 @@ See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts |
for more details about the presubmit API built into gcl. |
""" |
+import imp |
+import os |
+import scm |
+import subprocess |
+import tempfile |
+ |
+def _CheckBuildStatus(input_api, output_api): |
+ results = [] |
+ status_check = input_api.canned_checks.CheckTreeIsOpen( |
+ input_api, |
+ output_api, |
+ json_url='http://dart-status.appspot.com/current?format=json') |
+ results.extend(status_check) |
+ return results |
+ |
+def _CheckDartFormat(input_api, output_api): |
+ local_root = input_api.change.RepositoryRoot() |
+ upstream = input_api.change._upstream |
+ utils = imp.load_source('utils', |
+ os.path.join(local_root, 'tools', 'utils.py')) |
+ |
+ prebuilt_dartfmt = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dartfmt') |
+ |
+ windows = utils.GuessOS() == 'win32' |
+ if windows: |
+ prebuilt_dartfmt += '.bat' |
+ |
+ if not os.path.isfile(prebuilt_dartfmt): |
+ print('WARNING: dartfmt not found: %s' % (prebuilt_dartfmt)) |
+ return [] |
+ |
+ def HasFormatErrors(filename=None, contents=None): |
+ args = [prebuilt_dartfmt, '--set-exit-if-changed'] |
+ if contents: |
+ process = subprocess.Popen(args, |
+ stdout=subprocess.PIPE, |
+ stdin=subprocess.PIPE |
+ ) |
+ out, err = process.communicate(input=contents) |
+ |
+ # There was a bug in the return code dartfmt returns when reading from |
+ # stdin so we have to check whether the content matches rather than using |
+ # the return code. When the next version of the dartfmt lands in the sdk |
+ # we can switch this line to "return process.returncode != 0" |
+ return out != contents |
+ else: |
+ try: |
+ subprocess.check_output(args + [filename, '-n']) |
+ except subprocess.CalledProcessError: |
+ return True |
+ return False |
+ |
+ unformatted_files = [] |
+ for git_file in input_api.AffectedTextFiles(): |
+ filename = git_file.AbsoluteLocalPath() |
+ if filename.endswith('.dart'): |
+ if HasFormatErrors(filename=filename): |
+ old_version_has_errors = False |
+ try: |
+ path = git_file.LocalPath() |
+ if windows: |
+ # Git expects a linux style path. |
+ path = path.replace(os.sep, '/') |
+ old_contents = scm.GIT.Capture( |
+ ['show', upstream + ':' + path], |
+ cwd=local_root, |
+ strip_out=False) |
+ if HasFormatErrors(contents=old_contents): |
+ old_version_has_errors = True |
+ except subprocess.CalledProcessError as e: |
+ # TODO(jacobr): verify that the error really is that the file was |
+ # added for this CL. |
+ old_version_has_errors = False |
+ |
+ if old_version_has_errors: |
+ print("WARNING: %s has existing and possibly new dartfmt issues" % |
+ git_file.LocalPath()) |
+ else: |
+ unformatted_files.append(filename) |
+ |
+ if unformatted_files: |
+ return [output_api.PresubmitError( |
+ 'File output does not match dartfmt.\n' |
+ 'Fix these issues with:\n' |
+ 'dartfmt -w \\\n%s' % ' \\\n'.join(unformatted_files))] |
+ |
+ return [] |
+ |
def CheckChangeOnCommit(input_api, output_api): |
- results = [] |
- status_check = input_api.canned_checks.CheckTreeIsOpen( |
- input_api, |
- output_api, |
- json_url='http://dart-status.appspot.com/current?format=json') |
- results.extend(status_check) |
- return results |
+ return (_CheckBuildStatus(input_api, output_api) + |
+ _CheckDartFormat(input_api, output_api)) |
+ |
+def CheckChangeOnUpload(input_api, output_api): |
+ return _CheckDartFormat(input_api, output_api) |