Mercurial > hg
changeset 13152:70d80907e4b8
subrepo: defer determination of git's current branch
author | Eric Eisner <ede@mit.edu> |
---|---|
date | Tue, 14 Dec 2010 21:56:43 -0500 |
parents | 519ac79d680b |
children | dca5488f0e4f |
files | mercurial/subrepo.py |
diffstat | 1 files changed, 14 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/subrepo.py Tue Dec 14 21:56:43 2010 -0500 +++ b/mercurial/subrepo.py Tue Dec 14 21:56:43 2010 -0500 @@ -660,6 +660,12 @@ def _gitstate(self): return self._gitcommand(['rev-parse', 'HEAD']) + def _gitcurrentbranch(self): + current, err = self._gitdir(['symbolic-ref', 'HEAD', '--quiet']) + if err: + current = None + return current + def _githavelocally(self, revision): out, code = self._gitdir(['cat-file', '-e', revision]) return code == 0 @@ -670,16 +676,12 @@ def _gitbranchmap(self): '''returns 3 things: - the current branch, a map from git branch to revision - a map from revision to branches''' + a map from revision to branches + a map from remote branch to local tracking branch''' branch2rev = {} rev2branch = {} tracking = {} - current, err = self._gitdir(['symbolic-ref', 'HEAD', '--quiet']) - if err: - current = None - out = self._gitcommand(['for-each-ref', '--format', '%(objectname) %(refname) %(upstream) end']) for line in out.split('\n'): @@ -693,7 +695,7 @@ if upstream: # assumes no more than one local tracking branch for a remote tracking[upstream] = ref - return current, branch2rev, rev2branch, tracking + return branch2rev, rev2branch, tracking def _fetch(self, source, revision): if not os.path.exists('%s/.git' % self._path): @@ -731,7 +733,7 @@ return elif self._gitstate() == revision: return - current, branch2rev, rev2branch, tracking = self._gitbranchmap() + branch2rev, rev2branch, tracking = self._gitbranchmap() def rawcheckout(): # no branch to checkout, check it out with no branch @@ -776,7 +778,7 @@ # which is equivalent to updating the local branch to the remote. # Since we are only looking at branching at update, we need to # detect this situation and perform this action lazily. - if tracking[remote] != current: + if tracking[remote] != self._gitcurrentbranch(): self._gitcommand(['checkout', tracking[remote]]) self._gitcommand(['merge', '--ff', remote]) else: @@ -809,7 +811,7 @@ def push(self, force): # if a branch in origin contains the revision, nothing to do - current, branch2rev, rev2branch, tracking = self._gitbranchmap() + branch2rev, rev2branch, tracking = self._gitbranchmap() if self._state[1] in rev2branch: for b in rev2branch[self._state[1]]: if b.startswith('refs/remotes/origin/'): @@ -822,6 +824,8 @@ cmd = ['push'] if force: cmd.append('--force') + + current = self._gitcurrentbranch() if current: # determine if the current branch is even useful if not self._gitisancestor(self._state[1], current):