@@ -820,7 +820,98 @@
+Subcase: chaining "merged" information during a merge
+``````````````````````````````````````````````````````
+When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
+
+(extra unrelated changes)
+
+ $ hg up 'desc("f-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 n > unrelated-n
+ $ hg add unrelated-n
+ $ hg ci -m 'n-1: unrelated changes (based on the "f" series of changes)'
+ created new head
+
+ $ hg up 'desc("g-1")'
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo o > unrelated-o
+ $ hg add unrelated-o
+ $ hg ci -m 'o-1: unrelated changes (based on "g" changes)'
+ created new head
+
+(merge variant 1)
+
+ $ hg up 'desc("mFGm")'
+ 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("o-1")'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m 'mFG,Om: simple merge'
+
+(merge variant 2)
+
+ $ hg up 'desc("o-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("FGm")'
+ 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 'mO,FGm: simple merge'
+ created new head
+
+(merge variant 3)
+
+ $ hg up 'desc("mGFm")'
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge 'desc("n-1")'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m 'mGF,Nm: simple merge'
+
+(merge variant 4)
+
+ $ hg up 'desc("n-1")'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge 'desc("mGFm")'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m 'mN,GFm: simple merge'
+ created new head
+
+ $ hg log -G --rev '::(desc("mFG,Om") + desc("mO,FGm") + desc("mGF,Nm") + desc("mN,GFm"))'
+ @ 53 mN,GFm: simple merge
+ |\
+ +---o 52 mGF,Nm: simple merge
+ | |/
+ | | o 51 mO,FGm: simple merge
+ | | |\
+ | | +---o 50 mFG,Om: simple merge
+ | | | |/
+ | | | o 49 o-1: unrelated changes (based on "g" changes)
+ | | | |
+ | o | | 48 n-1: unrelated changes (based on the "f" series of changes)
+ | | | |
+ o-----+ 29 mGFm-0 simple merge - the other way
+ |/ / /
+ | o / 28 mFGm-0 simple merge - one way
+ |/|/
+ | o 25 g-1: update d
+ | |
+ o | 22 f-2: rename i -> d
+ | |
+ o | 21 f-1: rename h -> i
+ |/
+ 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
----------------------------
@@ -869,15 +960,21 @@
mEA,Jm: simple merge
mEAm-0 simple merge - the other way
mFBm-0 simple merge - the other way
+ mFG,Om: simple merge
mFGm-0 simple merge - one way
mGCm-0
mGDm-0 simple merge - the other way
+ mGF,Nm: simple merge
mGFm-0 simple merge - the other way
mHC-delete-before-conflict-m-0
mJ,EAm: simple merge
mK,AEm: simple merge
mL,BC+revertm: simple merge
mL,CB+revertm: simple merge
+ mN,GFm: simple merge
+ mO,FGm: simple merge
+ n-1: unrelated changes (based on the "f" series of changes)
+ o-1: unrelated changes (based on "g" changes)
Test that sidedata computations during upgrades are correct
@@ -1162,6 +1259,32 @@
1 sidedata entries
entry-0014 size 4
'\x00\x00\x00\x00'
+ ##### revision 48 #####
+ 1 sidedata entries
+ entry-0014 size 24
+ '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-n'
+ added : unrelated-n, ;
+ ##### revision 49 #####
+ 1 sidedata entries
+ entry-0014 size 24
+ '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-o'
+ added : unrelated-o, ;
+ ##### revision 50 #####
+ 1 sidedata entries
+ entry-0014 size 4
+ '\x00\x00\x00\x00'
+ ##### revision 51 #####
+ 1 sidedata entries
+ entry-0014 size 4
+ '\x00\x00\x00\x00'
+ ##### revision 52 #####
+ 1 sidedata entries
+ entry-0014 size 4
+ '\x00\x00\x00\x00'
+ ##### revision 53 #####
+ 1 sidedata entries
+ entry-0014 size 4
+ '\x00\x00\x00\x00'
#endif
@@ -2108,3 +2231,52 @@
A unrelated-l
R a
+Subcase: chaining "merged" information during a merge
+``````````````````````````````````````````````````````
+
+When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
+
+
+reference output:
+
+ (for details about the filelog pick, check the mFGm/mGFm case)
+
+ $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm")' d
+ A d
+ a (filelog !)
+ h (sidedata !)
+ h (upgraded !)
+ $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm")' d
+ A d
+ a (filelog !)
+ a (sidedata !)
+ a (upgraded !)
+
+Chained output
+
+ $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mO,FGm")' d
+ A d
+ a (filelog !)
+ h (sidedata !)
+ h (upgraded !)
+ $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFG,Om")' d
+ A d
+ a (filelog !)
+ h (sidedata !)
+ h (upgraded !)
+
+
+ $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGF,Nm")' d
+ A d
+ a (filelog !)
+ a (missing-correct-output sidedata !)
+ a (missing-correct-output upgraded !)
+ h (known-bad-output sidedata !)
+ h (known-bad-output upgraded !)
+ $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mN,GFm")' d
+ A d
+ a (filelog !)
+ a (missing-correct-output sidedata !)
+ a (missing-correct-output upgraded !)
+ h (known-bad-output sidedata !)
+ h (known-bad-output upgraded !)