test-graft-rename.t
724 lines
| 18.0 KiB
| text/troff
|
Tads3Lexer
/ tests / test-graft-rename.t
Martin von Zweigbergk
|
r44493 | |||
Graft from behind a move or rename | ||||
================================== | ||||
NOTE: This is affected by issue5343, and will need updating when it's fixed | ||||
Consider this topology for a regular graft: | ||||
o c1 | ||||
| | ||||
| o c2 | ||||
| | | ||||
| o ca # stands for "common ancestor" | ||||
|/ | ||||
o cta # stands for "common topological ancestor" | ||||
Note that in issue5343, ca==cta. | ||||
The following table shows the possible cases. Here, "x->y" and, equivalently, | ||||
"y<-x", where x is an ancestor of y, means that some copy happened from x to y. | ||||
name | c1<-cta | cta<->ca | ca->c2 | ||||
A.0 | | | | ||||
A.1 | X | | | ||||
A.2 | | X | | ||||
A.3 | | | X | ||||
A.4 | X | X | | ||||
A.5 | X | | X | ||||
A.6 | | X | X | ||||
A.7 | X | X | X | ||||
A.0 is trivial, and doesn't need copy tracking. | ||||
For A.1, a forward rename is recorded in the c1 pass, to be followed later. | ||||
In A.2, the rename is recorded in the c2 pass and followed backwards. | ||||
A.3 is recorded in the c2 pass as a forward rename to be duplicated on target. | ||||
In A.4, both passes of checkcopies record incomplete renames, which are | ||||
then joined in mergecopies to record a rename to be followed. | ||||
In A.5 and A.7, the c1 pass records an incomplete rename, while the c2 pass | ||||
records an incomplete divergence. The incomplete rename is then joined to the | ||||
appropriate side of the incomplete divergence, and the result is recorded as a | ||||
divergence. The code doesn't distinguish at all between these two cases, since | ||||
the end result of them is the same: an incomplete divergence joined with an | ||||
incomplete rename into a divergence. | ||||
Finally, A.6 records a divergence entirely in the c2 pass. | ||||
A.4 has a degenerate case a<-b<-a->a, where checkcopies isn't needed at all. | ||||
A.5 has a special case a<-b<-b->a, which is treated like a<-b->a in a merge. | ||||
A.5 has issue5343 as a special case. | ||||
A.6 has a special case a<-a<-b->a. Here, checkcopies will find a spurious | ||||
incomplete divergence, which is in fact complete. This is handled later in | ||||
mergecopies. | ||||
A.7 has 4 special cases: a<-b<-a->b (the "ping-pong" case), a<-b<-c->b, | ||||
a<-b<-a->c and a<-b<-c->a. Of these, only the "ping-pong" case is interesting, | ||||
the others are fairly trivial (a<-b<-c->b and a<-b<-a->c proceed like the base | ||||
case, a<-b<-c->a is treated the same as a<-b<-b->a). | ||||
f5a therefore tests the "ping-pong" rename case, where a file is renamed to the | ||||
same name on both branches, then the rename is backed out on one branch, and | ||||
the backout is grafted to the other branch. This creates a challenging rename | ||||
sequence of a<-b<-a->b in the graft target, topological CA, graft CA and graft | ||||
source, respectively. Since rename detection will run on the c1 side for such a | ||||
sequence (as for technical reasons, we split the c1 and c2 sides not at the | ||||
graft CA, but rather at the topological CA), it will pick up a false rename, | ||||
and cause a spurious merge conflict. This false rename is always exactly the | ||||
reverse of the true rename that would be detected on the c2 side, so we can | ||||
correct for it by detecting this condition and reversing as necessary. | ||||
First, set up the repository with commits to be grafted | ||||
$ hg init graftmove | ||||
$ cd graftmove | ||||
$ echo c1a > f1a | ||||
$ echo c2a > f2a | ||||
$ echo c3a > f3a | ||||
$ echo c4a > f4a | ||||
$ echo c5a > f5a | ||||
$ hg ci -qAm A0 | ||||
$ hg mv f1a f1b | ||||
$ hg mv f3a f3b | ||||
$ hg mv f5a f5b | ||||
$ hg ci -qAm B0 | ||||
$ echo c1c > f1b | ||||
$ hg mv f2a f2c | ||||
$ hg mv f5b f5a | ||||
$ echo c5c > f5a | ||||
$ hg ci -qAm C0 | ||||
$ hg mv f3b f3d | ||||
$ echo c4d > f4a | ||||
$ hg ci -qAm D0 | ||||
$ hg log -G | ||||
@ changeset: 3:b69f5839d2d9 | ||||
| tag: tip | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: D0 | ||||
| | ||||
o changeset: 2:f58c7e2b28fa | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: C0 | ||||
| | ||||
o changeset: 1:3d7bba921b5d | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: B0 | ||||
| | ||||
o changeset: 0:11f7a1b56675 | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: A0 | ||||
Test the cases A.2 (f1x), A.3 (f2x) and a special case of A.6 (f5x) where the | ||||
two renames actually converge to the same name (thus no actual divergence). | ||||
$ hg up -q 'desc("A0")' | ||||
$ HGEDITOR="echo C1 >" hg graft -r 'desc("C0")' --edit | ||||
grafting 2:f58c7e2b28fa "C0" | ||||
merging f1a and f1b to f1a | ||||
merging f5a | ||||
$ hg status --change . | ||||
M f1a | ||||
M f5a | ||||
A f2c | ||||
R f2a | ||||
$ hg cat f1a | ||||
c1c | ||||
$ hg cat f1b | ||||
f1b: no such file in rev c9763722f9bd | ||||
[1] | ||||
Test the cases A.0 (f4x) and A.6 (f3x) | ||||
$ HGEDITOR="echo D1 >" hg graft -r 'desc("D0")' --edit | ||||
grafting 3:b69f5839d2d9 "D0" | ||||
note: possible conflict - f3b was renamed multiple times to: | ||||
f3a | ||||
f3d | ||||
Set up the repository for some further tests | ||||
$ hg up -q "min(desc("A0"))" | ||||
$ hg mv f1a f1e | ||||
$ echo c2e > f2a | ||||
$ hg mv f3a f3e | ||||
$ hg mv f4a f4e | ||||
$ hg mv f5a f5b | ||||
$ hg ci -qAm "E0" | ||||
$ hg up -q "min(desc("A0"))" | ||||
$ hg cp f1a f1f | ||||
$ hg ci -qAm "F0" | ||||
$ hg up -q "min(desc("A0"))" | ||||
$ hg cp f1a f1g | ||||
$ echo c1g > f1g | ||||
$ hg ci -qAm "G0" | ||||
$ hg log -G | ||||
@ changeset: 8:ba67f08fb15a | ||||
| tag: tip | ||||
| parent: 0:11f7a1b56675 | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: G0 | ||||
| | ||||
| o changeset: 7:d376ab0d7fda | ||||
|/ parent: 0:11f7a1b56675 | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: F0 | ||||
| | ||||
| o changeset: 6:6bd1736cab86 | ||||
|/ parent: 0:11f7a1b56675 | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: E0 | ||||
| | ||||
| o changeset: 5:560daee679da | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | summary: D1 | ||||
| | | ||||
| o changeset: 4:c9763722f9bd | ||||
|/ parent: 0:11f7a1b56675 | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: C1 | ||||
| | ||||
| o changeset: 3:b69f5839d2d9 | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | summary: D0 | ||||
| | | ||||
| o changeset: 2:f58c7e2b28fa | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | summary: C0 | ||||
| | | ||||
| o changeset: 1:3d7bba921b5d | ||||
|/ user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: B0 | ||||
| | ||||
o changeset: 0:11f7a1b56675 | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: A0 | ||||
Test the cases A.4 (f1x), the "ping-pong" special case of A.7 (f5x), | ||||
and A.3 with a local content change to be preserved (f2x). | ||||
$ hg up -q "desc("E0")" | ||||
$ HGEDITOR="echo C2 >" hg graft -r 'desc("C0")' --edit | ||||
grafting 2:f58c7e2b28fa "C0" | ||||
merging f1e and f1b to f1e | ||||
merging f2a and f2c to f2c | ||||
Test the cases A.1 (f4x) and A.7 (f3x). | ||||
$ HGEDITOR="echo D2 >" hg graft -r 'desc("D0")' --edit | ||||
grafting 3:b69f5839d2d9 "D0" | ||||
note: possible conflict - f3b was renamed multiple times to: | ||||
f3d | ||||
f3e | ||||
merging f4e and f4a to f4e | ||||
$ hg cat f2c | ||||
c2e | ||||
Test the case A.5 (move case, f1x). | ||||
$ hg up -q "desc("C0")" | ||||
$ HGEDITOR="echo E1 >" hg graft -r 'desc("E0")' --edit | ||||
grafting 6:6bd1736cab86 "E0" | ||||
note: possible conflict - f1a was renamed multiple times to: | ||||
f1b | ||||
f1e | ||||
note: possible conflict - f3a was renamed multiple times to: | ||||
f3b | ||||
f3e | ||||
merging f2c and f2a to f2c | ||||
merging f5a and f5b to f5b | ||||
$ cat f1e | ||||
c1a | ||||
Test the case A.5 (copy case, f1x). | ||||
$ hg up -q "desc("C0")" | ||||
$ HGEDITOR="echo F1 >" hg graft -r 'desc("F0")' --edit | ||||
grafting 7:d376ab0d7fda "F0" | ||||
BROKEN: f1f should be marked a copy from f1b | ||||
$ hg st --copies --change . | ||||
A f1f | ||||
BROKEN: f1f should have the new content from f1b (i.e. "c1c") | ||||
$ cat f1f | ||||
c1a | ||||
Test the case A.5 (copy+modify case, f1x). | ||||
$ hg up -q "desc("C0")" | ||||
BROKEN: We should get a merge conflict from the 3-way merge between f1b in C0 | ||||
(content "c1c") and f1g in G0 (content "c1g") with f1a in A0 as base (content | ||||
"c1a") | ||||
$ HGEDITOR="echo G1 >" hg graft -r 'desc("G0")' --edit | ||||
grafting 8:ba67f08fb15a "G0" | ||||
Check the results of the grafts tested | ||||
$ hg log -CGv --patch --git | ||||
@ changeset: 13:ef3adf6c20a4 | ||||
| tag: tip | ||||
| parent: 2:f58c7e2b28fa | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| files: f1g | ||||
| description: | ||||
| G1 | ||||
| | ||||
| | ||||
| diff --git a/f1g b/f1g | ||||
| new file mode 100644 | ||||
| --- /dev/null | ||||
| +++ b/f1g | ||||
| @@ -0,0 +1,1 @@ | ||||
| +c1g | ||||
| | ||||
| o changeset: 12:b5542d755b54 | ||||
|/ parent: 2:f58c7e2b28fa | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| files: f1f | ||||
| description: | ||||
| F1 | ||||
| | ||||
| | ||||
| diff --git a/f1f b/f1f | ||||
| new file mode 100644 | ||||
| --- /dev/null | ||||
| +++ b/f1f | ||||
| @@ -0,0 +1,1 @@ | ||||
| +c1a | ||||
| | ||||
| o changeset: 11:f8a162271246 | ||||
|/ parent: 2:f58c7e2b28fa | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| files: f1e f2c f3e f4a f4e f5a f5b | ||||
| copies: f4e (f4a) f5b (f5a) | ||||
| description: | ||||
| E1 | ||||
| | ||||
| | ||||
| diff --git a/f1e b/f1e | ||||
| new file mode 100644 | ||||
| --- /dev/null | ||||
| +++ b/f1e | ||||
| @@ -0,0 +1,1 @@ | ||||
| +c1a | ||||
| diff --git a/f2c b/f2c | ||||
| --- a/f2c | ||||
| +++ b/f2c | ||||
| @@ -1,1 +1,1 @@ | ||||
| -c2a | ||||
| +c2e | ||||
| diff --git a/f3e b/f3e | ||||
| new file mode 100644 | ||||
| --- /dev/null | ||||
| +++ b/f3e | ||||
| @@ -0,0 +1,1 @@ | ||||
| +c3a | ||||
| diff --git a/f4a b/f4e | ||||
| rename from f4a | ||||
| rename to f4e | ||||
| diff --git a/f5a b/f5b | ||||
| rename from f5a | ||||
| rename to f5b | ||||
| | ||||
| o changeset: 10:93ee502e8b0a | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | files: f3d f4e | ||||
| | description: | ||||
| | D2 | ||||
| | | ||||
| | | ||||
| | diff --git a/f3d b/f3d | ||||
| | new file mode 100644 | ||||
| | --- /dev/null | ||||
| | +++ b/f3d | ||||
| | @@ -0,0 +1,1 @@ | ||||
| | +c3a | ||||
| | diff --git a/f4e b/f4e | ||||
| | --- a/f4e | ||||
| | +++ b/f4e | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c4a | ||||
| | +c4d | ||||
| | | ||||
| o changeset: 9:539cf145f496 | ||||
| | parent: 6:6bd1736cab86 | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | files: f1e f2a f2c f5a f5b | ||||
| | copies: f2c (f2a) f5a (f5b) | ||||
| | description: | ||||
| | C2 | ||||
| | | ||||
| | | ||||
| | diff --git a/f1e b/f1e | ||||
| | --- a/f1e | ||||
| | +++ b/f1e | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c1a | ||||
| | +c1c | ||||
| | diff --git a/f2a b/f2c | ||||
| | rename from f2a | ||||
| | rename to f2c | ||||
| | diff --git a/f5b b/f5a | ||||
| | rename from f5b | ||||
| | rename to f5a | ||||
| | --- a/f5b | ||||
| | +++ b/f5a | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c5a | ||||
| | +c5c | ||||
| | | ||||
| | o changeset: 8:ba67f08fb15a | ||||
| | | parent: 0:11f7a1b56675 | ||||
| | | user: test | ||||
| | | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | | files: f1g | ||||
| | | copies: f1g (f1a) | ||||
| | | description: | ||||
| | | G0 | ||||
| | | | ||||
| | | | ||||
| | | diff --git a/f1a b/f1g | ||||
| | | copy from f1a | ||||
| | | copy to f1g | ||||
| | | --- a/f1a | ||||
| | | +++ b/f1g | ||||
| | | @@ -1,1 +1,1 @@ | ||||
| | | -c1a | ||||
| | | +c1g | ||||
| | | | ||||
| | | o changeset: 7:d376ab0d7fda | ||||
| | |/ parent: 0:11f7a1b56675 | ||||
| | | user: test | ||||
| | | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | | files: f1f | ||||
| | | copies: f1f (f1a) | ||||
| | | description: | ||||
| | | F0 | ||||
| | | | ||||
| | | | ||||
| | | diff --git a/f1a b/f1f | ||||
| | | copy from f1a | ||||
| | | copy to f1f | ||||
| | | | ||||
| o | changeset: 6:6bd1736cab86 | ||||
| |/ parent: 0:11f7a1b56675 | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | files: f1a f1e f2a f3a f3e f4a f4e f5a f5b | ||||
| | copies: f1e (f1a) f3e (f3a) f4e (f4a) f5b (f5a) | ||||
| | description: | ||||
| | E0 | ||||
| | | ||||
| | | ||||
| | diff --git a/f1a b/f1e | ||||
| | rename from f1a | ||||
| | rename to f1e | ||||
| | diff --git a/f2a b/f2a | ||||
| | --- a/f2a | ||||
| | +++ b/f2a | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c2a | ||||
| | +c2e | ||||
| | diff --git a/f3a b/f3e | ||||
| | rename from f3a | ||||
| | rename to f3e | ||||
| | diff --git a/f4a b/f4e | ||||
| | rename from f4a | ||||
| | rename to f4e | ||||
| | diff --git a/f5a b/f5b | ||||
| | rename from f5a | ||||
| | rename to f5b | ||||
| | | ||||
| | o changeset: 5:560daee679da | ||||
| | | user: test | ||||
| | | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | | files: f3d f4a | ||||
| | | description: | ||||
| | | D1 | ||||
| | | | ||||
| | | | ||||
| | | diff --git a/f3d b/f3d | ||||
| | | new file mode 100644 | ||||
| | | --- /dev/null | ||||
| | | +++ b/f3d | ||||
| | | @@ -0,0 +1,1 @@ | ||||
| | | +c3a | ||||
| | | diff --git a/f4a b/f4a | ||||
| | | --- a/f4a | ||||
| | | +++ b/f4a | ||||
| | | @@ -1,1 +1,1 @@ | ||||
| | | -c4a | ||||
| | | +c4d | ||||
| | | | ||||
| | o changeset: 4:c9763722f9bd | ||||
| |/ parent: 0:11f7a1b56675 | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | files: f1a f2a f2c f5a | ||||
| | copies: f2c (f2a) | ||||
| | description: | ||||
| | C1 | ||||
| | | ||||
| | | ||||
| | diff --git a/f1a b/f1a | ||||
| | --- a/f1a | ||||
| | +++ b/f1a | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c1a | ||||
| | +c1c | ||||
| | diff --git a/f2a b/f2c | ||||
| | rename from f2a | ||||
| | rename to f2c | ||||
| | diff --git a/f5a b/f5a | ||||
| | --- a/f5a | ||||
| | +++ b/f5a | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c5a | ||||
| | +c5c | ||||
| | | ||||
+---o changeset: 3:b69f5839d2d9 | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | files: f3b f3d f4a | ||||
| | copies: f3d (f3b) | ||||
| | description: | ||||
| | D0 | ||||
| | | ||||
| | | ||||
| | diff --git a/f3b b/f3d | ||||
| | rename from f3b | ||||
| | rename to f3d | ||||
| | diff --git a/f4a b/f4a | ||||
| | --- a/f4a | ||||
| | +++ b/f4a | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c4a | ||||
| | +c4d | ||||
| | | ||||
o | changeset: 2:f58c7e2b28fa | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | files: f1b f2a f2c f5a f5b | ||||
| | copies: f2c (f2a) f5a (f5b) | ||||
| | description: | ||||
| | C0 | ||||
| | | ||||
| | | ||||
| | diff --git a/f1b b/f1b | ||||
| | --- a/f1b | ||||
| | +++ b/f1b | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c1a | ||||
| | +c1c | ||||
| | diff --git a/f2a b/f2c | ||||
| | rename from f2a | ||||
| | rename to f2c | ||||
| | diff --git a/f5b b/f5a | ||||
| | rename from f5b | ||||
| | rename to f5a | ||||
| | --- a/f5b | ||||
| | +++ b/f5a | ||||
| | @@ -1,1 +1,1 @@ | ||||
| | -c5a | ||||
| | +c5c | ||||
| | | ||||
o | changeset: 1:3d7bba921b5d | ||||
|/ user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| files: f1a f1b f3a f3b f5a f5b | ||||
| copies: f1b (f1a) f3b (f3a) f5b (f5a) | ||||
| description: | ||||
| B0 | ||||
| | ||||
| | ||||
| diff --git a/f1a b/f1b | ||||
| rename from f1a | ||||
| rename to f1b | ||||
| diff --git a/f3a b/f3b | ||||
| rename from f3a | ||||
| rename to f3b | ||||
| diff --git a/f5a b/f5b | ||||
| rename from f5a | ||||
| rename to f5b | ||||
| | ||||
o changeset: 0:11f7a1b56675 | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
files: f1a f2a f3a f4a f5a | ||||
description: | ||||
A0 | ||||
diff --git a/f1a b/f1a | ||||
new file mode 100644 | ||||
--- /dev/null | ||||
+++ b/f1a | ||||
@@ -0,0 +1,1 @@ | ||||
+c1a | ||||
diff --git a/f2a b/f2a | ||||
new file mode 100644 | ||||
--- /dev/null | ||||
+++ b/f2a | ||||
@@ -0,0 +1,1 @@ | ||||
+c2a | ||||
diff --git a/f3a b/f3a | ||||
new file mode 100644 | ||||
--- /dev/null | ||||
+++ b/f3a | ||||
@@ -0,0 +1,1 @@ | ||||
+c3a | ||||
diff --git a/f4a b/f4a | ||||
new file mode 100644 | ||||
--- /dev/null | ||||
+++ b/f4a | ||||
@@ -0,0 +1,1 @@ | ||||
+c4a | ||||
diff --git a/f5a b/f5a | ||||
new file mode 100644 | ||||
--- /dev/null | ||||
+++ b/f5a | ||||
@@ -0,0 +1,1 @@ | ||||
+c5a | ||||
Check superfluous filemerge of files renamed in the past but untouched by graft | ||||
$ echo a > a | ||||
$ hg ci -qAma | ||||
$ hg mv a b | ||||
$ echo b > b | ||||
$ hg ci -qAmb | ||||
$ echo c > c | ||||
$ hg ci -qAmc | ||||
$ hg up -q .~2 | ||||
$ hg graft tip -qt:fail | ||||
$ cd .. | ||||
Graft a change into a new file previously grafted into a renamed directory | ||||
$ hg init dirmovenewfile | ||||
$ cd dirmovenewfile | ||||
$ mkdir a | ||||
$ echo a > a/a | ||||
$ hg ci -qAma | ||||
$ echo x > a/x | ||||
$ hg ci -qAmx | ||||
$ hg up -q 0 | ||||
$ hg mv -q a b | ||||
$ hg ci -qAmb | ||||
$ hg graft -q 1 # a/x grafted as b/x, but no copy information recorded | ||||
$ hg up -q 1 | ||||
$ echo y > a/x | ||||
$ hg ci -qAmy | ||||
$ hg up -q 3 | ||||
$ hg graft -q 4 | ||||
$ hg status --change . | ||||
M b/x | ||||
Prepare for test of skipped changesets and how merges can influence it: | ||||
$ hg merge -q -r 1 --tool :local | ||||
$ hg ci -m m | ||||
$ echo xx >> b/x | ||||
$ hg ci -m xx | ||||
$ hg log -G -T '{rev} {desc|firstline}' | ||||
@ 7 xx | ||||
| | ||||
o 6 m | ||||
|\ | ||||
| o 5 y | ||||
| | | ||||
+---o 4 y | ||||
| | | ||||
| o 3 x | ||||
| | | ||||
| o 2 b | ||||
| | | ||||
o | 1 x | ||||
|/ | ||||
o 0 a | ||||
Grafting of plain changes correctly detects that 3 and 5 should be skipped: | ||||
$ hg up -qCr 4 | ||||
$ hg graft --tool :local -r 2::5 | ||||
skipping already grafted revision 3:ca093ca2f1d9 (was grafted from 1:13ec5badbf2a) | ||||
skipping already grafted revision 5:43e9eb70dab0 (was grafted from 4:6c9a1289e5f1) | ||||
grafting 2:42127f193bcd "b" | ||||
Extending the graft range to include a (skipped) merge of 3 will not prevent us from | ||||
also detecting that both 3 and 5 should be skipped: | ||||
$ hg up -qCr 4 | ||||
$ hg graft --tool :local -r 2::7 | ||||
skipping ungraftable merge revision 6 | ||||
skipping already grafted revision 3:ca093ca2f1d9 (was grafted from 1:13ec5badbf2a) | ||||
skipping already grafted revision 5:43e9eb70dab0 (was grafted from 4:6c9a1289e5f1) | ||||
grafting 2:42127f193bcd "b" | ||||
grafting 7:d3c3f2b38ecc "xx" | ||||
note: graft of 7:d3c3f2b38ecc created no changes to commit | ||||
$ cd .. | ||||
Grafted revision should be warned and skipped only once. (issue6024) | ||||
$ mkdir issue6024 | ||||
$ cd issue6024 | ||||
$ hg init base | ||||
$ cd base | ||||
$ touch x | ||||
$ hg commit -qAminit | ||||
$ echo a > x | ||||
$ hg commit -mchange | ||||
$ hg update -q 0 | ||||
$ hg graft -r 1 | ||||
grafting 1:a0b923c546aa "change" (tip) | ||||
$ cd .. | ||||
$ hg clone -qr 2 base clone | ||||
$ cd clone | ||||
$ hg pull -q | ||||
$ hg merge -q 2 | ||||
$ hg commit -mmerge | ||||
$ hg update -q 0 | ||||
$ hg graft -r 1 | ||||
grafting 1:04fc6d444368 "change" | ||||
$ hg update -q 3 | ||||
$ hg log -G -T '{rev}:{node|shortest} <- {extras.source|shortest}\n' | ||||
o 4:4e16 <- a0b9 | ||||
| | ||||
| @ 3:f0ac <- | ||||
| |\ | ||||
+---o 2:a0b9 <- | ||||
| | | ||||
| o 1:04fc <- a0b9 | ||||
|/ | ||||
o 0:7848 <- | ||||
the source of rev 4 is an ancestor of the working parent, and was also | ||||
grafted as rev 1. it should be stripped from the target revisions only once. | ||||
$ hg graft -r 4 | ||||
skipping already grafted revision 4:4e16bab40c9c (1:04fc6d444368 also has origin 2:a0b923c546aa) | ||||
[255] | ||||
$ cd ../.. | ||||