Mercurial > hg
view tests/test-issue660.t @ 24255:4bfe9f2d9761
revlog: addgroup checks if incoming deltas add censored revs, sets flag bit
A censored revision stored in a revlog should have the censored revlog index
flag bit set. This implies we must know if a revision is censored before we
add it to the revlog. When adding revisions from exchanged deltas, we would
prefer to determine this flag without decoding every single full text.
This change introduces a heuristic based on assumptions around the Mercurial
delta format and filelog metadata. Since deltas which produce a censored
revision must be full-replacement deltas, we can read the delta's first bytes
to check the filelog metadata. Since "censored" is the alphabetically first
filelog metadata key, censored filelog revisions have a well-known prefix we
can look for.
For more on the design and background of the censorship feature, see:
http://mercurial.selenic.com/wiki/CensorPlan
author | Mike Edgar <adgar@google.com> |
---|---|
date | Wed, 14 Jan 2015 15:16:08 -0500 |
parents | 8b190adb7ee3 |
children | 2fc86d92c4a9 |
line wrap: on
line source
http://mercurial.selenic.com/bts/issue660 and: http://mercurial.selenic.com/bts/issue322 $ hg init $ echo a > a $ mkdir b $ echo b > b/b $ hg commit -A -m "a is file, b is dir" adding a adding b/b File replaced with directory: $ rm a $ mkdir a $ echo a > a/a Should fail - would corrupt dirstate: $ hg add a/a abort: file 'a' in dirstate clashes with 'a/a' [255] Removing shadow: $ hg rm --after a Should succeed - shadow removed: $ hg add a/a Directory replaced with file: $ rm -r b $ echo b > b Should fail - would corrupt dirstate: $ hg add b abort: directory 'b' already in dirstate [255] Removing shadow: $ hg rm --after b/b Should succeed - shadow removed: $ hg add b Look what we got: $ hg st A a/a A b R a R b/b Revert reintroducing shadow - should fail: $ rm -r a b $ hg revert b/b abort: file 'b' in dirstate clashes with 'b/b' [255] Revert all - should succeed: $ hg revert --all undeleting a forgetting a/a (glob) forgetting b undeleting b/b (glob) $ hg st Issue3423: $ hg forget a $ echo zed > a $ hg revert a $ hg st ? a.orig $ rm a.orig addremove: $ rm -r a b $ mkdir a $ echo a > a/a $ echo b > b $ hg addremove -s 0 removing a adding a/a adding b removing b/b $ hg st A a/a A b R a R b/b commit: $ hg ci -A -m "a is dir, b is file" $ hg st --all C a/a C b Long directory replaced with file: $ mkdir d $ mkdir d/d $ echo d > d/d/d $ hg commit -A -m "d is long directory" adding d/d/d $ rm -r d $ echo d > d Should fail - would corrupt dirstate: $ hg add d abort: directory 'd' already in dirstate [255] Removing shadow: $ hg rm --after d/d/d Should succeed - shadow removed: $ hg add d $ hg ci -md Update should work at least with clean working directory: $ rm -r a b d $ hg up -r 0 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg st --all C a C b/b $ rm -r a b $ hg up -r 1 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg st --all C a/a C b