annotate tests/test-revert-flags.t @ 32979:66117dae87f9

patch: rewrite reversehunks (issue5337) The old reversehunks code accesses "crecord.uihunk._hunk", which is the raw recordhunk without crecord selection information, therefore "revert -i" cannot revert individual lines, aka. issue5337. The patch rewrites related logic to return the right reverse hunk for revert. Namely, 1. "fromline" and "toline" are correctly swapped [1] 2. crecord.uihunk generates a correct reverse hunk [2] Besides, reversehunks(hunks) will no longer modify its input "hunks", which is more expected. [1]: To explain why "fromline" and "toline" need to be swapped, take the following example: $ cat > a <<EOF > 1 > 2 > 3 > 4 > EOF $ cat > b <<EOF > 2 > 3 > 5 > EOF $ diff a b 1d0 <---- "1" is "fromline" and "0" is "toline" < 1 and they are swapped if diff from the reversed direction 4c3 | < 4 | --- | > 5 | | $ diff b a | 0a1 <---------+ > 1 3c4 <---- also "4c3" gets swapped to "3c4" < 5 --- > 4 [2]: This is a bit tricky. For example, given a file which is empty in working parent but has 3 lines in working copy, and the user selection: select hunk to discard [x] +1 [ ] +2 [x] +3 The user intent is to drop "1" and "3" in working copy but keep "2", so the reverse patch would be something like: -1 2 (2 is a "context line") -3 We cannot just take all selected lines and swap "-" and "+", which will be: -1 -3 That patch won't apply because of "2". So the correct way is to insert "2" as a "context line" by inserting it first then deleting it: -2 +2 Therefore, the correct revert patch is: -1 -2 +2 -3 It could be reordered to look more like a common diff hunk: -1 -2 -3 +2 Note: It's possible to return multiple hunks so there won't be lines like "-2", "+2". But the current implementation is much simpler. For deletions, like the working parent has "1\n2\n3\n" and it was changed to empty in working copy: select hunk to discard [x] -1 [ ] -2 [x] -3 The user intent is to drop the deletion of 1 and 3 (in other words, keep those lines), but still delete "2". The reverse patch is meant to be applied to working copy which is empty. So the patch would be: +1 +3 That is to say, there is no need to special handle the unselected "2" like the above insertion case.
author Jun Wu <quark@fb.com>
date Tue, 20 Jun 2017 23:22:38 -0700
parents 7a9cbb315d84
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22046
7a9cbb315d84 tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com>
parents: 16913
diff changeset
1 #require execbit
6030
d0dbae32517c revert: revert clean files when only a change of flags is needed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
2
12110
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
3 $ hg init repo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
4 $ cd repo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
5 $ echo foo > foo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
6 $ chmod 644 foo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
7 $ hg ci -qAm '644'
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
8
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
9 $ chmod 755 foo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
10 $ hg ci -qAm '755'
6030
d0dbae32517c revert: revert clean files when only a change of flags is needed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
11
12110
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
12 reverting to rev 0
6030
d0dbae32517c revert: revert clean files when only a change of flags is needed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
13
12110
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
14 $ hg revert -a -r 0
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
15 reverting foo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
16 $ hg st
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
17 M foo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
18 $ hg diff --git
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
19 diff --git a/foo b/foo
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
20 old mode 100755
58a8105242a5 tests: unify test-revert-flags
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 6030
diff changeset
21 new mode 100644
16913
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 12110
diff changeset
22
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 12110
diff changeset
23 $ cd ..