diff mercurial/commands.py @ 25425:9263f86b9681 stable

pull: avoid race condition with 'hg pull --rev name --update' (issue4706) The previous scheme was: 1) lookup node for all pulled revision, 2) pull said node 3) lookup the node of the checkout target 4) update the repository there. If the remote repo changes between (1) and (3), the resolved name will be different and (3) crash. There is actually no need for a remote lookup during (3), we could just set the value in (1). This prevent the race condition and save a possible network roundtrip.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Wed, 03 Jun 2015 14:29:11 -0700
parents a4ee6f774f14
children d0c7ffc4c8bc 8dd0b23161bf
line wrap: on
line diff
--- a/mercurial/commands.py	Mon Jun 01 14:42:55 2015 -0400
+++ b/mercurial/commands.py	Wed Jun 03 14:29:11 2015 -0700
@@ -5112,7 +5112,13 @@
 
         if revs:
             try:
-                revs = [other.lookup(rev) for rev in revs]
+                oldrevs = revs
+                revs = [] # actually, nodes
+                for r in oldrevs:
+                    node = other.lookup(r)
+                    revs.append(node)
+                    if r == checkout:
+                        checkout = node
             except error.CapabilityError:
                 err = _("other repository doesn't support revision lookup, "
                         "so a rev cannot be specified.")
@@ -5122,7 +5128,7 @@
                                  force=opts.get('force'),
                                  bookmarks=opts.get('bookmark', ())).cgresult
         if checkout:
-            checkout = str(repo.changelog.rev(other.lookup(checkout)))
+            checkout = str(repo.changelog.rev(checkout))
         repo._subtoppath = source
         try:
             ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)