[PATCH STABLE] resolve: restore .orig only after merge is fully complete (issue4952)
Matt Harbison
mharbison72 at gmail.com
Sun Nov 22 13:24:35 CST 2015
On Fri, 13 Nov 2015 18:56:44 -0500, Siddharth Agarwal <sid0 at fb.com> wrote:
> # HG changeset patch
> # User Siddharth Agarwal <sid0 at 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.
>
> 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
I had to adjust the command line for Windows (it can't execute f directly):
$ hg resolve -q file1 --tool "sh -c 'f --dump
\"$TESTTMP/repo/file1.orig\"'"
But then I get the following diff:
--- c:/Users/Matt/Projects/hg/tests/test-resolve.t
+++ c:/Users/Matt/Projects/hg/tests/test-resolve.t.err
@@ -211,25 +211,11 @@
$ echo resolve > file
$ hg resolve -q file1 --tool "sh -c 'f --dump
\"$TESTTMP/repo/file1.orig\"'"
- */file1~base*: (glob)
+ $TESTTMP/repo/file1.orig:\r (esc)
>>>
foo
- <<<
- */file1~other*: (glob)
- >>>
- foo
- bar
- <<<
- $TESTTMP/repo/file1: (glob)
- >>>
- foo
- baz
- <<<
- $TESTTMP/repo/file1.orig: (glob)
- >>>
- foo
- baz
- <<<
+ baz\r (esc)
+ <<<\r (esc)
resolve <file> should do nothing if 'file' was marked resolved
$ echo resolved > file1
Basically, file1~base, file1~other and file1 are missing from the file. I
don't see any conditional tests to explain the diff, and I'm not familiar
with the resolve code. Any thoughts on what this could be?
More information about the Mercurial-devel
mailing list