D5243: resolve: fix mark-check when a file was deleted on one side (issue6020)
spectral (Kyle Lippincott)
phabricator at mercurial-scm.org
Wed Nov 7 23:46:12 UTC 2018
spectral created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
wvfs.open raises an error if one of the files does not exist. Ignoring the error
if it's ENOENT is done in several other places in this code, so I'm in good
company :)
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D5243
AFFECTED FILES
mercurial/commands.py
tests/test-resolve.t
CHANGE DETAILS
diff --git a/tests/test-resolve.t b/tests/test-resolve.t
--- a/tests/test-resolve.t
+++ b/tests/test-resolve.t
@@ -616,3 +616,59 @@
Done with commands.resolve.confirm tests:
$ cd ..
+
+Test that commands.resolve.mark-check works even if there are deleted files:
+ $ hg init resolve-deleted
+ $ cd resolve-deleted
+ $ echo r0 > file1
+ $ hg ci -qAm r0
+ $ echo r1 > file1
+ $ hg ci -qm r1
+ $ hg co -qr 0
+ $ hg rm file1
+ $ hg ci -qm "r2 (delete file1)"
+
+(At this point we have r0 creating file1, and sibling commits r1 and r2, which
+ modify and delete file1, respectively)
+
+ $ hg merge -r 1
+ file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
+ What do you want to do?
+ use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
+ [1]
+ $ hg resolve --list
+ U file1
+ $ hg resolve --mark --config commands.resolve.mark-check=abort
+ (no more unresolved files)
+ $ hg resolve --list
+ R file1
+ $ hg resolve --unmark file1
+ $ hg resolve --mark --config commands.resolve.mark-check=warn
+ (no more unresolved files)
+ $ hg resolve --list
+ R file1
+
+For completeness, let's try that in the opposite direction (merging r2 into r1,
+instead of r1 into r2):
+ $ hg update -qCr 1
+ $ hg merge -r 2
+ file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
+ What do you want to do?
+ use (c)hanged version, (d)elete, or leave (u)nresolved? u
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
+ [1]
+ $ hg resolve --list
+ U file1
+ $ hg resolve --mark --config commands.resolve.mark-check=abort
+ (no more unresolved files)
+ $ hg resolve --list
+ R file1
+ $ hg resolve --unmark file1
+ $ hg resolve --mark --config commands.resolve.mark-check=warn
+ (no more unresolved files)
+ $ hg resolve --list
+ R file1
+ $ cd ..
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4917,8 +4917,12 @@
if mark:
if markcheck:
- with repo.wvfs(f) as fobj:
- fdata = fobj.read()
+ try:
+ with repo.wvfs(f) as fobj:
+ fdata = fobj.read()
+ except (IOError, OSError) as inst:
+ if inst.errno != errno.ENOENT:
+ raise
if filemerge.hasconflictmarkers(fdata) and \
ms[f] != mergemod.MERGE_RECORD_RESOLVED:
hasconflictmarkers.append(f)
To: spectral, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list