filemerge: add union-other-first as internal merge tool
See inline documentation for details.
Test for the full copytracing algorithm
=======================================
Initial Setup
=============
use git diff to see rename
$ cat << EOF >> $HGRCPATH
> [diff]
> git=yes
> EOF
Setup an history where one side copy and rename a file (and update it) while the other side update it.
$ hg init t
$ cd t
$ echo 1 > a
$ hg ci -qAm "first"
$ hg cp a b
$ hg mv a c
$ echo 2 >> b
$ echo 2 >> c
$ hg ci -qAm "second"
$ hg co -C 0
1 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ echo 0 > a
$ echo 1 >> a
$ hg ci -qAm "other"
$ hg log -G --patch
@ changeset: 2:add3f11052fa
| tag: tip
| parent: 0:b8bf91eeebbc
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: other
|
| diff --git a/a b/a
| --- a/a
| +++ b/a
| @@ -1,1 +1,2 @@
| +0
| 1
|
| o changeset: 1:17c05bb7fcb6
|/ user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: second
|
| diff --git a/a b/b
| rename from a
| rename to b
| --- a/a
| +++ b/b
| @@ -1,1 +1,2 @@
| 1
| +2
| diff --git a/a b/c
| copy from a
| copy to c
| --- a/a
| +++ b/c
| @@ -1,1 +1,2 @@
| 1
| +2
|
o changeset: 0:b8bf91eeebbc
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: first
diff --git a/a b/a
new file mode 100644
--- /dev/null
+++ b/a
@@ -0,0 +1,1 @@
+1
Test Simple Merge
=================
$ hg merge --debug
unmatched files in other:
b
c
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on remote side:
src: 'a' -> dst: 'b' *
src: 'a' -> dst: 'c' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: b8bf91eeebbc, local: add3f11052fa+, remote: 17c05bb7fcb6
starting 4 threads for background file closing (?)
preserving a for resolve of b
preserving a for resolve of c
removing a
b: remote moved from a -> m
picked tool ':merge' for b (binary False symlink False changedelete False)
merging a and b to b
my b@add3f11052fa+ other b@17c05bb7fcb6 ancestor a@b8bf91eeebbc
premerge successful
c: remote moved from a -> m
picked tool ':merge' for c (binary False symlink False changedelete False)
merging a and c to c
my c@add3f11052fa+ other c@17c05bb7fcb6 ancestor a@b8bf91eeebbc
premerge successful
0 files updated, 2 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
file b
$ cat b
0
1
2
file c
$ cat c
0
1
2
Test disabling copy tracing
===========================
first verify copy metadata was kept
-----------------------------------
$ hg up -qC 2
$ hg rebase --keep -d 1 -b 2 --config extensions.rebase=
rebasing 2:add3f11052fa tip "other"
merging b and a to b
merging c and a to c
$ cat b
0
1
2
next verify copy metadata is lost when disabled
------------------------------------------------
$ hg strip -r . --config extensions.strip=
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/t/.hg/strip-backup/550bd84c0cd3-fc575957-backup.hg
$ hg up -qC 2
$ hg rebase --keep -d 1 -b 2 --config extensions.rebase= --config experimental.copytrace=off --config ui.interactive=True << EOF
> c
> EOF
rebasing 2:add3f11052fa tip "other"
file 'a' was deleted in local [dest] but was modified in other [source].
You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
What do you want to do? c
$ cat b
1
2
$ cd ..
Verify disabling copy tracing still keeps copies from rebase source
-------------------------------------------------------------------
$ hg init copydisable
$ cd copydisable
$ touch a
$ hg ci -Aqm 'add a'
$ touch b
$ hg ci -Aqm 'add b, c'
$ hg cp b x
$ echo x >> x
$ hg ci -qm 'copy b->x'
$ hg up -q 1
$ touch z
$ hg ci -Aqm 'add z'
$ hg log -G -T '{rev} {desc}\n'
@ 3 add z
|
| o 2 copy b->x
|/
o 1 add b, c
|
o 0 add a
$ hg rebase -d . -b 2 --config extensions.rebase= --config experimental.copytrace=off
rebasing 2:6adcf8c12e7d "copy b->x"
saved backup bundle to $TESTTMP/copydisable/.hg/strip-backup/6adcf8c12e7d-ce4b3e75-rebase.hg
$ hg up -q 3
$ hg log -f x -T '{rev} {desc}\n'
3 copy b->x
1 add b, c
$ cd ../
test storage preservation
-------------------------
Verify rebase do not discard recorded copies data when copy tracing usage is
disabled.
Setup
$ hg init copydisable3
$ cd copydisable3
$ touch a
$ hg ci -Aqm 'add a'
$ hg cp a b
$ hg ci -Aqm 'copy a->b'
$ hg mv b c
$ hg ci -Aqm 'move b->c'
$ hg up -q 0
$ hg cp a b
$ echo b >> b
$ hg ci -Aqm 'copy a->b (2)'
$ hg log -G -T '{rev} {desc}\n'
@ 3 copy a->b (2)
|
| o 2 move b->c
| |
| o 1 copy a->b
|/
o 0 add a
Actual Test
A file is copied on one side and has been moved twice on the other side. the
file is copied from `0:a`, so the file history of the `3:b` should trace directly to `0:a`.
$ hg rebase -d 2 -s 3 --config extensions.rebase= --config experimental.copytrace=off
rebasing 3:47e1a9e6273b tip "copy a->b (2)"
saved backup bundle to $TESTTMP/copydisable3/.hg/strip-backup/47e1a9e6273b-2d099c59-rebase.hg
$ hg log -G -f b
@ changeset: 3:76024fb4b05b
: tag: tip
: user: test
: date: Thu Jan 01 00:00:00 1970 +0000
: summary: copy a->b (2)
:
o changeset: 0:ac82d8b1f7c4
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: add a