Mercurial > hg
view tests/test-merge-criss-cross.t @ 21128:f4014f646f71
merge: with merge.preferancestor=*, run an auction with bids from ancestors
The basic idea is to do the merge planning with all the available ancestors,
consider the resulting actions as "bids", make an "auction" and
automatically pick the most favourable action for each file.
This implements the basic functionality and will only consider "keep" and
"get" actions. The heuristics for picking the best action can be tweaked later
on.
By default it will only pass ctx.ancestor as the single ancestor to
calculateupdates. The code path for merging with a single ancestor is not
changed.
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Fri, 28 Feb 2014 02:52:32 +0100 |
parents | 99b5eaf372a7 |
children | b743077db69a |
line wrap: on
line source
Criss cross merging $ hg init criss-cross $ cd criss-cross $ echo '0 base' > f1 $ echo '0 base' > f2 $ hg ci -Aqm '0 base' $ echo '1 first change' > f1 $ hg ci -m '1 first change f1' $ hg up -qr0 $ echo '2 first change' > f2 $ hg ci -qm '2 first change f2' $ hg merge -qr 1 $ hg ci -m '3 merge' $ hg up -qr2 $ hg merge -qr1 $ hg ci -qm '4 merge' $ echo '5 second change' > f1 $ hg ci -m '5 second change f1' $ hg up -r3 note: using 0f6b37dbe527 as ancestor of adfe50279922 and cf89f02107e5 alternatively, use --config merge.preferancestor=40663881a6dd 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:3b08d01b0ab5 | tag: tip | parent: 3:cf89f02107e5 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: 6 second change f2 | | o changeset: 5:adfe50279922 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: 5 second change f1 | | | 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:cf89f02107e5 | | | parent: 2:40663881a6dd |/ / parent: 1:0f6b37dbe527 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: 3 merge | | | o changeset: 2:40663881a6dd | | parent: 0:40494bf2444c | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: 2 first change f2 | | o | changeset: 1:0f6b37dbe527 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: 1 first change f1 | o changeset: 0:40494bf2444c user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: 0 base $ hg merge -v --debug --tool internal:dump 5 note: using 0f6b37dbe527 as ancestor of 3b08d01b0ab5 and adfe50279922 alternatively, use --config merge.preferancestor=40663881a6dd searching for copies back to rev 3 resolving manifests branchmerge: True, force: False, partial: False ancestor: 0f6b37dbe527, local: 3b08d01b0ab5+, remote: adfe50279922 f1: remote is newer -> g f2: versions differ -> m preserving f2 for resolve of f2 getting f1 updating: f1 1/2 files (50.00%) updating: f2 2/2 files (100.00%) picked tool 'internal:dump' for f2 (binary False symlink False) merging f2 my f2@3b08d01b0ab5+ other f2@adfe50279922 ancestor f2@40494bf2444c 1 files updated, 0 files merged, 0 files removed, 1 files unresolved use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon [1] $ head * ==> f1 <== 5 second change ==> f2 <== 6 second change ==> f2.base <== 0 base ==> f2.local <== 6 second change ==> f2.orig <== 6 second change ==> f2.other <== 2 first change $ hg up -qC . $ hg merge -v --tool internal:dump 5 --config merge.preferancestor="null 40663881 3b08d" note: using 40663881a6dd as ancestor of 3b08d01b0ab5 and adfe50279922 alternatively, use --config merge.preferancestor=0f6b37dbe527 resolving manifests merging f1 0 files updated, 0 files merged, 0 files removed, 1 files unresolved use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon [1] Redo merge with merge.preferancestor="*" to enable bid merge $ rm f* $ hg up -qC . $ hg merge -v --debug --tool internal:dump 5 --config merge.preferancestor="*" calculating bids for ancestor 0f6b37dbe527 searching for copies back to rev 3 resolving manifests branchmerge: True, force: False, partial: False ancestor: 0f6b37dbe527, local: 3b08d01b0ab5+, remote: adfe50279922 f1: g f2: m calculating bids for ancestor 40663881a6dd searching for copies back to rev 3 resolving manifests branchmerge: True, force: False, partial: False ancestor: 40663881a6dd, local: 3b08d01b0ab5+, remote: adfe50279922 f1: m f2: k auction for merging merge bids f1: picking 'get' action f2: picking 'keep' action end of auction f1: remote is newer -> g f2: keep -> k getting f1 updating: f1 1/1 files (100.00%) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ head * ==> f1 <== 5 second change ==> f2 <== 6 second change The other way around: $ hg up -C -r5 note: using 0f6b37dbe527 as ancestor of 3b08d01b0ab5 and adfe50279922 alternatively, use --config merge.preferancestor=40663881a6dd 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge -v --debug --config merge.preferancestor="*" calculating bids for ancestor 0f6b37dbe527 searching for copies back to rev 3 resolving manifests branchmerge: True, force: False, partial: False ancestor: 0f6b37dbe527, local: adfe50279922+, remote: 3b08d01b0ab5 f1: k f2: m calculating bids for ancestor 40663881a6dd searching for copies back to rev 3 resolving manifests branchmerge: True, force: False, partial: False ancestor: 40663881a6dd, local: adfe50279922+, remote: 3b08d01b0ab5 f1: m f2: g auction for merging merge bids f1: picking 'keep' action f2: picking 'get' action end of auction f1: keep -> k f2: remote is newer -> g getting f2 updating: f2 1/1 files (100.00%) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ head * ==> f1 <== 5 second change ==> f2 <== 6 second change Verify how the output looks and and how verbose it is: $ hg up -qC $ hg merge --config merge.preferancestor="*" 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 --config merge.preferancestor="*" calculating bids for ancestor 0f6b37dbe527 resolving manifests calculating bids for ancestor 40663881a6dd resolving manifests auction for merging merge bids f1: picking 'get' action f2: picking 'keep' action end of auction getting f1 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="*" calculating bids for ancestor 0f6b37dbe527 searching for copies back to rev 3 resolving manifests branchmerge: True, force: False, partial: False ancestor: 0f6b37dbe527, local: 3b08d01b0ab5+, remote: adfe50279922 f1: g f2: m calculating bids for ancestor 40663881a6dd searching for copies back to rev 3 resolving manifests branchmerge: True, force: False, partial: False ancestor: 40663881a6dd, local: 3b08d01b0ab5+, remote: adfe50279922 f1: m f2: k auction for merging merge bids f1: picking 'get' action f2: picking 'keep' action end of auction f1: remote is newer -> g f2: keep -> k getting f1 updating: f1 1/1 files (100.00%) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ cd ..