Patchwork D781: merge: check for path conflicts when updating

login
register
mail settings
Submitter phabricator
Date Oct. 1, 2017, 9:33 a.m.
Message ID <300a79935099320528bc3884c6d3382f@localhost.localdomain>
Download mbox | patch
Permalink /patch/24291/
State Not Applicable
Headers show

Comments

phabricator - Oct. 1, 2017, 9:33 a.m.
mbthomas updated this revision to Diff 2217.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D781?vs=1999&id=2217

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




To: mbthomas, #hg-reviewers, ryanmce
Cc: ryanmce, mercurial-devel

Patch

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
@@ -673,6 +673,7 @@ 
     choose a different action.
     """
     fileconflicts = set()
+    pathconflicts = set()
     warnconflicts = set()
     abortconflicts = set()
     unknownconfig = _getcheckunknownconfig(repo, 'merge', 'checkunknown')
@@ -688,11 +689,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
@@ -742,8 +747,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)