Mercurial > hg
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 |
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 .. |