D7974: merge: when rename was made on both sides, use ancestor as merge base
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Fri Jan 31 18:42:42 EST 2020
martinvonz edited the summary of this revision.
martinvonz updated this revision to Diff 19803.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D7974?vs=19689&id=19803
BRANCH
default
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D7974/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D7974
AFFECTED FILES
mercurial/copies.py
tests/test-rename-merge1.t
tests/test-rename-merge2.t
CHANGE DETAILS
diff --git a/tests/test-rename-merge2.t b/tests/test-rename-merge2.t
--- a/tests/test-rename-merge2.t
+++ b/tests/test-rename-merge2.t
@@ -529,7 +529,7 @@
--------------
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on local side:
- src: 'a' -> dst: 'b'
+ src: 'a' -> dst: 'b' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
@@ -538,19 +538,15 @@
preserving rev for resolve of rev
a: remote is newer -> g
getting a
- b: both created -> m (premerge)
+ b: both renamed from a -> m (premerge)
picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
merging b
- my b at 86a2aa42fc76+ other b at 8dbce441892a ancestor b at 000000000000
+ my b at 86a2aa42fc76+ other b at 8dbce441892a ancestor a at 924404dff337
+ premerge successful
rev: versions differ -> m (premerge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
merging rev
my rev at 86a2aa42fc76+ other rev at 8dbce441892a ancestor rev at 924404dff337
- b: both created -> m (merge)
- picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
- my b at 86a2aa42fc76+ other b at 8dbce441892a ancestor b at 000000000000
- launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
- merge tool returned: 0
rev: versions differ -> m (merge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
my rev at 86a2aa42fc76+ other rev at 8dbce441892a ancestor rev at 924404dff337
@@ -611,7 +607,7 @@
--------------
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on local side:
- src: 'a' -> dst: 'b'
+ src: 'a' -> dst: 'b' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
@@ -620,19 +616,15 @@
preserving rev for resolve of rev
a: remote is newer -> g
getting a
- b: both created -> m (premerge)
+ b: both renamed from a -> m (premerge)
picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
merging b
- my b at 86a2aa42fc76+ other b at 8dbce441892a ancestor b at 000000000000
+ my b at 86a2aa42fc76+ other b at 8dbce441892a ancestor a at 924404dff337
+ premerge successful
rev: versions differ -> m (premerge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
merging rev
my rev at 86a2aa42fc76+ other rev at 8dbce441892a ancestor rev at 924404dff337
- b: both created -> m (merge)
- picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
- my b at 86a2aa42fc76+ other b at 8dbce441892a ancestor b at 000000000000
- launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
- merge tool returned: 0
rev: versions differ -> m (merge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
my rev at 86a2aa42fc76+ other rev at 8dbce441892a ancestor rev at 924404dff337
@@ -652,7 +644,7 @@
--------------
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on remote side:
- src: 'a' -> dst: 'b'
+ src: 'a' -> dst: 'b' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
@@ -660,19 +652,15 @@
preserving b for resolve of b
preserving rev for resolve of rev
starting 4 threads for background file closing (?)
- b: both created -> m (premerge)
+ b: both renamed from a -> m (premerge)
picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
merging b
- my b at 0b76e65c8289+ other b at 4ce40f5aca24 ancestor b at 000000000000
+ my b at 0b76e65c8289+ other b at 4ce40f5aca24 ancestor a at 924404dff337
+ premerge successful
rev: versions differ -> m (premerge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
merging rev
my rev at 0b76e65c8289+ other rev at 4ce40f5aca24 ancestor rev at 924404dff337
- b: both created -> m (merge)
- picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
- my b at 0b76e65c8289+ other b at 4ce40f5aca24 ancestor b at 000000000000
- launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
- merge tool returned: 0
rev: versions differ -> m (merge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
my rev at 0b76e65c8289+ other rev at 4ce40f5aca24 ancestor rev at 924404dff337
@@ -692,7 +680,7 @@
--------------
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on local side:
- src: 'a' -> dst: 'b'
+ src: 'a' -> dst: 'b' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
@@ -700,35 +688,24 @@
preserving b for resolve of b
preserving rev for resolve of rev
starting 4 threads for background file closing (?)
- a: prompt deleted/changed -> m (premerge)
- picked tool ':prompt' for a (binary False symlink False changedelete True)
- file 'a' was deleted in local [working copy] but was modified in other [merge rev].
- You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
- What do you want to do? u
- b: both created -> m (premerge)
+ b: both renamed from a -> m (premerge)
picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
merging b
- my b at 02963e448370+ other b at 8dbce441892a ancestor b at 000000000000
+ my b at 02963e448370+ other b at 8dbce441892a ancestor a at 924404dff337
+ premerge successful
rev: versions differ -> m (premerge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
merging rev
my rev at 02963e448370+ other rev at 8dbce441892a ancestor rev at 924404dff337
- b: both created -> m (merge)
- picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
- my b at 02963e448370+ other b at 8dbce441892a ancestor b at 000000000000
- launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
- merge tool returned: 0
rev: versions differ -> m (merge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
my rev at 02963e448370+ other rev at 8dbce441892a ancestor rev at 924404dff337
launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
merge tool returned: 0
- 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
- use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
--------------
- M a
M b
- abort: unresolved merge conflicts (see 'hg help resolve')
--------------
$ tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a"
@@ -738,44 +715,33 @@
--------------
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on remote side:
- src: 'a' -> dst: 'b'
+ src: 'a' -> dst: 'b' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
- preserving a for resolve of a
preserving b for resolve of b
preserving rev for resolve of rev
+ b: both renamed from a -> m (premerge)
starting 4 threads for background file closing (?)
- a: prompt changed/deleted -> m (premerge)
- picked tool ':prompt' for a (binary False symlink False changedelete True)
- file 'a' was deleted in other [merge rev] but was modified in local [working copy].
- You can use (c)hanged version, (d)elete, or leave (u)nresolved.
- What do you want to do? u
- b: both created -> m (premerge)
picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
merging b
- my b at 0b76e65c8289+ other b at bdb19105162a ancestor b at 000000000000
+ my b at 0b76e65c8289+ other b at bdb19105162a ancestor a at 924404dff337
+ premerge successful
rev: versions differ -> m (premerge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
merging rev
my rev at 0b76e65c8289+ other rev at bdb19105162a ancestor rev at 924404dff337
- b: both created -> m (merge)
- picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
- my b at 0b76e65c8289+ other b at bdb19105162a ancestor b at 000000000000
- launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
- merge tool returned: 0
rev: versions differ -> m (merge)
picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
my rev at 0b76e65c8289+ other rev at bdb19105162a ancestor rev at 924404dff337
launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
merge tool returned: 0
- 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
- use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
--------------
M b
C a
- abort: unresolved merge conflicts (see 'hg help resolve')
--------------
$ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
diff --git a/tests/test-rename-merge1.t b/tests/test-rename-merge1.t
--- a/tests/test-rename-merge1.t
+++ b/tests/test-rename-merge1.t
@@ -206,57 +206,31 @@
# Depending on which side they pick, we should take that rename and get
# the changes to the source from the other side. The unchanged file should
# remain.
-# we should not get the prompts about modify/delete conflicts
$ hg merge --debug 1 -t :merge3
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on local side:
- src: 'y' -> dst: 'z'
+ src: 'y' -> dst: 'z' *
on remote side:
- src: 'x' -> dst: 'z'
+ src: 'x' -> dst: 'z' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: 5151c134577e, local: 07fcbc9a74ed+, remote: f21419739508
- preserving x for resolve of x
preserving z for resolve of z
starting 4 threads for background file closing (?)
- x: prompt changed/deleted -> m (premerge)
- picked tool ':prompt' for x (binary False symlink False changedelete True)
- file 'x' was deleted in other [merge rev] but was modified in local [working copy].
- You can use (c)hanged version, (d)elete, or leave (u)nresolved.
- What do you want to do? u
- y: prompt deleted/changed -> m (premerge)
- picked tool ':prompt' for y (binary False symlink False changedelete True)
- file 'y' was deleted in local [working copy] but was modified in other [merge rev].
- You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
- What do you want to do? u
- z: both created -> m (premerge)
+ z: both renamed from y -> m (premerge)
picked tool ':merge3' for z (binary False symlink False changedelete False)
merging z
- my z at 07fcbc9a74ed+ other z at f21419739508 ancestor z at 000000000000
- z: both created -> m (merge)
- picked tool ':merge3' for z (binary False symlink False changedelete False)
- my z at 07fcbc9a74ed+ other z at f21419739508 ancestor z at 000000000000
- warning: conflicts while merging z! (edit, then use 'hg resolve --mark')
- 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
- use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
- [1]
+ my z at 07fcbc9a74ed+ other z at f21419739508 ancestor y at 5151c134577e
+ premerge successful
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
$ ls
x
- y
z
- z.orig
$ cat x
x
foo
- $ cat y
- y
- foo
# 'z' should have had the added 'foo' line
$ cat z
- <<<<<<< working copy: 07fcbc9a74ed - test: modify x, rename y to z
- y
- ||||||| base
- =======
x
- >>>>>>> merge rev: f21419739508 - test: modify y, rename x to z
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -537,10 +537,7 @@
return
# modified on side 2
for dst in dsts1:
- if dst not in m2:
- # dst not added on side 2 (handle as regular
- # "both created" case in manifestmerge otherwise)
- copy[dst] = src
+ copy[dst] = src
class branch_copies(object):
To: martinvonz, #hg-reviewers, durin42, pulkit
Cc: durin42, marmoute, mercurial-devel
More information about the Mercurial-devel
mailing list