Patchwork hg stable: fix issue 4748; origin of a renamed file is lost after merge

login
register
mail settings
Submitter Jeremy Parente
Date July 13, 2015, 5:43 p.m.
Message ID <55A3F8BF.50104@oneaccess-net.com>
Download mbox | patch
Permalink /patch/9968/
State Rejected
Headers show

Comments

Jeremy Parente - July 13, 2015, 5:43 p.m.
# HG changeset patch
# User jepa, system HG Jeremy Parente <jeremy.parente@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.
Sean Farley - July 13, 2015, 6:52 p.m.
Jeremy Parente <jeremy.parente@oneaccess-net.com> writes:

> # HG changeset patch
> # User jepa, system HG Jeremy Parente <jeremy.parente@oneaccess-net.com>

By the way, is this the name you want associated with your patch? Seems
like an error, but don't know for sure.

> # 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.

Thanks for looking into this!

I can't speak of the validity of your patch but I couldn't get it to
apply due to mail damage. I would suggest getting some feedback and then
resending using the patchbomb extension:

https://mercurial.selenic.com/wiki/PatchbombExtension
Matt Mackall - July 13, 2015, 8:10 p.m.
On Mon, 2015-07-13 at 19:43 +0200, Jeremy Parente wrote:
> # HG changeset patch
> # User jepa, system HG Jeremy Parente <jeremy.parente@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

My guess is this is the wrong fix.. because the file shouldn't be
considered "divergent" in the first place: that should only happen when
both sides rename. But I think you're onto something here.

The huge set of test changes is also a bit terrifying. While I believe
it's possible that all of the tests were wrong and are now fixed, I'd
like to see some evidence that the changes were actually checked for
correctness.

(And Sean's right: the entire thing is whitespace-damaged.)
Jeremy Parente - July 14, 2015, 11 a.m.
Hi Sean and Matt,

sorry about the corruption.

About the name, you are right, not the correct one, I'll fix this in my hgrc.

Should I re-send the patch with the patchbomb extension as a reply to this 
thread of mail (using the --in-reply-to) ? Or simply as a brand new mail, so 
opening a new thread ?

About the huge set of test changes, agree it's a little bit scary (was my first 
impression when they failed). Tests were not wrong, but due to my fix, result 
differs in the different test case of merge that match the issue 4748.

I don't have simply replaced the tests, I have check them first. But definitely 
a second pair of eyes is necessary (maybe I miss something because I don't 
master all the mercurial internals).

BR.


On 07/13/2015 08:52 PM, Sean Farley wrote:
>
> Jeremy Parente <jeremy.parente@oneaccess-net.com> writes:
>
>> # HG changeset patch
>> # User jepa, system HG Jeremy Parente <jeremy.parente@oneaccess-net.com>
>
> By the way, is this the name you want associated with your patch? Seems
> like an error, but don't know for sure.
>
>> # 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.
>
> Thanks for looking into this!
>
> I can't speak of the validity of your patch but I couldn't get it to
> apply due to mail damage. I would suggest getting some feedback and then
> resending using the patchbomb extension:
>
> https://mercurial.selenic.com/wiki/PatchbombExtension
>
Sean Farley - July 14, 2015, 5:15 p.m.
Jeremy Parente <jeremy.parente@oneaccess-net.com> writes:

> Hi Sean and Matt,
>
> sorry about the corruption.
>
> About the name, you are right, not the correct one, I'll fix this in my hgrc.
>
> Should I re-send the patch with the patchbomb extension as a reply to this 
> thread of mail (using the --in-reply-to) ? Or simply as a brand new mail, so 
> opening a new thread ?

When you're ready to send another patch, the common practice here is to
use --flag V2 (or V3, etc.)

> About the huge set of test changes, agree it's a little bit scary (was my first 
> impression when they failed). Tests were not wrong, but due to my fix, result 
> differs in the different test case of merge that match the issue 4748.

I would look into what Matt suggested about the files not being
divergent (i.e. perhaps your fix is not the correct one). Unfortunately,
I haven't had time to dig into this myself to provide more guidance.

Patch

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@e327dca35ac8+ other 1@746e9549ea96 ancestor 1@81f4b099af3d
+  my 1a@7aff4c906f45+ other 1@746e9549ea96 ancestor 1@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@746e9549ea96+ other 1a@e327dca35ac8 ancestor 1@81f4b099af3d
+  my 1a@746e9549ea96+ other 1a@7aff4c906f45 ancestor 1@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@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@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