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