[PATCH] treemanifests: actually strip directory manifests

Martin von Zweigbergk martinvonz at google.com
Thu Jun 30 16:26:50 EDT 2016


# HG changeset patch
# User Martin von Zweigbergk <martinvonz at google.com>
# Date 1467317179 25200
#      Thu Jun 30 13:06:19 2016 -0700
# Node ID 9e7843cbb87e1bd6f6a375fadfb431b71ba758f4
# Parent  785cadec209101e1894d534d0a2d05f16c0a5c52
treemanifests: actually strip directory manifests

Stripping has only partly worked since 7cbb3a01fa38 (repair: use cg3
for treemanifests, 2016-01-19): the bundle seems to have been created
correctly, but revlog entries in subdirectory revlogs were not
stripped. This meant that e.g. "hg verify" would fail after stripping
in a tree manifest repo.

To find the revisions to strip, we simply iterate over all directories
in the repo (included in store.datafiles()). This is inefficient for
stripping few commits, but efficient for stripping many commits. To
optimize for stripping few commits, we could instead walk the tree
from the root and find modified subdirectories, just like we do in the
changegroup code. I'm leaving that for another day.

diff -r 785cadec2091 -r 9e7843cbb87e mercurial/repair.py
--- a/mercurial/repair.py	Thu Jun 23 12:37:09 2016 -0700
+++ b/mercurial/repair.py	Thu Jun 30 13:06:19 2016 -0700
@@ -167,6 +167,13 @@
             tr.startgroup()
             cl.strip(striprev, tr)
             mfst.strip(striprev, tr)
+            if 'treemanifest' in repo.requirements: # safe but unnecessary
+                                                    # otherwise
+                for unencoded, encoded, size in repo.store.datafiles():
+                    if (unencoded.startswith('meta/') and
+                        unencoded.endswith('00manifest.i')):
+                        dir = unencoded[5:-12]
+                        repo.dirlog(dir).strip(striprev, tr)
             for fn in files:
                 repo.file(fn).strip(striprev, tr)
             tr.endgroup()
diff -r 785cadec2091 -r 9e7843cbb87e tests/test-treemanifest.t
--- a/tests/test-treemanifest.t	Thu Jun 23 12:37:09 2016 -0700
+++ b/tests/test-treemanifest.t	Thu Jun 30 13:06:19 2016 -0700
@@ -309,7 +309,16 @@
   $ hg --config extensions.strip= strip tip
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/repo-mixed/.hg/strip-backup/51cfd7b1e13b-78a2f3ed-backup.hg (glob)
+  $ hg debugindex --dir dir1
+     rev    offset  length  delta linkrev nodeid       p1           p2
+       0         0     127     -1       4 064927a0648a 000000000000 000000000000
+       1       127     111      0       5 25ecb8cb8618 000000000000 000000000000
   $ hg unbundle -q .hg/strip-backup/*
+  $ hg debugindex --dir dir1
+     rev    offset  length  delta linkrev nodeid       p1           p2
+       0         0     127     -1       4 064927a0648a 000000000000 000000000000
+       1       127     111      0       5 25ecb8cb8618 000000000000 000000000000
+       2       238      55      1       6 5b16163a30c6 25ecb8cb8618 000000000000
   $ hg st --change tip
   M dir1/a
 


More information about the Mercurial-devel mailing list