| # 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 |
| |
| import breakpad |
| |
| import presubmit_support |
| import scm |
| import watchlists |
| |
| def Backquote(cmd, cwd=None): |
| """Like running `cmd` in a shell script.""" |
| return subprocess.Popen(cmd, |
| cwd=cwd, |
| stdout=subprocess.PIPE).communicate()[0].strip() |
| |
| def BackquoteAsInteger(cmd, cwd=None): |
| """Like Backquote, but returns either an int or None.""" |
| try: |
| return int(Backquote(cmd, cwd)) |
| except ValueError: |
| return None |
| |
| |
| 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 = Backquote(['git', 'rev-parse', '--show-cdup']) |
| if not root: |
| root = "." |
| absroot = os.path.abspath(root) |
| 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) |
| files = scm.GIT.CaptureStatus([root], upstream_branch) |
| issue = BackquoteAsInteger(['git', 'cl', 'status', '--field=id']) |
| patchset = BackquoteAsInteger(['git', 'cl', 'status', '--field=patch']) |
| if issue: |
| description = Backquote(['git', 'cl', 'status', '--field=desc']) |
| else: |
| description = m.group(2) |
| self.change = presubmit_support.GitChange(name, description, absroot, 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) |
| |
| # Apply watchlists on upload. |
| if not commit: |
| watchlist = watchlists.Watchlists(options.change.RepositoryRoot()) |
| files = [f.LocalPath() for f in options.change.AffectedFiles()] |
| watchers = watchlist.GetWatchersForPaths(files) |
| Backquote(['git', 'config', '--replace-all', |
| 'rietveld.extracc', ','.join(watchers)]) |
| |
| # 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) |