resolve: use "other" changeset from merge state (issue4163)

We can use the "other" data from the recorded merge state instead of inferring
what the other could be from working copy parent. This will allow resolve to
fulfil its duty even when the second parent have been dropped.

Most direct benefit is fixing a regression in backout.
This commit is contained in:
Pierre-Yves David 2014-02-25 18:45:01 -08:00
parent f2a2751552
commit 3eab08d896
3 changed files with 94 additions and 4 deletions

View File

@ -4961,7 +4961,6 @@ def resolve(ui, repo, *pats, **opts):
ms.mark(f, "u")
else:
wctx = repo[None]
mctx = wctx.parents()[-1]
# backup pre-resolve (merge uses .orig for its own purposes)
a = repo.wjoin(f)
@ -4970,7 +4969,7 @@ def resolve(ui, repo, *pats, **opts):
try:
# resolve file
ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
if ms.resolve(f, wctx, mctx):
if ms.resolve(f, wctx):
ret = 1
finally:
ui.setconfig('ui', 'forcemerge', '')

View File

@ -186,11 +186,12 @@ class mergestate(object):
def mark(self, dfile, state):
self._state[dfile][0] = state
self._dirty = True
def resolve(self, dfile, wctx, octx):
def resolve(self, dfile, wctx):
if self[dfile] == 'r':
return 0
stateentry = self._state[dfile]
state, hash, lfile, afile, anode, ofile, onode, flags = stateentry
octx = self._repo[self._other]
fcd = wctx[dfile]
fco = octx[ofile]
fca = self._repo.filectx(afile, fileid=anode)
@ -641,7 +642,7 @@ def applyupdates(repo, actions, wctx, mctx, actx, overwrite):
overwrite)
continue
audit(fd)
r = ms.resolve(fd, wctx, mctx)
r = ms.resolve(fd, wctx)
if r is not None and r > 0:
unresolved += 1
else:

View File

@ -408,3 +408,93 @@ on branch1, so no file1 and file2:
update: (current)
$ cd ..
Test usage of `hg resolve` in case of conflict
(issue4163)
$ hg init issue4163
$ cd issue4163
$ touch foo
$ hg add foo
$ cat > foo << EOF
> one
> two
> three
> four
> five
> six
> seven
> height
> nine
> ten
> EOF
$ hg ci -m 'initial'
$ cat > foo << EOF
> one
> two
> THREE
> four
> five
> six
> seven
> height
> nine
> ten
> EOF
$ hg ci -m 'capital three'
$ cat > foo << EOF
> one
> two
> THREE
> four
> five
> six
> seven
> height
> nine
> TEN
> EOF
$ hg ci -m 'capital ten'
$ hg backout -r 'desc("capital three")' --tool internal:fail
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
[1]
$ hg status
$ hg resolve -l # still unresolved
U foo
$ hg summary
parent: 2:b71750c4b0fd tip
capital ten
branch: default
commit: 1 unresolved (clean)
update: (current)
$ hg resolve --all --debug
picked tool 'internal:merge' for foo (binary False symlink False)
merging foo
my foo@b71750c4b0fd+ other foo@a30dd8addae3 ancestor foo@913609522437
premerge successful
$ hg status
M foo
? foo.orig
$ hg resolve -l
R foo
$ hg summary
parent: 2:b71750c4b0fd tip
capital ten
branch: default
commit: 1 modified, 1 unknown
update: (current)
$ cat foo
one
two
three
four
five
six
seven
height
nine
TEN