mercurial/merge.py
changeset 27131 d837da26155e
parent 27130 6f045b563fa5
child 27132 baa7571f40c5
--- a/mercurial/merge.py	Mon Nov 30 10:03:21 2015 -0800
+++ b/mercurial/merge.py	Mon Nov 30 10:19:39 2015 -0800
@@ -479,7 +479,10 @@
                 if fcd.isabsent(): # dc: remote picked
                     action = 'g'
                 elif fco.isabsent(): # cd: local picked
-                    action = 'a'
+                    if dfile in self.localctx:
+                        action = 'am'
+                    else:
+                        action = 'a'
                 # else: regular merges (no action necessary)
             self._results[dfile] = r, action
 
@@ -524,7 +527,7 @@
 
     def actions(self):
         """return lists of actions to perform on the dirstate"""
-        actions = {'r': [], 'f': [], 'a': [], 'g': []}
+        actions = {'r': [], 'f': [], 'a': [], 'am': [], 'g': []}
         for f, (r, action) in self._results.iteritems():
             if action is not None:
                 actions[action].append((f, None, "merge result"))
@@ -631,7 +634,7 @@
 
     if actions:
         # k, dr, e and rd are no-op
-        for m in 'a', 'f', 'g', 'cd', 'dc':
+        for m in 'a', 'am', 'f', 'g', 'cd', 'dc':
             for f, args, msg in actions[m]:
                 pmmf.add(f)
         for f, args, msg in actions['r']:
@@ -1065,6 +1068,12 @@
         z += 1
         progress(_updating, z, item=f, total=numupdates, unit=_files)
 
+    # re-add/mark as modified (manifest only, just log it)
+    for f, args, msg in actions['am']:
+        repo.ui.debug(" %s: %s -> am\n" % (f, msg))
+        z += 1
+        progress(_updating, z, item=f, total=numupdates, unit=_files)
+
     # keep (noop, just log it)
     for f, args, msg in actions['k']:
         repo.ui.debug(" %s: %s -> k\n" % (f, msg))
@@ -1189,6 +1198,13 @@
         if not branchmerge:
             repo.dirstate.add(f)
 
+    # re-add/mark as modified
+    for f, args, msg in actions.get('am', []):
+        if branchmerge:
+            repo.dirstate.normallookup(f)
+        else:
+            repo.dirstate.add(f)
+
     # exec change
     for f, args, msg in actions.get('e', []):
         repo.dirstate.normallookup(f)
@@ -1390,7 +1406,7 @@
             repo, wc, p2, pas, branchmerge, force, partial, mergeancestor,
             followcopies)
         # Convert to dictionary-of-lists format
-        actions = dict((m, []) for m in 'a f g cd dc r dm dg m e k'.split())
+        actions = dict((m, []) for m in 'a am f g cd dc r dm dg m e k'.split())
         for f, (m, args, msg) in actionbyfile.iteritems():
             if m not in actions:
                 actions[m] = []
@@ -1411,6 +1427,8 @@
                   "use (c)hanged version or (d)elete?"
                   "$$ &Changed $$ &Delete") % f, 0):
                 actions['r'].append((f, None, "prompt delete"))
+            elif f in p1:
+                actions['am'].append((f, None, "prompt keep"))
             else:
                 actions['a'].append((f, None, "prompt keep"))