| 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
|
|
|