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
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