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)