| Index: git-try
|
| diff --git a/git-try b/git-try
|
| index ebb6525a0653591ca306787b2637844dd7b18623..bd78ebf957c7dbf714e7deb3745311f5132e91f2 100755
|
| --- a/git-try
|
| +++ b/git-try
|
| @@ -4,268 +4,35 @@
|
| # found in the LICENSE file.
|
| """Wrapper for trychange.py for git checkout."""
|
|
|
| -import getpass
|
| -import optparse
|
| -import os
|
| -import re
|
| -import subprocess
|
| import sys
|
| -import tempfile
|
| -import traceback
|
| -import urllib
|
|
|
| -import breakpad
|
| +try:
|
| + import breakpad
|
| +except ImportError:
|
| + pass
|
|
|
| +from scm import GIT
|
| import trychange
|
|
|
|
|
| -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 GetTryServerConfig():
|
| - """Returns the dictionary of try server options or None if they
|
| - cannot be found."""
|
| - script_path = 'tools/tryserver/tryserver.py'
|
| - root_dir = Backquote(['git', 'rev-parse', '--show-cdup'])
|
| - try:
|
| - script_file = open(os.path.join(root_dir, script_path))
|
| - except IOError:
|
| - return None
|
| - locals = {}
|
| - try:
|
| - exec(script_file, locals)
|
| - except Exception, e:
|
| - return None
|
| - return locals
|
| -
|
| -
|
| -def GetBranchName(working_dir=None):
|
| - """Return name of current git branch."""
|
| - branch = Backquote(['git', 'symbolic-ref', 'HEAD'], working_dir)
|
| - if not branch.startswith('refs/heads/'):
|
| - raise "Couldn't figure out branch name"
|
| - branch = branch[len('refs/heads/'):]
|
| - return branch
|
| -
|
| -
|
| -def GetPatchName(working_dir=None):
|
| - """Construct a name for this patch."""
|
| - short_sha = Backquote(['git', 'rev-parse', '--short=4', 'HEAD'], working_dir)
|
| - return GetBranchName() + '-' + short_sha
|
| -
|
| -
|
| def GetRietveldIssueNumber():
|
| - return Backquote(['git', 'config',
|
| - 'branch.%s.rietveldissue' % GetBranchName()])
|
| + return GIT.Capture(
|
| + ['config', 'branch.%s.rietveldissue' % GIT.GetBranch(None)],
|
| + error_ok=True)
|
|
|
|
|
| def GetRietveldPatchsetNumber():
|
| - return Backquote(['git', 'config',
|
| - 'branch.%s.rietveldpatchset' % GetBranchName()])
|
| -
|
| -def GetSubRepWorkingDir(sub_rep_path):
|
| - """Computes the path to the sub repository"""
|
| - if sub_rep_path:
|
| - root_dir = os.path.abspath(Backquote(['git', 'rev-parse', '--show-cdup']))
|
| - return os.path.join(root_dir, sub_rep_path)
|
| - return None
|
| -
|
| -def GetMungedDiff(branch, prefix, sub_rep_path):
|
| - """Get the diff we'll send to the try server. We munge paths to match svn.
|
| - We add the prefix that the try bot is expecting. If sub_rep_path is
|
| - provided, diff will be calculated in the sub repository.
|
| - We also return the list of files in this diff, without munged paths."""
|
| - # Make the following changes:
|
| - # - Prepend "src/" (or some other prefix) to paths as svn is expecting
|
| - # - In the case of added files, replace /dev/null with the path to the file
|
| - # being added.
|
| -
|
| - cwd = GetSubRepWorkingDir(sub_rep_path)
|
| -
|
| - output = []
|
| - if not branch:
|
| - # Try to guess the upstream branch.
|
| - branch = Backquote(['git', 'cl', 'upstream'], cwd)
|
| - command = ['git', 'diff-tree', '-p']
|
| -
|
| - new_cwd = None
|
| - if not sub_rep_path:
|
| - command.extend(['--no-prefix'])
|
| - else:
|
| - # Append /
|
| - sub_rep_path = os.path.join(sub_rep_path, '')
|
| - # Add the right prefix
|
| - command.extend(['--src-prefix=' + sub_rep_path])
|
| - command.extend(['--dst-prefix=' + sub_rep_path])
|
| -
|
| - command.extend([branch, 'HEAD'])
|
| -
|
| - # Run diff tree
|
| - diff = subprocess.Popen(command,
|
| - stdout=subprocess.PIPE,
|
| - cwd=cwd).stdout.readlines()
|
| - # Replace --- /dev/null with --- <new file name>
|
| - for i in range(len(diff)):
|
| - line = diff[i]
|
| - if line.startswith('--- /dev/null'):
|
| - line = '--- %s' % diff[i+1][4:]
|
| - output.append(line)
|
| - diff = output
|
| -
|
| - # Add root prefix
|
| - output = []
|
| - file_set = set()
|
| - for line in diff:
|
| - if line.startswith('--- ') or line.startswith('+++ '):
|
| - filename = line[4:]
|
| - line = line[0:4] + os.path.join(prefix, filename)
|
| - file_set.add(filename.rstrip('\r\n'))
|
| - output.append(line)
|
| -
|
| - munged_diff = ''.join(output)
|
| - if len(munged_diff.strip()) == 0:
|
| - raise Exception("Patch was empty, did you give the right remote branch?")
|
| -
|
| - return (munged_diff, list(file_set))
|
| -
|
| -def OneRepositoryDiff(diff_file, patch_names, branch, prefix, sub_rep_path):
|
| - """Computes a diff for one git repository at a given path against a given
|
| - branch. Writes the diff into diff_file and appends a name to the
|
| - patch_names list.
|
| -
|
| - Returns the list of files in the diff."""
|
| -
|
| - (diff, file_list) = GetMungedDiff(branch, prefix, sub_rep_path)
|
| -
|
| - # Write the diff out
|
| - diff_file.write(diff)
|
| -
|
| - # Add patch name to list of patches
|
| - patch_name = GetPatchName(GetSubRepWorkingDir(sub_rep_path))
|
| - patch_names.extend([patch_name])
|
| - return file_list
|
| -
|
| -
|
| -def ValidEmail(email):
|
| - return re.match(r"^[a-zA-Z0-9._%-+]+@[a-zA-Z0-9._%-]+.[a-zA-Z]{2,6}$", email)
|
| -
|
| -
|
| -def GetEmail():
|
| - email = Backquote(['git', 'config', 'user.email'])
|
| - runmsg = "Try: git config user.email <EMAIL>"
|
| - assert ValidEmail(email), "Email '%s' is not valid. %s" % (email, runmsg)
|
| - return email
|
| -
|
| -
|
| -def TryChange(args, file_list):
|
| - """Put a patch on the try server."""
|
| - trychange.TryChange(args, file_list, False)
|
| + return GIT.Capture(
|
| + ['config', 'branch.%s.rietveldpatchset' % GIT.GetBranch(None)],
|
| + error_ok=True)
|
|
|
|
|
| if __name__ == '__main__':
|
| - parser = optparse.OptionParser(
|
| - usage='git try [options] [branch]',
|
| - description='Upload the current diff of branch...HEAD to the try server.')
|
| - parser.add_option("-b", "--bot", action="append",
|
| - help="Force the use of a specific build slave (eg mac, "
|
| - "win, or linux)")
|
| - parser.add_option("-c", "--clobber", action="store_true",
|
| - help="Make the try run use be a clobber build")
|
| - parser.add_option("-r", "--revision",
|
| - help="Specify the SVN base revision to use")
|
| - parser.add_option("--root", default="src", metavar="PATH",
|
| - help="Specify the root prefix that is prepended to paths "
|
| - "in the patch")
|
| - parser.add_option("--dry_run", action="store_true",
|
| - help="Print the diff but don't send it to the try bots")
|
| - parser.add_option("--sub_rep", nargs=2, action="append", default=[],
|
| - metavar="PATH BRANCH",
|
| - help="Specify a path to a git sub-repository and a branch "
|
| - "to diff with in order to simultanously try changes "
|
| - "in multiple git repositories. Option may be "
|
| - "specified multiple times.")
|
| - parser.add_option("--webkit", metavar="BRANCH",
|
| - help="Specify webkit branch. Syntactic sugar for "
|
| - "--sub_rep third_party/WebKit/ <branch>")
|
| -
|
| - (options, args) = parser.parse_args(sys.argv)
|
| -
|
| - if options.webkit:
|
| - options.sub_rep.extend([('third_party/WebKit/', options.webkit)])
|
| -
|
| - branch = None
|
| - if len(args) > 1:
|
| - branch = args[1]
|
| - patch_names = []
|
| -
|
| - # Dump all diffs into one diff file.
|
| - diff_file = tempfile.NamedTemporaryFile()
|
| -
|
| - # Calculate diff for main git repository.
|
| - file_list = OneRepositoryDiff(diff_file, patch_names, branch, options.root,
|
| - None)
|
| -
|
| - # Calculate diff for each extra git repository.
|
| - for path_and_branch in options.sub_rep:
|
| - file_list.extend(OneRepositoryDiff(diff_file,
|
| - patch_names,
|
| - path_and_branch[1],
|
| - options.root,
|
| - path_and_branch[0]))
|
| - # Make diff file ready for reading.
|
| - diff_file.flush()
|
| -
|
| - # Concatenate patch names
|
| - # Prepare args for TryChange
|
| - email = GetEmail()
|
| - user = email.partition('@')[0]
|
| - args = [
|
| - '-u', user,
|
| - '-e', email,
|
| - '-n', '-'.join(patch_names),
|
| - '--diff', diff_file.name,
|
| - ]
|
| -
|
| - # Send to try server via HTTP if we can parse the config, otherwise
|
| - # upload via SVN.
|
| - config = GetTryServerConfig()
|
| - if config is not None:
|
| - sendmsg = "Sending %s using HTTP..." % '-'.join(patch_names)
|
| - args.extend(['--use_http'])
|
| - if config['try_server_http_host'] is not None:
|
| - args.extend(['--host', config['try_server_http_host']])
|
| - if config['try_server_http_port'] is not None:
|
| - args.extend(['--port', config['try_server_http_port']])
|
| -
|
| - else:
|
| - print "Could not get server config -- if you're within Google, "
|
| - print "do you have have src-internal checked out?"
|
| - sendmsg = "Sending %s using SVN..." % '-'.join(patch_names)
|
| - args.extend([
|
| - '--use_svn', '--svn_repo',
|
| - 'svn://svn.chromium.org/chrome-try/try',
|
| - ])
|
| -
|
| - if options.bot:
|
| - for bot in options.bot:
|
| - args.extend(['--bot', bot])
|
| - if options.clobber:
|
| - args.append('--clobber')
|
| - if options.revision:
|
| - args.extend(['-r', options.revision])
|
| - if GetRietveldPatchsetNumber():
|
| + args = sys.argv[:]
|
| + patchset = GetRietveldPatchsetNumber()
|
| + if patchset:
|
| args.extend([
|
| '--issue', GetRietveldIssueNumber(),
|
| - '--patchset', GetRietveldPatchsetNumber(),
|
| + '--patchset', patchset,
|
| ])
|
| -
|
| - if options.dry_run:
|
| - print open(diff_file.name, 'r').read()
|
| - exit(0)
|
| -
|
| - print sendmsg
|
| - TryChange(args, file_list)
|
| + sys.exit(trychange.TryChange(args, [], False, 'git-try'))
|
|
|