diff --git a/tests/test-copies-chain-merge.t b/tests/test-copies-chain-merge.t --- a/tests/test-copies-chain-merge.t +++ b/tests/test-copies-chain-merge.t @@ -687,6 +687,60 @@ o i-0 initial commit: a b h +Variant of previous with extra changes introduced by the merge +-------------------------------------------------------------- + +Multiple cases above explicitely test cases where content are the same on both side during merge. In this section we will introduce variants for theses cases where new change are introduced to these file content during the merges. + + +Subcase: merge has same initial content on both side, but merge introduced a change +``````````````````````````````````````````````````````````````````````````````````` + +Same as `mAEm` and `mEAm` but with extra change to the file before commiting + +- the "e-" branch renaming b to f (through 'g') +- the "a-" branch renaming d to f (through e) + + $ case_desc="merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent)" + + $ hg up 'desc("a-2")' + 2 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg merge 'desc("e-2")' + 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) + $ echo "content change for mAE-change-m" > f + $ hg ci -m "mAE-change-m-0 $case_desc - one way" + created new head + $ hg up 'desc("e-2")' + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg merge 'desc("a-2")' + 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) + $ echo "content change for mEA-change-m" > f + $ hg ci -m "mEA-change-m-0 $case_desc - the other way" + created new head + $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))' + @ mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way + |\ + +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way + | |/ + | o e-2 g -move-> f + | | + | o e-1 b -move-> g + | | + o | a-2: e -move-> f + | | + o | a-1: d -move-> e + |/ + o i-2: c -move-> d + | + o i-1: a -move-> c + | + o i-0 initial commit: a b h + + Decision from previous merge are properly chained with later merge ------------------------------------------------------------------ @@ -703,7 +757,7 @@ (extra unrelated changes) $ hg up 'desc("a-2")' - 2 files updated, 0 files merged, 1 files removed, 0 files unresolved + 2 files updated, 0 files merged, 0 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)' @@ -1001,6 +1055,7 @@ l-1: unrelated changes (based on "c" changes) mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way mAE,Km: chained merges (conflict -> simple) - same content everywhere + mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way mBC+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists) @@ -1018,6 +1073,7 @@ mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way mEA,Jm: chained merges (conflict -> simple) - same content everywhere + mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way mFG,Om: chained merges (copy-overwrite -> simple) - same content @@ -1278,6 +1334,16 @@ 1 sidedata entries entry-0014 size 4 '\x00\x00\x00\x00' + ##### revision "mAE-change-m-0 merge with file update and copies info on both side - A side" ##### + 1 sidedata entries + entry-0014 size 14 + '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f' + merged : f, ; + ##### revision "mEA-change-m-0 merge with file update and copies info on both side - A side" ##### + 1 sidedata entries + entry-0014 size 14 + '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f' + merged : f, ; ##### revision "j-1" ##### 1 sidedata entries entry-0014 size 24 @@ -1628,6 +1694,8 @@ 0 * cedeacc5bf5d 000000000000 000000000000 1 * 08d1ff5926fb 000000000000 000000000000 2 * ffb76cd76542 cedeacc5bf5d 08d1ff5926fb + 3 * 1085a0ee2dac cedeacc5bf5d 08d1ff5926fb + 4 * a6fe459f7ba9 08d1ff5926fb cedeacc5bf5d #else $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f' 56647659eff080e06e45c18ea9e848836dadea71 644 f @@ -1640,6 +1708,8 @@ $ hg debugindex f | ../no-linkrev rev linkrev nodeid p1 p2 0 * 56647659eff0 000000000000 000000000000 + 1 * f115bfcb4477 56647659eff0 000000000000 + 2 * c42e749a81f7 56647659eff0 000000000000 #endif # Here the filelog based implementation is not looking at the rename @@ -2191,6 +2261,133 @@ $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mHC-delete-before-conflict-m")' R a +Variant of previous with extra changes introduced by the merge +-------------------------------------------------------------- + +(see case declaration for details) + +Subcase: merge has same initial content on both side, but merge introduced a change +``````````````````````````````````````````````````````````````````````````````````` + +- the "e-" branch renaming b to f (through 'g') +- the "a-" branch renaming d to f (through e) +- the merge add new change to b + + $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))' + o mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way + |\ + +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way + | |/ + | o e-2 g -move-> f + | | + | o e-1 b -move-> g + | | + o | a-2: e -move-> f + | | + o | a-1: d -move-> e + |/ + o i-2: c -move-> d + | + o i-1: a -move-> c + | + o i-0 initial commit: a b h + +#if no-changeset + $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f' + 1085a0ee2dac2f22801f91ee1a35b4fafd310f0c 644 f + $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f' + a6fe459f7ba96d94d8265cdf951fe0a42b7d4006 644 f + $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f' + cedeacc5bf5d9b9be4d7f8394d33a5349bb29c6e 644 f + $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f' + 08d1ff5926fbd0285cdeb044cbe8ab651687e86a 644 f + $ hg debugindex f | ../no-linkrev + rev linkrev nodeid p1 p2 + 0 * cedeacc5bf5d 000000000000 000000000000 + 1 * 08d1ff5926fb 000000000000 000000000000 + 2 * ffb76cd76542 cedeacc5bf5d 08d1ff5926fb + 3 * 1085a0ee2dac cedeacc5bf5d 08d1ff5926fb + 4 * a6fe459f7ba9 08d1ff5926fb cedeacc5bf5d +#else + $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f' + f115bfcb4477a0d3b09b5bd4fd06e95d6ff8f815 644 f + $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f' + c42e749a81f7af5b145e651bcb2b707b23a381e2 644 f + $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f' + 56647659eff080e06e45c18ea9e848836dadea71 644 f + $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f' + 56647659eff080e06e45c18ea9e848836dadea71 644 f + $ hg debugindex f | ../no-linkrev + rev linkrev nodeid p1 p2 + 0 * 56647659eff0 000000000000 000000000000 + 1 * f115bfcb4477 56647659eff0 000000000000 + 2 * c42e749a81f7 56647659eff0 000000000000 +#endif + +# Here the filelog based implementation is not looking at the rename +# information (because the file exist on both side). However the changelog +# based on works fine. We have different output. + + $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAE-change-m-0")' + M f + b (no-filelog !) + R b + $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEA-change-m-0")' + M f + b (no-filelog !) + R b + $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAE-change-m-0")' + M f + d (no-filelog !) + R d + $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEA-change-m-0")' + M f + d (no-filelog !) + R d + $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")' + A f + d + R d + $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")' + A f + b + R b + +# From here, we run status against revision where both source file exists. +# +# The filelog based implementation picks an arbitrary side based on revision +# numbers. So the same side "wins" whatever the parents order is. This is +# sub-optimal because depending on revision numbers means the result can be +# different from one repository to the next. +# +# The changeset based algorithm use the parent order to break tie on conflicting +# information and will have a different order depending on who is p1 and p2. +# That order is stable accross repositories. (data from p1 prevails) + + $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAE-change-m-0")' + A f + d + R b + R d + $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEA-change-m-0")' + A f + d (filelog !) + b (no-filelog !) + R b + R d + $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change-m-0")' + A f + a + R a + R b + $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change-m-0")' + A f + a (filelog !) + b (no-filelog !) + R a + R b + + Decision from previous merge are properly chained with later merge ------------------------------------------------------------------