diff --git a/tests/test-merge-criss-cross.t b/tests/test-merge-criss-cross.t --- a/tests/test-merge-criss-cross.t +++ b/tests/test-merge-criss-cross.t @@ -11,15 +11,9 @@ $ hg up -qr0 $ echo '2 first change' > f2 - $ mkdir d1 - $ echo '0 base' > d1/f3 - $ echo '0 base' > d1/f4 - $ hg add -q d1 $ hg ci -qm '2 first change f2' $ hg merge -qr 1 - $ hg rm d1/f3 - $ hg mv -q d1 d2 $ hg ci -m '3 merge' $ hg up -qr2 @@ -30,38 +24,38 @@ $ hg ci -m '5 second change f1' $ hg up -r3 - 2 files updated, 0 files merged, 2 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo '6 second change' > f2 $ hg ci -m '6 second change f2' $ hg log -G - @ changeset: 6:6373bbfdae1d + @ changeset: 6:3b08d01b0ab5 | tag: tip - | parent: 3:c202c8af058d + | parent: 3:cf89f02107e5 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: 6 second change f2 | - | o changeset: 5:e673248094b1 + | o changeset: 5:adfe50279922 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: 5 second change f1 | | - | o changeset: 4:177f58377c06 - | |\ parent: 2:d1d156401c1b + | o changeset: 4:7d3e55501ae6 + | |\ parent: 2:40663881a6dd | | | parent: 1:0f6b37dbe527 | | | user: test | | | date: Thu Jan 01 00:00:00 1970 +0000 | | | summary: 4 merge | | | - o---+ changeset: 3:c202c8af058d - | | | parent: 2:d1d156401c1b + o---+ changeset: 3:cf89f02107e5 + | | | parent: 2:40663881a6dd |/ / parent: 1:0f6b37dbe527 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: 3 merge | | - | o changeset: 2:d1d156401c1b + | o changeset: 2:40663881a6dd | | parent: 0:40494bf2444c | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 @@ -79,51 +73,27 @@ $ hg merge -v --debug --tool internal:dump 5 --config merge.preferancestor='!' - note: using 0f6b37dbe527 as ancestor of 6373bbfdae1d and e673248094b1 - alternatively, use --config merge.preferancestor=d1d156401c1b + note: using 0f6b37dbe527 as ancestor of 3b08d01b0ab5 and adfe50279922 + alternatively, use --config merge.preferancestor=40663881a6dd searching for copies back to rev 3 - unmatched files in local: - d2/f4 - unmatched files in other: - d1/f3 - d1/f4 - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/f4' -> dst: 'd2/f4' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' - pending file src: 'd1/f3' -> dst: 'd2/f3' - pending file src: 'd1/f4' -> dst: 'd2/f4' resolving manifests branchmerge: True, force: False, partial: False - ancestor: 0f6b37dbe527, local: 6373bbfdae1d+, remote: e673248094b1 - preserving d2/f4 for resolve of d2/f4 + ancestor: 0f6b37dbe527, local: 3b08d01b0ab5+, remote: adfe50279922 preserving f2 for resolve of f2 f1: remote is newer -> g getting f1 - d2/f3: local directory rename - get from d1/f3 -> dg - getting d1/f3 to d2/f3 - d2/f4: local directory rename, both created -> m (premerge) f2: versions differ -> m (premerge) picked tool ':dump' for f2 (binary False symlink False changedelete False) merging f2 - my f2@6373bbfdae1d+ other f2@e673248094b1 ancestor f2@0f6b37dbe527 + my f2@3b08d01b0ab5+ other f2@adfe50279922 ancestor f2@0f6b37dbe527 f2: versions differ -> m (merge) picked tool ':dump' for f2 (binary False symlink False changedelete False) - my f2@6373bbfdae1d+ other f2@e673248094b1 ancestor f2@0f6b37dbe527 - 3 files updated, 0 files merged, 0 files removed, 1 files unresolved + my f2@3b08d01b0ab5+ other f2@adfe50279922 ancestor f2@0f6b37dbe527 + 1 files updated, 0 files merged, 0 files removed, 1 files unresolved use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon [1] - $ f --dump --recurse * - d2: directory with 2 files - d2/f3: - >>> - 0 base - <<< - d2/f4: - >>> - 0 base - <<< + $ f --dump * f1: >>> 5 second change @@ -151,13 +121,11 @@ $ hg up -qC . $ hg merge -v --tool internal:dump 5 --config merge.preferancestor="null 40663881 3b08d" - note: using 0f6b37dbe527 as ancestor of 6373bbfdae1d and e673248094b1 - alternatively, use --config merge.preferancestor=d1d156401c1b + note: using 40663881a6dd as ancestor of 3b08d01b0ab5 and adfe50279922 + alternatively, use --config merge.preferancestor=0f6b37dbe527 resolving manifests - getting f1 - getting d1/f3 to d2/f3 - merging f2 - 3 files updated, 0 files merged, 0 files removed, 1 files unresolved + merging f1 + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon [1] @@ -166,70 +134,36 @@ $ rm f* $ hg up -qC . $ hg merge -v --debug --tool internal:dump 5 --config merge.preferancestor="*" - note: merging 6373bbfdae1d+ and e673248094b1 using bids from ancestors 0f6b37dbe527 and d1d156401c1b + note: merging 3b08d01b0ab5+ and adfe50279922 using bids from ancestors 0f6b37dbe527 and 40663881a6dd calculating bids for ancestor 0f6b37dbe527 searching for copies back to rev 3 - unmatched files in local: - d2/f4 - unmatched files in other: - d1/f3 - d1/f4 - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/f4' -> dst: 'd2/f4' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' - pending file src: 'd1/f3' -> dst: 'd2/f3' - pending file src: 'd1/f4' -> dst: 'd2/f4' resolving manifests branchmerge: True, force: False, partial: False - ancestor: 0f6b37dbe527, local: 6373bbfdae1d+, remote: e673248094b1 - d2/f3: local directory rename - get from d1/f3 -> dg - d2/f4: local directory rename, both created -> m + ancestor: 0f6b37dbe527, local: 3b08d01b0ab5+, remote: adfe50279922 f1: remote is newer -> g f2: versions differ -> m - calculating bids for ancestor d1d156401c1b + calculating bids for ancestor 40663881a6dd searching for copies back to rev 3 - unmatched files in local: - d2/f4 - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/f4' -> dst: 'd2/f4' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' resolving manifests branchmerge: True, force: False, partial: False - ancestor: d1d156401c1b, local: 6373bbfdae1d+, remote: e673248094b1 + ancestor: 40663881a6dd, local: 3b08d01b0ab5+, remote: adfe50279922 f1: versions differ -> m f2: remote unchanged -> k auction for merging merge bids - d2/f3: consensus for dg - d2/f4: consensus for m f1: picking 'get' action f2: picking 'keep' action end of auction - preserving d2/f4 for resolve of d2/f4 f1: remote is newer -> g getting f1 f2: remote unchanged -> k - d2/f3: local directory rename - get from d1/f3 -> dg - getting d1/f3 to d2/f3 - d2/f4: local directory rename, both created -> m (premerge) - 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) - $ f --dump --recurse * - d2: directory with 2 files - d2/f3: - >>> - 0 base - <<< - d2/f4: - >>> - 0 base - <<< + $ f --dump * f1: >>> 5 second change @@ -243,79 +177,38 @@ The other way around: $ hg up -C -r5 - 4 files updated, 0 files merged, 1 files removed, 0 files unresolved + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge -v --debug --config merge.preferancestor="*" - note: merging e673248094b1+ and 6373bbfdae1d using bids from ancestors 0f6b37dbe527 and d1d156401c1b + note: merging adfe50279922+ and 3b08d01b0ab5 using bids from ancestors 0f6b37dbe527 and 40663881a6dd calculating bids for ancestor 0f6b37dbe527 searching for copies back to rev 3 - unmatched files in local: - d1/f3 - d1/f4 - unmatched files in other: - d2/f4 - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/f4' -> dst: 'd2/f4' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' - pending file src: 'd1/f3' -> dst: 'd2/f3' - pending file src: 'd1/f4' -> dst: 'd2/f4' resolving manifests branchmerge: True, force: False, partial: False - ancestor: 0f6b37dbe527, local: e673248094b1+, remote: 6373bbfdae1d - d2/f3: remote directory rename - move from d1/f3 -> dm - d2/f4: remote directory rename, both created -> m + ancestor: 0f6b37dbe527, local: adfe50279922+, remote: 3b08d01b0ab5 f1: remote unchanged -> k f2: versions differ -> m - calculating bids for ancestor d1d156401c1b + calculating bids for ancestor 40663881a6dd searching for copies back to rev 3 - unmatched files in other: - d2/f4 - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/f4' -> dst: 'd2/f4' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' resolving manifests branchmerge: True, force: False, partial: False - ancestor: d1d156401c1b, local: e673248094b1+, remote: 6373bbfdae1d - d1/f3: other deleted -> r - d1/f4: other deleted -> r - d2/f4: remote created -> g + ancestor: 40663881a6dd, local: adfe50279922+, remote: 3b08d01b0ab5 f1: versions differ -> m f2: remote is newer -> g auction for merging merge bids - d1/f3: consensus for r - d1/f4: consensus for r - d2/f3: consensus for dm - d2/f4: picking 'get' action f1: picking 'keep' action f2: picking 'get' action end of auction - d1/f3: other deleted -> r - removing d1/f3 - d1/f4: other deleted -> r - removing d1/f4 - d2/f4: remote created -> g - getting d2/f4 f2: remote is newer -> g getting f2 f1: remote unchanged -> k - 2 files updated, 0 files merged, 2 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) - $ f --dump --recurse * - d2: directory with 2 files - d2/f3: - >>> - 0 base - <<< - d2/f4: - >>> - 0 base - <<< + $ f --dump * f1: >>> 5 second change @@ -329,85 +222,57 @@ $ hg up -qC $ hg merge - 2 files updated, 0 files merged, 2 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg up -qC tip $ hg merge -v - note: merging 6373bbfdae1d+ and e673248094b1 using bids from ancestors 0f6b37dbe527 and d1d156401c1b + note: merging 3b08d01b0ab5+ and adfe50279922 using bids from ancestors 0f6b37dbe527 and 40663881a6dd calculating bids for ancestor 0f6b37dbe527 resolving manifests - calculating bids for ancestor d1d156401c1b + calculating bids for ancestor 40663881a6dd resolving manifests auction for merging merge bids - d2/f3: consensus for dg - d2/f4: consensus for m f1: picking 'get' action f2: picking 'keep' action end of auction getting f1 - getting d1/f3 to d2/f3 - 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg up -qC $ hg merge -v --debug --config merge.preferancestor="*" - note: merging 6373bbfdae1d+ and e673248094b1 using bids from ancestors 0f6b37dbe527 and d1d156401c1b + note: merging 3b08d01b0ab5+ and adfe50279922 using bids from ancestors 0f6b37dbe527 and 40663881a6dd calculating bids for ancestor 0f6b37dbe527 searching for copies back to rev 3 - unmatched files in local: - d2/f4 - unmatched files in other: - d1/f3 - d1/f4 - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/f4' -> dst: 'd2/f4' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' - pending file src: 'd1/f3' -> dst: 'd2/f3' - pending file src: 'd1/f4' -> dst: 'd2/f4' resolving manifests branchmerge: True, force: False, partial: False - ancestor: 0f6b37dbe527, local: 6373bbfdae1d+, remote: e673248094b1 - d2/f3: local directory rename - get from d1/f3 -> dg - d2/f4: local directory rename, both created -> m + ancestor: 0f6b37dbe527, local: 3b08d01b0ab5+, remote: adfe50279922 f1: remote is newer -> g f2: versions differ -> m - calculating bids for ancestor d1d156401c1b + calculating bids for ancestor 40663881a6dd searching for copies back to rev 3 - unmatched files in local: - d2/f4 - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/f4' -> dst: 'd2/f4' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' resolving manifests branchmerge: True, force: False, partial: False - ancestor: d1d156401c1b, local: 6373bbfdae1d+, remote: e673248094b1 + ancestor: 40663881a6dd, local: 3b08d01b0ab5+, remote: adfe50279922 f1: versions differ -> m f2: remote unchanged -> k auction for merging merge bids - d2/f3: consensus for dg - d2/f4: consensus for m f1: picking 'get' action f2: picking 'keep' action end of auction - preserving d2/f4 for resolve of d2/f4 f1: remote is newer -> g getting f1 f2: remote unchanged -> k - d2/f3: local directory rename - get from d1/f3 -> dg - getting d1/f3 to d2/f3 - d2/f4: local directory rename, both created -> m (premerge) - 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) Test the greatest common ancestor returning multiple changesets @@ -418,7 +283,7 @@ date: Thu Jan 01 00:00:00 1970 +0000 summary: 1 first change f1 - changeset: 2:d1d156401c1b + changeset: 2:40663881a6dd parent: 0:40494bf2444c user: test date: Thu Jan 01 00:00:00 1970 +0000 @@ -513,3 +378,90 @@ 2 $ cd .. + + $ hg init issue5020 + $ cd issue5020 + + $ echo a > noop + $ hg ci -qAm initial + + $ echo b > noop + $ hg ci -qAm 'uninteresting change' + + $ hg up -q 0 + $ mkdir d1 + $ echo a > d1/a + $ echo b > d1/b + $ hg ci -qAm 'add d1/a and d1/b' + + $ hg merge -q 1 + $ hg rm d1/a + $ hg mv -q d1 d2 + $ hg ci -qm 'merge while removing d1/a and moving d1/b to d2/b' + + $ hg up -q 1 + $ hg merge -q 2 + $ hg ci -qm 'merge (no changes while merging)' + $ hg log -G -T '{rev}:{node|short} {desc}' + @ 4:c0ef19750a22 merge (no changes while merging) + |\ + +---o 3:6ca01f7342b9 merge while removing d1/a and moving d1/b to d2/b + | |/ + | o 2:154e6000f54e add d1/a and d1/b + | | + o | 1:11b5b303e36c uninteresting change + |/ + o 0:7b54db1ebf33 initial + + $ hg merge 3 --debug + note: merging c0ef19750a22+ and 6ca01f7342b9 using bids from ancestors 11b5b303e36c and 154e6000f54e + + calculating bids for ancestor 11b5b303e36c + searching for copies back to rev 3 + unmatched files in local: + d1/a + d1/b + unmatched files in other: + d2/b + all copies found (* = to merge, ! = divergent, % = renamed and deleted): + src: 'd1/b' -> dst: 'd2/b' + checking for directory renames + discovered dir src: 'd1/' -> dst: 'd2/' + pending file src: 'd1/a' -> dst: 'd2/a' + pending file src: 'd1/b' -> dst: 'd2/b' + resolving manifests + branchmerge: True, force: False, partial: False + ancestor: 11b5b303e36c, local: c0ef19750a22+, remote: 6ca01f7342b9 + d2/a: remote directory rename - move from d1/a -> dm + d2/b: remote directory rename, both created -> m + + calculating bids for ancestor 154e6000f54e + searching for copies back to rev 3 + unmatched files in other: + d2/b + all copies found (* = to merge, ! = divergent, % = renamed and deleted): + src: 'd1/b' -> dst: 'd2/b' + checking for directory renames + discovered dir src: 'd1/' -> dst: 'd2/' + resolving manifests + branchmerge: True, force: False, partial: False + ancestor: 154e6000f54e, local: c0ef19750a22+, remote: 6ca01f7342b9 + d1/a: other deleted -> r + d1/b: other deleted -> r + d2/b: remote created -> g + + auction for merging merge bids + d1/a: consensus for r + d1/b: consensus for r + d2/a: consensus for dm + d2/b: picking 'get' action + end of auction + + d1/a: other deleted -> r + removing d1/a + d1/b: other deleted -> r + removing d1/b + d2/b: remote created -> g + getting d2/b + 1 files updated, 0 files merged, 2 files removed, 0 files unresolved + (branch merge, don't forget to commit)