similar: compare between actual file contents for exact identity
Before this patch, similarity detection logic (for addremove and
automv) depends entirely on SHA-1 digesting. But this causes incorrect
rename detection, if:
- removing file A and adding file B occur at same committing, and
- SHA-1 hash values of file A and B are same
This may prevent security experts from managing sample files for
SHAttered issue in Mercurial repository, for example.
https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html
https://shattered.it/
Hash collision itself isn't so serious for core repository
functionality of Mercurial, described by mpm as below, though.
https://www.mercurial-scm.org/wiki/mpm/SHA1
This patch compares between actual file contents after hash comparison
for exact identity.
Even after this patch, SHA-1 is still used, because it is reasonable
enough to quickly detect existence of "(almost) same" file.
- replacing SHA-1 causes decreasing performance, and
- replacement of it has ambiguity, yet
Getting content of removed file (= rfctx.data()) at each exact
comparison should be cheap enough, even though getting content of
added one costs much.
======= ============== =====================
file fctx data() reads from
======= ============== =====================
removed filectx in-memory revlog data
added workingfilectx storage
======= ============== =====================
#require execbit
$ rm -rf a
$ hg init a
$ cd a
$ echo foo > foo
$ hg ci -qAm0
$ echo toremove > toremove
$ echo todelete > todelete
$ chmod +x foo toremove todelete
$ hg ci -qAm1
Test that local removed/deleted, remote removed works with flags
$ hg rm toremove
$ rm todelete
$ hg co -q 0
$ echo dirty > foo
$ hg up -c
abort: uncommitted changes
[255]
$ hg up -q
$ cat foo
dirty
$ hg st -A
M foo
C todelete
C toremove
Validate update of standalone execute bit change:
$ hg up -C 0
1 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ chmod -x foo
$ hg ci -m removeexec
nothing changed
[1]
$ hg up -C 0
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg up
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg st
$ cd ..