# 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.") # We use the sha1 of HEAD as a name of this change. name = Backquote(['git', 'rev-parse', 'HEAD']) 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: # If the change was never uploaded, use the log messages of all commits # up to the branch point, as git cl upload will prefill the description # with these log messages. description = Backquote(['git', 'log', '--pretty=format:%s%n%n%b', '%s...' % (upstream_branch)]) 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)