[PATCH] treemanifest: don't use a manifest in the cache if it's dirty

Tony Tung tonytung at fb.com
Thu Feb 18 23:46:18 UTC 2016


# HG changeset patch
# User Tony Tung <tonytung at merly.org>
# Date 1455839061 28800
#      Thu Feb 18 15:44:21 2016 -0800
# Node ID a7cd652b0f4398e939ebc10c6ceff86c4c119a72
# Parent  c4ee1010595a7cae4aad0c7dbcd152719f780e6a
treemanifest: don't use a manifest in the cache if it's dirty.

When doing hg convert, we may encounter subrepo merges.  In that case, the
working directory subrepo will be dirty (i.e., differ from the repository
state), which will cause the manifest to be written to.  Subsequent reads
of this manifest entry will note that it's dirty, and calls to node() will
fail.

Resolves https://bz.mercurial-scm.org/show_bug.cgi?id=5076

diff --git a/mercurial/manifest.py b/mercurial/manifest.py
--- a/mercurial/manifest.py
+++ b/mercurial/manifest.py
@@ -963,7 +963,11 @@
         if node == revlog.nullid:
             return self._newmanifest() # don't upset local cache
         if node in self._mancache:
-            return self._mancache[node][0]
+            cached = self._mancache[node][0]
+            # if it's a tree manifest and dirty, then throw it away.  refetch
+            # it.
+            if not (self._treeondisk and cached._dirty):
+                return cached
         if self._treeondisk:
             def gettext():
                 return self.revision(node)
diff --git a/tests/test-treemanifest.t b/tests/test-treemanifest.t
--- a/tests/test-treemanifest.t
+++ b/tests/test-treemanifest.t
@@ -626,3 +626,82 @@
   bundle requirements: generaldelta, revlogv1, treemanifest
   $ hg debugbundle --spec repo-packed.hg
   none-packed1;requirements%3Dgeneraldelta%2Crevlogv1%2Ctreemanifest
+
+Converting a repo with subrepos
+
+  $ mkdir subrepos
+  $ cd subrepos
+  $ hg init main
+  $ cd main
+  $ echo "bar" > foo
+  $ hg add foo
+  $ hg commit -m "adding foo"
+  $ hg init nested
+  $ echo nested = nested > .hgsub
+  $ hg add .hgsub
+  $ hg commit -m "subrepo"
+  $ cd nested
+  $ echo "foo" > baz
+  $ hg add baz
+  $ hg commit -m baz
+  $ cd ..
+  $ hg commit -m "substate"
+  $ hg up -C 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo "foomain" > barmain
+  $ hg add barmain
+  $ hg commit -m "foo:bar:main"
+  created new head
+  $ hg up 2
+  2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg merge 3
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg commit -m "substate merge"
+  $ cd ..
+  $ hg init --config experimental.treemanifest=1 main-tree
+  $ hg convert --config experimental.treemanifest=1 -s hg -d hg --config extensions.convert= main/nested main-tree/nested
+  initializing destination main-tree/nested repository
+  scanning source...
+  sorting...
+  converting...
+  0 baz
+  $ hg convert --config experimental.treemanifest=1 -s hg -d hg --config extensions.convert= main main-tree
+  scanning source...
+  sorting...
+  converting...
+  4 adding foo
+  3 subrepo
+  2 substate
+  1 foo:bar:main
+  0 substate merge
+  $ cd main-tree
+  $ hg log -G -T 'changeset: {node}\n desc: {desc}\n'
+  o    changeset: dd89f10386a7a20b6c47ba1f654fd9351d3a8af1
+  |\    desc: substate merge
+  | o  changeset: d7f4a353d996a012f0f96da6a64a3897834fea66
+  | |   desc: foo:bar:main
+  o |  changeset: 1e5c05b42e66cf36e1fdf89688a619a91e7e0fcf
+  | |   desc: substate
+  o |  changeset: 5fa49dfed1f161b05df29131c919a823a3cfaf18
+  |/    desc: subrepo
+  o  changeset: 7ea9107ac22e3f641679fe6eb24f714f8e215a8e
+      desc: adding foo
+  $ hg diff -r 3 -r 4
+  diff -r d7f4a353d996 -r dd89f10386a7 .hgsub
+  --- /dev/null	* (glob)
+  +++ b/.hgsub	* (glob)
+  @@ -0,0 +1,1 @@
+  +nested = nested
+  diff -r d7f4a353d996 -r dd89f10386a7 .hgsubstate
+  --- /dev/null	* (glob)
+  +++ b/.hgsubstate	* (glob)
+  @@ -0,0 +1,1 @@
+  +a66b20dc9550d7f9d48381371c10d14fe0e78957 nested
+  $ hg diff -r 2 -r 4
+  diff -r 1e5c05b42e66 -r dd89f10386a7 barmain
+  --- /dev/null	* (glob)
+  +++ b/barmain	* (glob)
+  @@ -0,0 +1,1 @@
+  +foomain
+  $ cd ..


More information about the Mercurial-devel mailing list