copies: do not track backward copies, only renames (
issue3739)
The inverse of a rename is a rename, but the inverse of a copy is not a copy.
Presenting it as such -- in particular, stuffing it into the same dict as real
copies -- causes bugs because other code starts believing the inverse copies
are real.
The only test whose output changes is test-mv-cp-st-diff.t. When a backwards
status -C command is run where a copy is involved, the inverse copy (which was
hitherto presented as a real copy) is no longer displayed.
Keeping track of inverse copies is useful in some situations -- composability
of diffs, for example, since adding "a" followed by an inverse copy "b" to "a"
is equivalent to a rename "b" to "a". However, representing them would require
a more complex data structure than the same dict in which real copies are also
stored.
$ "$TESTDIR/hghave" execbit || exit 80
$ rm -rf a
$ hg init a
$ cd a
$ echo foo > foo
$ hg ci -qAm0
$ chmod +x foo
$ hg ci -m1
$ hg co -q 0
$ echo dirty > foo
$ hg up -c
abort: uncommitted local changes
[255]
$ hg up -q
$ cat foo
dirty
$ hg st -A
M foo
Validate update of standalone execute bit change:
$ hg up -C 0
1 files updated, 0 files merged, 0 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
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg st
$ cd ..