Mercurial > public > mercurial-scm > hg-stable
diff mercurial/subrepo.py @ 40440:69d4c8c5c25e stable
subrepo: print the status line before creating the peer for better diagnostics
I ran into a problem where I tried updating to a different branch, and the
process appeared to hang. It turned out that the subrepo revision wasn't
available locally, and I must have originally cloned it from an `hg serve -S` on
a machine that currently wasn't serving anything. It took 2+ minutes to
timeout, and didn't mention what it was connecting to even then.
There are a couple of other issues in this scenario too.
- The repo is dirty after the failed checkout because the top level repo is
updated first. We should probably make 2 passes- top down to pull
everything needed, and then do an update once everything is in place.
- Something must be reading .hgsubstate from wdir because if the same merge
command is run after the timeout, a prompt is issued that the local and
remote subrepo diverged, instead of hanging. But it lists the local version
and remote version as having the same hash.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Fri, 16 Nov 2018 18:37:26 -0500 |
parents | 6f152067ba57 |
children | 9199548525fc |
line wrap: on
line diff
--- a/mercurial/subrepo.py Wed Nov 14 11:52:13 2018 -0500 +++ b/mercurial/subrepo.py Fri Nov 16 18:37:26 2018 -0500 @@ -622,7 +622,11 @@ return True self._repo._subsource = source srcurl = _abssource(self._repo) - other = hg.peer(self._repo, {}, srcurl) + + # Defer creating the peer until after the status message is logged, in + # case there are network problems. + getpeer = lambda: hg.peer(self._repo, {}, srcurl) + if len(self._repo) == 0: # use self._repo.vfs instead of self.wvfs to remove .hg only self._repo.vfs.rmtree() @@ -636,7 +640,7 @@ self.ui.status(_('sharing subrepo %s from %s\n') % (subrelpath(self), srcurl)) shared = hg.share(self._repo._subparent.baseui, - other, self._repo.root, + getpeer(), self._repo.root, update=False, bookmarks=False) self._repo = shared.local() else: @@ -657,7 +661,7 @@ self.ui.status(_('cloning subrepo %s from %s\n') % (subrelpath(self), util.hidepassword(srcurl))) other, cloned = hg.clone(self._repo._subparent.baseui, {}, - other, self._repo.root, + getpeer(), self._repo.root, update=False, shareopts=shareopts) self._repo = cloned.local() self._initrepo(parentrepo, source, create=True) @@ -666,7 +670,7 @@ self.ui.status(_('pulling subrepo %s from %s\n') % (subrelpath(self), util.hidepassword(srcurl))) cleansub = self.storeclean(srcurl) - exchange.pull(self._repo, other) + exchange.pull(self._repo, getpeer()) if cleansub: # keep the repo clean after pull self._cachestorehash(srcurl)