Patchwork D777: merge: add merge action 'pr' to rename files during update

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

Comments

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

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D777?vs=1995&id=2213

REVISION DETAIL
  https://phab.mercurial-scm.org/D777

AFFECTED FILES
  mercurial/merge.py
  mercurial/sparse.py

CHANGE DETAILS




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

Patch

diff --git a/mercurial/sparse.py b/mercurial/sparse.py
--- a/mercurial/sparse.py
+++ b/mercurial/sparse.py
@@ -487,7 +487,7 @@ 
 
     # Apply changes to disk
     typeactions = dict((m, [])
-                       for m in 'a f g am cd dc r dm dg m e k p'.split())
+                       for m in 'a f g am cd dc r dm dg m e k p pr'.split())
     for f, (m, args, msg) in actions.iteritems():
         if m not in typeactions:
             typeactions[m] = []
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -1260,14 +1260,26 @@ 
         z += 1
         progress(_updating, z, item=f, total=numupdates, unit=_files)
 
-    # remove in parallel (must come before getting)
+    # remove in parallel (must come before resolving path conflicts and getting)
     prog = worker.worker(repo.ui, 0.001, batchremove, (repo, wctx),
                          actions['r'])
     for i, item in prog:
         z += i
         progress(_updating, z, item=item, total=numupdates, unit=_files)
     removed = len(actions['r'])
 
+    # resolve path conflicts (must come before getting)
+    for f, args, msg in actions['pr']:
+        repo.ui.debug(" %s: %s -> pr\n" % (f, msg))
+        f0, = args
+        if wctx[f0].lexists():
+            repo.ui.note(_("moving %s to %s\n") % (f0, f))
+            wctx[f].audit()
+            wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags())
+            wctx[f0].remove()
+        z += 1
+        progress(_updating, z, item=f, total=numupdates, unit=_files)
+
     # We should flush before forking into worker processes, since those workers
     # flush when they complete, and we don't want to duplicate work.
     wctx.flushall()
@@ -1440,6 +1452,17 @@ 
     for f, args, msg in actions.get('f', []):
         repo.dirstate.drop(f)
 
+    # resolve path conflicts
+    for f, args, msg in actions.get('pr', []):
+        f0, = args
+        origf0 = repo.dirstate.copied(f0) or f0
+        repo.dirstate.add(f)
+        repo.dirstate.copy(origf0, f)
+        if f0 == origf0:
+            repo.dirstate.remove(f0)
+        else:
+            repo.dirstate.drop(f0)
+
     # re-add
     for f, args, msg in actions.get('a', []):
         repo.dirstate.add(f)
@@ -1675,7 +1698,7 @@ 
 
         if updatecheck == 'noconflict':
             for f, (m, args, msg) in actionbyfile.iteritems():
-                if m not in ('g', 'k', 'e', 'r'):
+                if m not in ('g', 'k', 'e', 'r', 'pr'):
                     msg = _("conflicting changes")
                     hint = _("commit or update --clean to discard changes")
                     raise error.Abort(msg, hint=hint)
@@ -1711,7 +1734,7 @@ 
 
         # Convert to dictionary-of-lists format
         actions = dict((m, [])
-                       for m in 'a am f g cd dc r dm dg m e k p'.split())
+                       for m in 'a am f g cd dc r dm dg m e k p pr'.split())
         for f, (m, args, msg) in actionbyfile.iteritems():
             if m not in actions:
                 actions[m] = []