| # Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import re |
| import subprocess |
| import sys |
| |
| # Imported from depot_tools. |
| import gclient_scm |
| import presubmit_support |
| |
| def Backquote(cmd, cwd=None): |
| """Like running `cmd` in a shell script.""" |
| return subprocess.Popen(cmd, |
| cwd=cwd, |
| stdout=subprocess.PIPE).communicate()[0].strip() |
| |
| |
| class ChangeOptions: |
| def __init__(self, commit=None, upstream_branch=None): |
| self.commit = commit |
| self.verbose = None |
| self.default_presubmit = None |
| self.may_prompt = None |
| |
| root = os.path.abspath(Backquote(['git', 'rev-parse', '--show-cdup'])) |
| if not root: |
| raise Exception("Could not get root directory.") |
| log = Backquote(['git', 'show', '--name-only', |
| '--pretty=format:%H%n%s%n%n%b']) |
| m = re.match(r'^(\w+)\n(.*)$', log, re.MULTILINE|re.DOTALL) |
| if not m: |
| raise Exception("Could not parse log message: %s" % log) |
| name = m.group(1) |
| description = m.group(2) |
| files = gclient_scm.CaptureGitStatus([root], upstream_branch) |
| issue = Backquote(['git', 'cl', 'status', '--field=id']) |
| patchset = None |
| self.change = presubmit_support.GitChange(name, description, root, files, |
| issue, patchset) |
| |
| |
| def RunHooks(hook_name, upstream_branch): |
| commit = (hook_name == 'pre-cl-dcommit') |
| |
| # Create our options based on the command-line args and the current checkout. |
| options = ChangeOptions(commit=commit, upstream_branch=upstream_branch) |
| |
| # Run the presubmit checks. |
| if presubmit_support.DoPresubmitChecks(options.change, |
| options.commit, |
| options.verbose, |
| sys.stdout, |
| sys.stdin, |
| options.default_presubmit, |
| options.may_prompt): |
| sys.exit(0) |
| else: |
| sys.exit(1) |