D781: merge: check for path conflicts when updating (issue5628)
mbthomas (Mark Thomas)
phabricator at mercurial-scm.org
Mon Oct 2 21:16:42 UTC 2017
mbthomas updated this revision to Diff 2358.
mbthomas retitled this revision from "merge: check for path conflicts when updating" to "merge: check for path conflicts when updating (issue5628)".
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D781?vs=2217&id=2358
REVISION DETAIL
https://phab.mercurial-scm.org/D781
AFFECTED FILES
mercurial/merge.py
tests/test-merge1.t
tests/test-pathconflicts-basic.t
tests/test-update-names.t
CHANGE DETAILS
diff --git a/tests/test-update-names.t b/tests/test-update-names.t
--- a/tests/test-update-names.t
+++ b/tests/test-update-names.t
@@ -50,7 +50,8 @@
$ hg st
? name/file
$ hg up 1
- abort: *: '$TESTTMP/r1/r2/name' (glob)
+ name: untracked file differs
+ abort: untracked files in working directory differ from files in requested revision
[255]
$ cd ..
diff --git a/tests/test-pathconflicts-basic.t b/tests/test-pathconflicts-basic.t
--- a/tests/test-pathconflicts-basic.t
+++ b/tests/test-pathconflicts-basic.t
@@ -37,7 +37,8 @@
$ mkdir a
$ echo 3 > a/b
$ hg up file
- abort: *: '$TESTTMP/repo/a' (glob)
+ a: untracked file differs
+ abort: untracked files in working directory differ from files in requested revision
[255]
$ hg up --clean file
abort: *: '$TESTTMP/repo/a' (glob)
@@ -53,13 +54,9 @@
$ hg up -q 0
$ echo untracked > a
$ hg up --config merge.checkunknown=warn dir
- abort: *: '$TESTTMP/repo/a/b' (glob)
- [255]
-
-Repo is in a very bad state now - recover manually
-
- $ rm -f a
- $ hg up -q --clean 0
+ a: replacing untracked file
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (activating bookmark dir)
Basic clean update - local directory conflicts with changed remote file
diff --git a/tests/test-merge1.t b/tests/test-merge1.t
--- a/tests/test-merge1.t
+++ b/tests/test-merge1.t
@@ -30,17 +30,17 @@
$ mkdir b && touch b/nonempty
$ hg up
- abort: *: '$TESTTMP/t/b' (glob)
+ b: untracked file differs
+ abort: untracked files in working directory differ from files in requested revision
[255]
$ hg ci
- abort: last update was interrupted
- (use 'hg update' to get a consistent checkout)
- [255]
+ nothing changed
+ [1]
$ hg sum
parent: 0:538afb845929
commit #0
branch: default
- commit: 1 unknown (interrupted update)
+ commit: 1 unknown (clean)
update: 1 new changesets (update)
phases: 2 draft
$ rm b/nonempty
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -676,6 +676,7 @@
choose a different action.
"""
fileconflicts = set()
+ pathconflicts = set()
warnconflicts = set()
abortconflicts = set()
unknownconfig = _getcheckunknownconfig(repo, 'merge', 'checkunknown')
@@ -691,11 +692,15 @@
if m in ('c', 'dc'):
if _checkunknownfile(repo, wctx, mctx, f):
fileconflicts.add(f)
+ elif f not in wctx:
+ path = _checkunknowndirs(repo, f)
+ if path is not None:
+ pathconflicts.add(path)
elif m == 'dg':
if _checkunknownfile(repo, wctx, mctx, f, args[0]):
fileconflicts.add(f)
- allconflicts = fileconflicts
+ allconflicts = fileconflicts | pathconflicts
ignoredconflicts = set([c for c in allconflicts
if repo.dirstate._ignore(c)])
unknownconflicts = allconflicts - ignoredconflicts
@@ -745,8 +750,9 @@
repo.ui.warn(_("%s: replacing untracked file\n") % f)
for f, (m, args, msg) in actions.iteritems():
- backup = f in fileconflicts
if m == 'c':
+ backup = (f in fileconflicts or f in pathconflicts or
+ any(p in pathconflicts for p in util.finddirs(f)))
flags, = args
actions[f] = ('g', (flags, backup), msg)
To: mbthomas, #hg-reviewers, ryanmce
Cc: ryanmce, mercurial-devel
More information about the Mercurial-devel
mailing list