revlog: move censor logic into main revlog class
Previously, the revlog class implemented dummy methods for
various censor-related functionality. Revision censoring was
(and will continue to be) only possible on filelog instances.
So filelog implemented these methods to perform something
reasonable.
A problem with implementing censoring on filelog is that
it assumes filelog is a revlog. Upcoming work to formalize
the filelog interface will make this not true.
Furthermore, the censoring logic is security-sensitive. I
think action-at-a-distance with custom implementation of core
revlog APIs in derived classes is a bit dangerous. I think at
a minimum the censor logic should live in revlog.py.
I was tempted to created a "censored revlog" class that
basically pulled these methods out of filelog. But, I wasn't
a huge fan of overriding core methods in child classes. A
reason to do that would be performance. However, the censoring
code only comes into play when:
* hash verification fails
* delta generation
* applying deltas from changegroups
The new code is conditional on an instance attribute. So the
overhead for running the censored code when the revlog isn't
censorable is an attribute lookup. All of these operations are
at least a magnitude slower than a Python attribute lookup. So
there shouldn't be a performance concern.
Differential Revision: https://phab.mercurial-scm.org/D3151
$ hg init
$ echo "added file1" > file1
$ echo "added file2" > file2
$ hg add file1 file2
$ hg commit -m "added file1 and file2"
$ echo "changed file1" >> file1
$ hg commit -m "changed file1"
$ hg -q log
1:08a16e8e4408
0:d29c767a4b52
$ hg id
08a16e8e4408 tip
$ hg update -C 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg id
d29c767a4b52
$ echo "changed file1" >> file1
$ hg id
d29c767a4b52+
$ hg revert --all
reverting file1
$ hg diff
$ hg status
? file1.orig
$ hg id
d29c767a4b52
$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg diff
$ hg status
? file1.orig
$ hg id
08a16e8e4408 tip
$ hg update -C 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo "changed file1" >> file1
$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg diff
$ hg status
? file1.orig
$ hg id
08a16e8e4408 tip
$ hg revert --all
$ hg diff
$ hg status
? file1.orig
$ hg id
08a16e8e4408 tip
$ hg revert -r tip --all
$ hg diff
$ hg status
? file1.orig
$ hg id
08a16e8e4408 tip
$ hg update -C
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg diff
$ hg status
? file1.orig
$ hg id
08a16e8e4408 tip