Skip to content
Snippets Groups Projects
Commit cc3ccb2f authored by Pierre-Yves David's avatar Pierre-Yves David :octopus:
Browse files

copies-test: add test chaining multiple merge

Right now, the copy tracing logic take the right decision for merges, but it
does not keep track of the right information about these decision and can fall
into later traps. We start with highlighting this possibility by adding new
tests, and we will fix them later.

Check the inline test documentation for details.

Differential Revision: https://phab.mercurial-scm.org/D9609
parent c8c236a3
No related branches found
No related tags found
No related merge requests found
......@@ -633,6 +633,111 @@
o 0 i-0 initial commit: a b h
Decision from previous merge are properly chained with later merge
------------------------------------------------------------------
Subcase: chaining conflicting rename resolution
```````````````````````````````````````````````
The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
add more change on the respective branch and merge again. These second merge
does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
about that file should stay unchanged.
(extra unrelated changes)
$ hg up 'desc("a-2")'
2 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo j > unrelated-j
$ hg add unrelated-j
$ hg ci -m 'j-1: unrelated changes (based on the "a" series of changes)'
created new head
$ hg up 'desc("e-2")'
2 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
$ echo k > unrelated-k
$ hg add unrelated-k
$ hg ci -m 'k-1: unrelated changes (based on "e" changes)'
created new head
(merge variant 1)
$ hg up 'desc("mAEm")'
1 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
0 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
$ hg merge 'desc("k-1")'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m 'mAE,Km: simple merge'
(merge variant 2)
$ hg up 'desc("k-1")'
2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
$ hg merge 'desc("mAEm")'
1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
(branch merge, don't forget to commit)
$ hg ci -m 'mK,AEm: simple merge'
created new head
(merge variant 3)
$ hg up 'desc("mEAm")'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge 'desc("j-1")'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m 'mEA,Jm: simple merge'
(merge variant 4)
$ hg up 'desc("j-1")'
2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
$ hg merge 'desc("mEAm")'
1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
(branch merge, don't forget to commit)
$ hg ci -m 'mJ,EAm: simple merge'
created new head
$ hg log -G --rev '::(desc("mAE,Km") + desc("mK,AEm") + desc("mEA,Jm") + desc("mJ,EAm"))'
@ 42 mJ,EAm: simple merge
|\
+---o 41 mEA,Jm: simple merge
| |/
| | o 40 mK,AEm: simple merge
| | |\
| | +---o 39 mAE,Km: simple merge
| | | |/
| | | o 38 k-1: unrelated changes (based on "e" changes)
| | | |
| o | | 37 j-1: unrelated changes (based on the "a" series of changes)
| | | |
o-----+ 20 mEAm-0 simple merge - the other way
|/ / /
| o / 19 mAEm-0 simple merge - one way
|/|/
| o 10 e-2 g -move-> f
| |
| o 9 e-1 b -move-> g
| |
o | 4 a-2: e -move-> f
| |
o | 3 a-1: d -move-> e
|/
o 2 i-2: c -move-> d
|
o 1 i-1: a -move-> c
|
o 0 i-0 initial commit: a b h
Summary of all created cases
----------------------------
......@@ -657,4 +762,6 @@
i-0 initial commit: a b h
i-1: a -move-> c
i-2: c -move-> d
j-1: unrelated changes (based on the "a" series of changes)
k-1: unrelated changes (based on "e" changes)
mABm-0 simple merge - the other way
......@@ -660,4 +767,5 @@
mABm-0 simple merge - the other way
mAE,Km: simple merge
mAEm-0 simple merge - one way
mBAm-0 simple merge - one way
mBC-revert-m-0
......@@ -672,6 +780,7 @@
mCH-delete-before-conflict-m-0
mDBm-0 simple merge - the other way
mDGm-0 simple merge - one way
mEA,Jm: simple merge
mEAm-0 simple merge - the other way
mFBm-0 simple merge - the other way
mFGm-0 simple merge - one way
......@@ -679,6 +788,8 @@
mGDm-0 simple merge - the other way
mGFm-0 simple merge - the other way
mHC-delete-before-conflict-m-0
mJ,EAm: simple merge
mK,AEm: simple merge
Test that sidedata computations during upgrades are correct
......@@ -916,6 +1027,32 @@
1 sidedata entries
entry-0014 size 4
'\x00\x00\x00\x00'
##### revision 37 #####
1 sidedata entries
entry-0014 size 24
'\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-j'
added : unrelated-j, ;
##### revision 38 #####
1 sidedata entries
entry-0014 size 24
'\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-k'
added : unrelated-k, ;
##### revision 39 #####
1 sidedata entries
entry-0014 size 4
'\x00\x00\x00\x00'
##### revision 40 #####
1 sidedata entries
entry-0014 size 4
'\x00\x00\x00\x00'
##### revision 41 #####
1 sidedata entries
entry-0014 size 4
'\x00\x00\x00\x00'
##### revision 42 #####
1 sidedata entries
entry-0014 size 4
'\x00\x00\x00\x00'
#endif
......@@ -1745,3 +1882,62 @@
R a
$ hg status --copies --rev 'desc("h-1")' --rev 'desc("mHC-delete-before-conflict-m")'
R a
Decision from previous merge are properly chained with later merge
------------------------------------------------------------------
Subcase: chaining conflicting rename resolution
```````````````````````````````````````````````
The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
add more change on the respective branch and merge again. These second merge
does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
about that file should stay unchanged.
The result from mAEm is the same for the subsequent merge:
$ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm")' f
A f
a (filelog !)
a (sidedata !)
a (upgraded !)
$ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE,Km")' f
A f
a (filelog !)
a (sidedata !)
a (upgraded !)
$ hg status --copies --rev 'desc("i-0")' --rev 'desc("mK,AEm")' f
A f
a (filelog !)
a (missing-correct-output sidedata !)
a (missing-correct-output upgraded !)
b (known-bad-output sidedata !)
b (known-bad-output upgraded !)
The result from mEAm is the same for the subsequent merge:
$ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm")' f
A f
a (filelog !)
b (sidedata !)
b (upgraded !)
$ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA,Jm")' f
A f
a (filelog !)
b (sidedata !)
b (upgraded !)
$ hg status --copies --rev 'desc("i-0")' --rev 'desc("mJ,EAm")' f
A f
a (filelog !)
b (missing-correct-output sidedata !)
b (missing-correct-output upgraded !)
a (known-bad-output sidedata !)
a (known-bad-output upgraded !)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment