Mercurial > hg
changeset 13178:c4d857f5405d
subrepo: backout 519ac79d680b
Unfortunately git 1.6 does not support the upstream parameter in for-each-ref.
author | Eric Eisner <ede@mit.edu> |
---|---|
date | Mon, 20 Dec 2010 13:59:19 -0500 |
parents | 04c8f3787546 |
children | b512a7074349 |
files | mercurial/subrepo.py |
diffstat | 1 files changed, 23 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/subrepo.py Mon Dec 20 12:12:18 2010 -0600 +++ b/mercurial/subrepo.py Mon Dec 20 13:59:19 2010 -0500 @@ -678,27 +678,37 @@ return base == r1 def _gitbranchmap(self): - '''returns 3 things: + '''returns 2 things: a map from git branch to revision - a map from revision to branches - a map from remote branch to local tracking branch''' + a map from revision to branches''' branch2rev = {} rev2branch = {} - tracking = {} + out = self._gitcommand(['for-each-ref', '--format', - '%(objectname) %(refname) %(upstream) end']) + '%(objectname) %(refname)']) for line in out.split('\n'): - revision, ref, upstream = line.split(' ')[:3] + revision, ref = line.split(' ') if ref.startswith('refs/tags/'): continue if ref.startswith('refs/remotes/') and ref.endswith('/HEAD'): continue # ignore remote/HEAD redirects branch2rev[ref] = revision rev2branch.setdefault(revision, []).append(ref) - if upstream: - # assumes no more than one local tracking branch for a remote - tracking[upstream] = ref - return branch2rev, rev2branch, tracking + return branch2rev, rev2branch + + def _gittracking(self, branches): + 'return map of remote branch to local tracking branch' + # assumes no more than one local tracking branch for each remote + tracking = {} + for b in branches: + if b.startswith('refs/remotes/'): + continue + remote = self._gitcommand(['config', 'branch.%s.remote' % b]) + if remote: + ref = self._gitcommand(['config', 'branch.%s.merge' % b]) + tracking['refs/remotes/%s/%s' % + (remote, ref.split('/', 2)[2])] = b + return tracking def _fetch(self, source, revision): if not os.path.exists('%s/.git' % self._path): @@ -735,7 +745,7 @@ return elif self._gitstate() == revision: return - branch2rev, rev2branch, tracking = self._gitbranchmap() + branch2rev, rev2branch = self._gitbranchmap() def rawcheckout(): # no branch to checkout, check it out with no branch @@ -761,6 +771,7 @@ self._gitcommand(['checkout', firstlocalbranch]) return + tracking = self._gittracking(branch2rev.keys()) # choose a remote branch already tracked if possible remote = branches[0] if remote not in tracking: @@ -813,7 +824,7 @@ def push(self, force): # if a branch in origin contains the revision, nothing to do - branch2rev, rev2branch, tracking = self._gitbranchmap() + branch2rev, rev2branch = self._gitbranchmap() if self._state[1] in rev2branch: for b in rev2branch[self._state[1]]: if b.startswith('refs/remotes/origin/'):