Mercurial > hg
changeset 23476:39a12719ec65
merge: don't overwrite conflicting file in locally renamed directory
When the local side has renamed a directory from a/ to b/ and added a
file b/c in it, and the remote side has added a file a/c, we end up
overwriting the local file b/c with the contents of remote file
a/c. Add a check for this case and use the merge ('m') action in this
case instead of the directory rename get ('dg') action.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Wed, 03 Dec 2014 11:02:52 -0800 |
parents | 67f1d68861fb |
children | 406dfc63a1ad |
files | mercurial/merge.py tests/test-rename-dir-merge.t |
diffstat | 2 files changed, 19 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/merge.py Wed Dec 03 10:56:07 2014 -0800 +++ b/mercurial/merge.py Wed Dec 03 11:02:52 2014 -0800 @@ -475,8 +475,12 @@ pass # we'll deal with it on m1 side elif f in movewithdir: f2 = movewithdir[f] - actions['dg'].append((f2, (f, fl2), - "local directory rename - get from " + f)) + if f2 in m1: + actions['m'].append((f2, (f2, f, None, False, pa.node()), + "local directory rename, both created")) + else: + actions['dg'].append((f2, (f, fl2), + "local directory rename - get from " + f)) elif f in copy: f2 = copy[f] if f2 in m2:
--- a/tests/test-rename-dir-merge.t Wed Dec 03 10:56:07 2014 -0800 +++ b/tests/test-rename-dir-merge.t Wed Dec 03 11:02:52 2014 -0800 @@ -127,29 +127,36 @@ Local directory rename with conflicting file added in remote source directory and committed in local target directory. -BROKEN: the local file is overwritten; it should be merged - $ hg co -qC 1 $ echo target > b/c $ hg add b/c $ hg commit -qm 'new file in target directory' $ hg merge 2 - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - (branch merge, don't forget to commit) + merging b/c and a/c to b/c + warning: conflicts during merge. + merging b/c incomplete! (edit conflicts, then use 'hg resolve --mark') + 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] $ hg st -A - A b/c + M b/c a/c ? a/d + ? b/c.orig C b/a C b/b $ cat b/c + <<<<<<< local: f1c50ca4f127 - test: new file in target directory + target + ======= baz + >>>>>>> other: ce36d17b18fb - test: 2 add a/c + $ rm b/c.orig Remote directory rename with conflicting file added in remote target directory and committed in local source directory. $ hg co -qC 2 - $ rm b/c $ hg st -A ? a/d C a/a