[PATCH stable treemanifest] changegroup: fix treemanifest exchange code (issue5061)

Augie Fackler raf at durin42.com
Wed Jan 27 15:24:48 UTC 2016


# HG changeset patch
# User Augie Fackler <augie at google.com>
# Date 1453908265 18000
#      Wed Jan 27 10:24:25 2016 -0500
# Branch stable
# Node ID 7f7e25855eac3dafb388d63fb0b7f566334ff732
# Parent  4511e8dac4c798e5fed91e629aa9802b01c2b6c3
changegroup: fix treemanifest exchange code (issue5061)

There were two mistakes: one was accidental reuse of the fclnode
variable from the loop gathering file nodes, and the other (masked by
that bug) was not correctly handling deleted directories. Both cases
are now fixed and the test passes.

diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -778,12 +778,15 @@ class cg1packer(object):
                 if 'treemanifest' in repo.requirements:
                     submfs = {'/': mdata}
                     for dn, bn in _moddirs(mfchangedfiles[x]):
-                        submf = submfs[dn]
-                        submf = submf._dirs[bn]
+                        try:
+                            submf = submfs[dn]
+                            submf = submf._dirs[bn]
+                        except KeyError:
+                            continue # deleted directory, so nothing to send
                         submfs[submf.dir()] = submf
                         tmfclnodes = tmfnodes.setdefault(submf.dir(), {})
-                        tmfclnodes.setdefault(submf._node, clnode)
-                        if clrevorder[clnode] < clrevorder[fclnode]:
+                        tmfclnode = tmfclnodes.setdefault(submf._node, clnode)
+                        if clrevorder[clnode] < clrevorder[tmfclnode]:
                             tmfclnodes[n] = clnode
                 return clnode
 
diff --git a/tests/test-treemanifest.t b/tests/test-treemanifest.t
--- a/tests/test-treemanifest.t
+++ b/tests/test-treemanifest.t
@@ -332,6 +332,21 @@ Pushing from treemanifest repo to an emp
   $ grep treemanifest empty-repo/.hg/requires
   treemanifest
 
+Pushing to an empty repo makes that a treemanifest repo
+
+  $ hg --config experimental.treemanifest=1 init clone
+  $ grep treemanifest clone/.hg/requires
+  treemanifest
+  $ hg push -R repo clone
+  pushing to clone
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 11 changesets with 15 changes to 10 files (+3 heads)
+  $ grep treemanifest clone/.hg/requires
+  treemanifest
+
 Create deeper repo with tree manifests.
 
   $ hg --config experimental.treemanifest=True init deeprepo


More information about the Mercurial-devel mailing list