Patchwork [STABLE] resolve: restore .orig only after merge is fully complete (issue4952)

login
register
mail settings
Submitter Siddharth Agarwal
Date Nov. 13, 2015, 11:56 p.m.
Message ID <08e5dcae034817491d15.1447459004@dev666.prn1.facebook.com>
Download mbox | patch
Permalink /patch/11400/
State Accepted
Headers show

Comments

Siddharth Agarwal - Nov. 13, 2015, 11:56 p.m.
# HG changeset patch
# User Siddharth Agarwal <sid0@fb.com>
# Date 1447458962 28800
#      Fri Nov 13 15:56:02 2015 -0800
# Branch stable
# Node ID 08e5dcae034817491d156cec7934139c469a47eb
# Parent  8a256cee72c890c761918ec1d244b286694ac51b
resolve: restore .orig only after merge is fully complete (issue4952)

Previously, we'd restore the .orig file after the premerge is complete but
before the merge was complete. This would lead to the .orig file potentially
containing merge conflict markers in it, as a leftover from the last merge
attempt.
Pierre-Yves David - Nov. 14, 2015, 1:48 a.m.
On 11/13/2015 03:56 PM, Siddharth Agarwal wrote:
> # HG changeset patch
> # User Siddharth Agarwal <sid0@fb.com>
> # Date 1447458962 28800
> #      Fri Nov 13 15:56:02 2015 -0800
> # Branch stable
> # Node ID 08e5dcae034817491d156cec7934139c469a47eb
> # Parent  8a256cee72c890c761918ec1d244b286694ac51b
> resolve: restore .orig only after merge is fully complete (issue4952)

This is pushed to the clowcopter, thanks for the quick regression fix.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -5670,10 +5670,10 @@  def resolve(ui, repo, *pats, **opts):
                     ui.setconfig('ui', 'forcemerge', '', 'resolve')
                     ms.commit()
 
-                # replace filemerge's .orig file with our resolve file
-                # for files in tocomplete, ms.resolve will not overwrite
-                # .orig -- only preresolve does
-                util.rename(a + ".resolve", a + ".orig")
+                # replace filemerge's .orig file with our resolve file, but only
+                # for merges that are complete
+                if complete:
+                    util.rename(a + ".resolve", a + ".orig")
 
         for f in tocomplete:
             try:
@@ -5687,6 +5687,10 @@  def resolve(ui, repo, *pats, **opts):
                 ui.setconfig('ui', 'forcemerge', '', 'resolve')
                 ms.commit()
 
+            # replace filemerge's .orig file with our resolve file
+            a = repo.wjoin(f)
+            util.rename(a + ".resolve", a + ".orig")
+
         ms.commit()
 
         if not didwork and pats:
diff --git a/tests/test-resolve.t b/tests/test-resolve.t
--- a/tests/test-resolve.t
+++ b/tests/test-resolve.t
@@ -207,6 +207,30 @@  resolve <file> should re-merge file
   [1]
   $ grep '<<<' file1 > /dev/null
 
+test .orig behavior with resolve
+
+  $ echo resolve > file
+  $ hg resolve -q file1 --tool 'f --dump $TESTTMP/repo/file1.orig'
+  */file1~base*: (glob)
+  >>>
+  foo
+  <<<
+  */file1~other*: (glob)
+  >>>
+  foo
+  bar
+  <<<
+  $TESTTMP/repo/file1: (glob)
+  >>>
+  foo
+  baz
+  <<<
+  $TESTTMP/repo/file1.orig: (glob)
+  >>>
+  foo
+  baz
+  <<<
+
 resolve <file> should do nothing if 'file' was marked resolved
   $ echo resolved > file1
   $ hg resolve -m file1