Patchwork treemanifests: actually strip directory manifests

login
register
mail settings
Submitter via Mercurial-devel
Date June 30, 2016, 8:26 p.m.
Message ID <9e7843cbb87e1bd6f6a3.1467318410@martinvonz.mtv.corp.google.com>
Download mbox | patch
Permalink /patch/15669/
State Accepted
Delegated to: Yuya Nishihara
Headers show

Comments

via Mercurial-devel - June 30, 2016, 8:26 p.m.
# HG changeset patch
# User Martin von Zweigbergk <martinvonz@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.
Yuya Nishihara - July 3, 2016, 6:26 a.m.
On Thu, 30 Jun 2016 13:26:50 -0700, Martin von Zweigbergk via Mercurial-devel wrote:
> # HG changeset patch
> # User Martin von Zweigbergk <martinvonz@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.

Sounds good, queued, thanks.

Patch

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