diff --git a/mercurial/revlogutils/rewrite.py b/mercurial/revlogutils/rewrite.py index e9eac01c57f3872cff1376631ce66844a625f4cd_bWVyY3VyaWFsL3JldmxvZ3V0aWxzL3Jld3JpdGUucHk=..3e2a878fb96f5d3d16214f0e4925bd5cadbd6e43_bWVyY3VyaWFsL3JldmxvZ3V0aWxzL3Jld3JpdGUucHk= 100644 --- a/mercurial/revlogutils/rewrite.py +++ b/mercurial/revlogutils/rewrite.py @@ -72,4 +72,8 @@ radix=rl.radix, postfix=b'tmpcensored', censorable=True, + data_config=rl.data_config, + delta_config=rl.delta_config, + feature_config=rl.feature_config, + may_inline=rl._inline, ) @@ -75,8 +79,9 @@ ) - newrl._format_version = rl._format_version - newrl._format_flags = rl._format_flags - newrl.delta_config.general_delta = rl.delta_config.general_delta - newrl._parse_index = rl._parse_index + # inline splitting will prepare some transaction work that will get + # confused by the final file move. So if there is a risk of not being + # inline at the end, we prevent the new revlog to be inline in the first + # place. + assert not (newrl._inline and not rl._inline) for rev in rl.revs(): node = rl.node(rev) @@ -122,7 +127,10 @@ tr.addbackup(rl._datafile, location=b'store') rl.opener.rename(newrl._indexfile, rl._indexfile) - if not rl._inline: + if newrl._inline: + assert rl._inline + else: + assert not rl._inline rl.opener.rename(newrl._datafile, rl._datafile) rl.clearcaches() diff --git a/tests/test-censor.t b/tests/test-censor.t index e9eac01c57f3872cff1376631ce66844a625f4cd_dGVzdHMvdGVzdC1jZW5zb3IudA==..3e2a878fb96f5d3d16214f0e4925bd5cadbd6e43_dGVzdHMvdGVzdC1jZW5zb3IudA== 100644 --- a/tests/test-censor.t +++ b/tests/test-censor.t @@ -298,12 +298,9 @@ $ hg debugrevlogstats | grep target rev-count data-size inl type target - 8 ????????? no file target (glob) (revlogv2 !) - 8 ????????? yes file target (glob) (revlogv1 !) - $ for x in `"$PYTHON" $TESTDIR/seq.py 0 50000` - > do - > echo "Password: hunter$x" >> target - > done + 8 ??? no file target (glob) (revlogv2 !) + 8 ??? yes file target (glob) (revlogv1 !) + $ cat /dev/rand?m | dd status=none count=200 | f --hexdump > target $ hg ci -m 'add 100k passwords' $ H2=`hg id --debug -i` $ C5=$H2 @@ -312,7 +309,5 @@ $ H2=`hg id --debug -i` $ hg debugrevlogstats | grep target rev-count data-size inl type target - 10 ????????? no file target (glob) (revlogv2 !) - 10 ????????? no file target (glob) (missing-correct-output revlogv1 !) - 10 ????????? yes file target (glob) (known-bad-output revlogv1 !) + 10 ?????? no file target (glob) $ hg --config extensions.censor= censor -r $C5 target @@ -318,3 +313,7 @@ $ hg --config extensions.censor= censor -r $C5 target + +The important part is for the censor operation to not crash and the repository +to not be corrupted. Right now this involve keeping the revlog split. + $ hg debugrevlogstats | grep target rev-count data-size inl type target @@ -319,7 +318,6 @@ $ hg debugrevlogstats | grep target rev-count data-size inl type target - 10 ????????? no file target (glob) (revlogv2 !) - 10 ????????? yes file target (glob) (revlogv1 !) + 10 ??? no file target (glob) $ hg cat -r $C5 target | head -n 10 $ hg cat -r $H2 target | head -n 10 fresh start @@ -323,6 +321,13 @@ $ hg cat -r $C5 target | head -n 10 $ hg cat -r $H2 target | head -n 10 fresh start + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + checking dirstate + checked 12 changesets with 13 changes to 2 files Repo with censored nodes can be cloned and cloned nodes are censored @@ -354,7 +359,7 @@ adding manifests adding file changes added 11 changesets with 11 changes to 2 files (+1 heads) - new changesets 186fb27560c3:683e4645fded + new changesets * (glob) (run 'hg heads' to see heads, 'hg merge' to merge) $ hg update 4 2 files updated, 0 files merged, 0 files removed, 0 files unresolved @@ -414,7 +419,7 @@ adding manifests adding file changes added 2 changesets with 2 changes to 2 files (+1 heads) - new changesets 075be80ac777:dcbaf17bf3a1 (2 drafts) + new changesets * (glob) (run 'hg heads .' to see heads, 'hg merge' to merge) $ hg cat -r $REV target | head -n 10 $ hg cat -r $CLEANREV target | head -n 10 @@ -471,7 +476,7 @@ adding manifests adding file changes added 6 changesets with 5 changes to 2 files (+1 heads) - new changesets efbe78065929:683e4645fded (6 drafts) + new changesets * (glob) (run 'hg heads .' to see heads, 'hg merge' to merge) $ hg update $H2 2 files updated, 0 files merged, 0 files removed, 0 files unresolved