[PATCH] hg stable: fix issue 4748; origin of a renamed file is lost after merge
Jeremy Parente
jeremy.parente at oneaccess-net.com
Mon Jul 13 17:43:27 UTC 2015
# HG changeset patch
# User jepa, system HG Jeremy Parente <jeremy.parente at oneaccess-net.com>
# Date 1436802799 -7200
# Mon Jul 13 17:53:19 2015 +0200
# Branch stable
# Node ID b8c73f1f0d2e89aeb852f722bd3814112484d262
# Parent 540cd0ddac49c1125b2e013aa2ff18ecbd4dd954
hg: merge renamed file in c2 not modified in c1 treated as a copy (issue4748)
Change how to handle divergent that is a rename in c2 but unmodified in c1 to
keep origin, we treat such case like a copy to be able to track diff between
renamed file and original file.
diff -r 540cd0ddac49 -r b8c73f1f0d2e mercurial/copies.py
--- a/mercurial/copies.py Mon Jun 29 19:09:42 2015 -0700
+++ b/mercurial/copies.py Mon Jul 13 17:53:19 2015 +0200
@@ -337,6 +337,12 @@
# out files that have been renamed and then deleted
renamedelete[of] = [f for f in fl if f in c1 or f in c2]
renamedelete2.update(fl) # reverse map for below
+ elif of in c1 and of not in c2:
+ # fix: issue4748; not divergent, just matching renames else we
+ # lost the origin information and can't anymore diff the new
+ # file with an older revision where the file is named with the
+ # original file name
+ copy[fl[0]] = of
else:
diverge2.update(fl) # reverse map for below
diff -r 540cd0ddac49 -r b8c73f1f0d2e tests/test-commit-amend.t
--- a/tests/test-commit-amend.t Mon Jun 29 19:09:42 2015 -0700
+++ b/tests/test-commit-amend.t Mon Jul 13 17:53:19 2015 +0200
@@ -633,7 +633,7 @@
(no more unresolved files)
$ hg ci -m 'merge bar'
$ hg log --config diff.git=1 -pr .
- changeset: 23:93cd4445f720
+ changeset: 23:00530ee041cb
tag: tip
parent: 22:30d96aeaf27b
parent: 21:1aa437659d19
@@ -666,7 +666,7 @@
$ HGEDITOR="sh .hg/checkeditform.sh" hg ci --amend -m 'merge bar (amend
message)' --edit
HGEDITFORM=commit.amend.merge
$ hg log --config diff.git=1 -pr .
- changeset: 24:832b50f2c271
+ changeset: 24:95901dec8caf
tag: tip
parent: 22:30d96aeaf27b
parent: 21:1aa437659d19
@@ -699,7 +699,7 @@
$ hg mv zz z
$ hg ci --amend -m 'merge bar (undo rename)'
$ hg log --config diff.git=1 -pr .
- changeset: 26:bdafc5c72f74
+ changeset: 26:b26049e2280c
tag: tip
parent: 22:30d96aeaf27b
parent: 21:1aa437659d19
@@ -735,9 +735,9 @@
$ echo aa >> aaa
$ hg ci -m 'merge bar again'
$ hg log --config diff.git=1 -pr .
- changeset: 28:32f19415b634
+ changeset: 28:043883f1ee2e
tag: tip
- parent: 26:bdafc5c72f74
+ parent: 26:b26049e2280c
parent: 27:4c94d5bc65f5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
@@ -770,9 +770,9 @@
$ hg mv aaa aa
$ hg ci --amend -m 'merge bar again (undo rename)'
$ hg log --config diff.git=1 -pr .
- changeset: 30:1e2a06b3d312
+ changeset: 30:a3ac3d1ec482
tag: tip
- parent: 26:bdafc5c72f74
+ parent: 26:b26049e2280c
parent: 27:4c94d5bc65f5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
@@ -810,9 +810,9 @@
use (c)hanged version or (d)elete? c
$ hg ci -m 'merge bar (with conflicts)'
$ hg log --config diff.git=1 -pr .
- changeset: 33:97a298b0c59f
+ changeset: 33:4fd48f6e2dfe
tag: tip
- parent: 32:3d78ce4226b8
+ parent: 32:874800cc4ebf
parent: 31:67db8847a540
user: test
date: Thu Jan 01 00:00:00 1970 +0000
@@ -822,9 +822,9 @@
$ hg rm aa
$ hg ci --amend -m 'merge bar (with conflicts, amended)'
$ hg log --config diff.git=1 -pr .
- changeset: 35:6de0c1bde1c8
+ changeset: 35:14ad99f27692
tag: tip
- parent: 32:3d78ce4226b8
+ parent: 32:874800cc4ebf
parent: 31:67db8847a540
user: test
date: Thu Jan 01 00:00:00 1970 +0000
@@ -922,7 +922,7 @@
HG: M:
HG: A: foo
HG: R:
- HG: diff -r 6de0c1bde1c8 foo
+ HG: diff -r 14ad99f27692 foo
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
@@ -936,12 +936,12 @@
HG: M:
HG: A: foo y
HG: R:
- HG: diff -r 6de0c1bde1c8 foo
+ HG: diff -r 14ad99f27692 foo
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
HG: +foo
- HG: diff -r 6de0c1bde1c8 y
+ HG: diff -r 14ad99f27692 y
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
@@ -954,18 +954,18 @@
HG: M:
HG: A: foo y
HG: R: a
- HG: diff -r 6de0c1bde1c8 a
+ HG: diff -r 14ad99f27692 a
HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: @@ -1,2 +0,0 @@
HG: -a
HG: -a
- HG: diff -r 6de0c1bde1c8 foo
+ HG: diff -r 14ad99f27692 foo
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
HG: +foo
- HG: diff -r 6de0c1bde1c8 y
+ HG: diff -r 14ad99f27692 y
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
@@ -978,23 +978,23 @@
HG: M:
HG: A: foo y
HG: R: a x
- HG: diff -r 6de0c1bde1c8 a
+ HG: diff -r 14ad99f27692 a
HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: @@ -1,2 +0,0 @@
HG: -a
HG: -a
- HG: diff -r 6de0c1bde1c8 foo
+ HG: diff -r 14ad99f27692 foo
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
HG: +foo
- HG: diff -r 6de0c1bde1c8 x
+ HG: diff -r 14ad99f27692 x
HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: @@ -1,1 +0,0 @@
HG: -x
- HG: diff -r 6de0c1bde1c8 y
+ HG: diff -r 14ad99f27692 y
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
@@ -1009,23 +1009,23 @@
HG: M:
HG: A: foo y
HG: R: a x
- HG: diff -r 6de0c1bde1c8 a
+ HG: diff -r 14ad99f27692 a
HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: @@ -1,2 +0,0 @@
HG: -a
HG: -a
- HG: diff -r 6de0c1bde1c8 foo
+ HG: diff -r 14ad99f27692 foo
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
HG: +foo
- HG: diff -r 6de0c1bde1c8 x
+ HG: diff -r 14ad99f27692 x
HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: @@ -1,1 +0,0 @@
HG: -x
- HG: diff -r 6de0c1bde1c8 y
+ HG: diff -r 14ad99f27692 y
HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
HG: @@ -0,0 +1,1 @@
diff -r 540cd0ddac49 -r b8c73f1f0d2e tests/test-convert-hg-startrev.t
--- a/tests/test-convert-hg-startrev.t Mon Jun 29 19:09:42 2015 -0700
+++ b/tests/test-convert-hg-startrev.t Mon Jul 13 17:53:19 2015 +0200
@@ -30,7 +30,7 @@
$ hg ci -d '3 0' -qAm '3: change a'
$ hg merge
merging a and e to e
- 3 files updated, 1 files merged, 1 files removed, 0 files unresolved
+ 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -d '4 0' -qAm '4: merge 2 and 3'
$ echo a >> a
@@ -54,7 +54,7 @@
$ glog full
o 5 "5: change a" files: a
|
- o 4 "4: merge 2 and 3" files: e f
+ o 4 "4: merge 2 and 3" files: d e f
|\
| o 3 "3: change a" files: a
| |
@@ -83,7 +83,7 @@
$ glog full
o 5 "5: change a" files: a
|
- o 4 "4: merge 2 and 3" files: e f
+ o 4 "4: merge 2 and 3" files: d e f
|\
| o 3 "3: change a" files: a
| |
@@ -130,7 +130,7 @@
(It seems like a bug in log that the following doesn't show rev 1.)
$ hg log --follow --copies e
- changeset: 2:82bbac3d2cf4
+ changeset: 2:54402235e79a
user: test
date: Thu Jan 01 00:00:04 1970 +0000
summary: 4: merge 2 and 3
diff -r 540cd0ddac49 -r b8c73f1f0d2e tests/test-issue672.t
--- a/tests/test-issue672.t Mon Jun 29 19:09:42 2015 -0700
+++ b/tests/test-issue672.t Mon Jul 13 17:53:19 2015 +0200
@@ -29,19 +29,17 @@
unmatched files in other:
1a
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
- src: '1' -> dst: '1a'
+ src: '1' -> dst: '1a' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: 81f4b099af3d, local: c64f439569a9+, remote: c12dcd37c90a
- 1: other deleted -> r
+ preserving 1 for resolve of 1a
removing 1
- updating: 1 1/2 files (50.00%)
- 1a: remote created -> g
- getting 1a
- updating: 1a 2/2 files (100.00%)
2: remote unchanged -> k
- 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 1a: remote moved from 1 -> m
+ updating: 1a 1/1 files (100.00%)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m merge1 # 3
@@ -65,13 +63,13 @@
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
- ancestor: c64f439569a9, local: e327dca35ac8+, remote: 746e9549ea96
+ ancestor: c64f439569a9, local: 7aff4c906f45+, remote: 746e9549ea96
preserving 1a for resolve of 1a
1a: local copied/moved from 1 -> m
updating: 1a 1/1 files (100.00%)
picked tool 'internal:merge' for 1a (binary False symlink False)
merging 1a and 1 to 1a
- my 1a at e327dca35ac8+ other 1 at 746e9549ea96 ancestor 1 at 81f4b099af3d
+ my 1a at 7aff4c906f45+ other 1 at 746e9549ea96 ancestor 1 at 81f4b099af3d
premerge successful
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
@@ -88,14 +86,14 @@
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
- ancestor: c64f439569a9, local: 746e9549ea96+, remote: e327dca35ac8
+ ancestor: c64f439569a9, local: 746e9549ea96+, remote: 7aff4c906f45
preserving 1 for resolve of 1a
removing 1
1a: remote moved from 1 -> m
updating: 1a 1/1 files (100.00%)
picked tool 'internal:merge' for 1a (binary False symlink False)
merging 1 and 1a to 1a
- my 1a at 746e9549ea96+ other 1a at e327dca35ac8 ancestor 1 at 81f4b099af3d
+ my 1a at 746e9549ea96+ other 1a at 7aff4c906f45 ancestor 1 at 81f4b099af3d
premerge successful
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
diff -r 540cd0ddac49 -r b8c73f1f0d2e tests/test-merge-local.t
--- a/tests/test-merge-local.t Mon Jun 29 19:09:42 2015 -0700
+++ b/tests/test-merge-local.t Mon Jul 13 17:53:19 2015 +0200
@@ -55,7 +55,7 @@
merging zzz1_merge_ok
merging zzz2_merge_bad
merging zzz2_merge_bad failed!
- 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
+ 3 files updated, 1 files merged, 1 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
[1]
@@ -89,7 +89,7 @@
merging zzz2_merge_bad
warning: conflicts during merge.
merging zzz2_merge_bad incomplete! (edit conflicts, then use 'hg resolve
--mark')
- 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
+ 3 files updated, 1 files merged, 1 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
[1]
@@ -125,7 +125,7 @@
$ hg co
merging zzz1_merge_ok
- 4 files updated, 1 files merged, 2 files removed, 0 files unresolved
+ 4 files updated, 1 files merged, 1 files removed, 0 files unresolved
$ hg diff --nodates | grep "^[+-][^<>]"
--- a/zzz1_merge_ok
diff -r 540cd0ddac49 -r b8c73f1f0d2e tests/test-rename-dir-merge.t
--- a/tests/test-rename-dir-merge.t Mon Jun 29 19:09:42 2015 -0700
+++ b/tests/test-rename-dir-merge.t Mon Jul 13 17:53:19 2015 +0200
@@ -31,35 +31,35 @@
b/a
b/b
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
- src: 'a/a' -> dst: 'b/a'
- src: 'a/b' -> dst: 'b/b'
+ src: 'a/a' -> dst: 'b/a' *
+ src: 'a/b' -> dst: 'b/b' *
checking for directory renames
discovered dir src: 'a/' -> dst: 'b/'
pending file src: 'a/c' -> dst: 'b/c'
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: f9b20c0d4c51, local: ce36d17b18fb+, remote: 397f8b00a740
- a/a: other deleted -> r
+ preserving a/a for resolve of b/a
+ preserving a/b for resolve of b/b
removing a/a
- a/b: other deleted -> r
removing a/b
- updating: a/b 2/5 files (40.00%)
- b/a: remote created -> g
- getting b/a
- b/b: remote created -> g
- getting b/b
- updating: b/b 4/5 files (80.00%)
+ b/a: remote moved from a/a -> m
+ updating: b/a 1/3 files (33.33%)
+ b/b: remote moved from a/b -> m
+ updating: b/b 2/3 files (66.67%)
b/c: remote directory rename - move from a/c -> dm
- updating: b/c 5/5 files (100.00%)
+ updating: b/c 3/3 files (100.00%)
moving a/c to b/c (glob)
- 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ echo a/* b/*
a/d b/a b/b b/c
$ hg st -C
M b/a
+ a/a
M b/b
+ a/b
A b/c
a/c
R a/a
@@ -71,7 +71,7 @@
b/c renamed from a/c:354ae8da6e890359ef49ade27b68bbc361f3ca88 (glob)
$ hg co -C 1
- 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge --debug 2
searching for copies back to rev 1
unmatched files in local:
@@ -168,12 +168,14 @@
merging a/c and b/c to b/c
warning: conflicts during merge.
merging b/c incomplete! (edit conflicts, then use 'hg resolve --mark')
- 2 files updated, 0 files merged, 2 files removed, 1 files unresolved
+ 2 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]
$ hg st -A
M b/a
+ a/a
M b/b
+ a/b
M b/c
a/c
R a/a
@@ -226,11 +228,13 @@
(run 'hg heads' to see heads, 'hg merge' to merge)
$ hg merge
- 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ merging a/f and b/f to b/f
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg st -C
M b/f
+ a/f
A b/aa/g
a/aa/g
R a/aa/g
diff -r 540cd0ddac49 -r b8c73f1f0d2e tests/test-rename-merge2.t
--- a/tests/test-rename-merge2.t Mon Jun 29 19:09:42 2015 -0700
+++ b/tests/test-rename-merge2.t Mon Jul 13 17:53:19 2015 +0200
@@ -293,29 +293,28 @@
unmatched files in other:
b
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
- src: 'a' -> dst: 'b'
+ src: 'a' -> dst: 'b' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a
+ preserving a for resolve of b
preserving rev for resolve of rev
- a: other deleted -> r
removing a
- updating: a 1/3 files (33.33%)
- b: remote created -> g
- getting b
- updating: b 2/3 files (66.67%)
+ b: remote moved from a -> m
+ updating: b 1/2 files (50.00%)
rev: versions differ -> m
- updating: rev 3/3 files (100.00%)
+ updating: rev 2/2 files (100.00%)
picked tool 'python ../merge' for rev (binary False symlink False)
merging rev
my rev at 94b33a1b7f2d+ other rev at bdb19105162a ancestor rev at 924404dff337
launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
merge tool returned: 0
- 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
--------------
M b
+ a
--------------
$ tm "nm a b" " " " " "8 nothing"
diff -r 540cd0ddac49 -r b8c73f1f0d2e tests/test-revert.t
--- a/tests/test-revert.t Mon Jun 29 19:09:42 2015 -0700
+++ b/tests/test-revert.t Mon Jul 13 17:53:19 2015 +0200
@@ -350,7 +350,7 @@
merge it with the other head
$ hg merge # merge 1 into 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
(branch merge, don't forget to commit)
$ hg summary
parent: 2:b8ec310b2d4e tip
@@ -358,7 +358,7 @@
parent: 1:f6180deb8fbe
rename
branch: default
- commit: 2 modified, 1 removed (merge)
+ commit: 2 modified, 1 renamed (merge)
update: (current)
clarifies who added what
@@ -412,7 +412,6 @@
$ hg status
M base
R allyour
- R ignored
R newadd
Systematic behavior validation of most possible cases
More information about the Mercurial-devel
mailing list