Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Unified Diff: git-try

Issue 516007: Rips the guts out of git-try since trychange.py is now supper awesome. (Closed)
Patch Set: Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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'))
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698