#!/usr/bin/python # 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 # Find depot_tools in PATH, append it to sys.path so we can import. paths = os.environ.get("PATH") for path in paths.split(':'): if not path.endswith("depot_tools"): continue sys.path.append(path) break 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) # Ensure we were called with the necessary number of arguments. program_name = os.path.basename(sys.argv[0]) if len(sys.argv) < 2: raise Exception("usage: %s [upstream branch]" % program_name) # Get arguments from how we were called. commit = (program_name == 'pre-cl-dcommit') upstream_branch = sys.argv[1] # 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)