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

Unified Diff: scm.py

Issue 6597004: Add configuration option for upstream branch and improve guessing the svn branch. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: review Created 9 years, 10 months 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 | « git_cl/git_cl.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: scm.py
diff --git a/scm.py b/scm.py
index 856370504bdd45cce91152e06ade84bd6119f36d..2690f1f9bb4fa3f83d3ef0bfc4c544668ec63064 100644
--- a/scm.py
+++ b/scm.py
@@ -144,45 +144,42 @@ class GIT(object):
"""Returns the svn branch name if found."""
# Try to figure out which remote branch we're based on.
# Strategy:
- # 1) find all git-svn branches and note their svn URLs.
- # 2) iterate through our branch history and match up the URLs.
+ # 1) iterate through our branch history and find the svn URL.
+ # 2) find the svn-remote that fetches from the URL.
# regexp matching the git-svn line that contains the URL.
git_svn_re = re.compile(r'^\s*git-svn-id: (\S+)@', re.MULTILINE)
- # Get the refname and svn url for all refs/remotes/*.
- remotes = GIT.Capture(
- ['for-each-ref', '--format=%(refname)', 'refs/remotes'],
- cwd=cwd).splitlines()
- svn_refs = {}
- for ref in remotes:
- match = git_svn_re.search(
- GIT.Capture(['cat-file', '-p', ref], cwd=cwd))
- # Prefer origin/HEAD over all others.
- if match and (match.group(1) not in svn_refs or
- ref == "refs/remotes/origin/HEAD"):
- svn_refs[match.group(1)] = ref
-
- svn_branch = ''
- if len(svn_refs) == 1:
- # Only one svn branch exists -- seems like a good candidate.
- svn_branch = svn_refs.values()[0]
- elif len(svn_refs) > 1:
- # We have more than one remote branch available. We don't
- # want to go through all of history, so read a line from the
- # pipe at a time.
- # The -100 is an arbitrary limit so we don't search forever.
- cmd = ['git', 'log', '-100', '--pretty=medium']
- proc = gclient_utils.Popen(cmd, stdout=subprocess.PIPE, cwd=cwd)
- for line in proc.stdout:
- match = git_svn_re.match(line)
+ # We don't want to go through all of history, so read a line from the
+ # pipe at a time.
+ # The -100 is an arbitrary limit so we don't search forever.
+ cmd = ['git', 'log', '-100', '--pretty=medium']
+ proc = gclient_utils.Popen(cmd, stdout=subprocess.PIPE)
+ for line in proc.stdout:
+ match = git_svn_re.match(line)
+ if match:
+ url = match.group(1)
+ proc.stdout.close() # Cut pipe.
+ break
+
+ if url:
+ svn_remote_re = re.compile(r'^svn-remote\.([^.]+)\.url (.*)$')
+ remotes = GIT.Capture(['config', '--get-regexp',
+ r'^svn-remote\..*\.url'], cwd=cwd).splitlines()
+ for remote in remotes:
+ match = svn_remote_re.match(remote)
if match:
- url = match.group(1)
- if url in svn_refs:
- svn_branch = svn_refs[url]
- proc.stdout.close() # Cut pipe.
- break
- return svn_branch
+ remote = match.group(1)
+ base_url = match.group(2)
+ fetch_spec = GIT.Capture(
+ ['config', 'svn-remote.%s.fetch' % remote],
+ cwd=cwd).strip().split(':')
+ if fetch_spec[0]:
+ full_url = base_url + '/' + fetch_spec[0]
+ else:
+ full_url = base_url
+ if full_url == url:
+ return fetch_spec[1]
@staticmethod
def FetchUpstreamTuple(cwd):
@@ -204,25 +201,37 @@ class GIT(object):
except gclient_utils.Error:
pass
else:
- # Fall back on trying a git-svn upstream branch.
- if GIT.IsGitSvn(cwd):
- upstream_branch = GIT.GetSVNBranch(cwd)
+ try:
+ upstream_branch = GIT.Capture(
+ ['config', 'rietveld.upstream-branch'], cwd=cwd).strip()
+ except gclient_utils.Error:
+ upstream_branch = None
+ if upstream_branch:
+ try:
+ remote = GIT.Capture(
+ ['config', 'rietveld.upstream-remote'], cwd=cwd).strip()
+ except gclient_utils.Error:
+ pass
else:
- # Else, try to guess the origin remote.
- remote_branches = GIT.Capture(['branch', '-r'], cwd=cwd).split()
- if 'origin/master' in remote_branches:
- # Fall back on origin/master if it exits.
- remote = 'origin'
- upstream_branch = 'refs/heads/master'
- elif 'origin/trunk' in remote_branches:
- # Fall back on origin/trunk if it exists. Generally a shared
- # git-svn clone
- remote = 'origin'
- upstream_branch = 'refs/heads/trunk'
+ # Fall back on trying a git-svn upstream branch.
+ if GIT.IsGitSvn(cwd):
+ upstream_branch = GIT.GetSVNBranch(cwd)
else:
- # Give up.
- remote = None
- upstream_branch = None
+ # Else, try to guess the origin remote.
+ remote_branches = GIT.Capture(['branch', '-r'], cwd=cwd).split()
+ if 'origin/master' in remote_branches:
+ # Fall back on origin/master if it exits.
+ remote = 'origin'
+ upstream_branch = 'refs/heads/master'
+ elif 'origin/trunk' in remote_branches:
+ # Fall back on origin/trunk if it exists. Generally a shared
+ # git-svn clone
+ remote = 'origin'
+ upstream_branch = 'refs/heads/trunk'
+ else:
+ # Give up.
+ remote = None
+ upstream_branch = None
return remote, upstream_branch
@staticmethod
« no previous file with comments | « git_cl/git_cl.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698