[PATCH 4 of 4] merge: move prompts out of manifestmerge into a separate phase

Laurens Holst laurens.nospam at grauw.nl
Tue Dec 27 15:31:06 CST 2011


# HG changeset patch
# User Laurens Holst <laurens.hg at grauw.nl>
# Date 1324436157 -3600
# Node ID d505651ca21f31284399ca6f96a600fee61b1c46
# Parent  123433001cc6a006bb8ee61071dc37c56eaa9a64
merge: move prompts out of manifestmerge into a separate phase

diff -r 123433001cc6 -r d505651ca21f mercurial/merge.py
--- a/mercurial/merge.py	Sun Dec 25 01:51:44 2011 +0100
+++ b/mercurial/merge.py	Wed Dec 21 03:55:57 2011 +0100
@@ -158,11 +158,7 @@
         if m == n: # flags agree
             pass
         elif m and n and not a: # flags set, don't agree, differ from parent
-            r = repo.ui.promptchoice(
-                _(" conflicting flags for %s\n"
-                  "(n)one, e(x)ec or sym(l)ink?") % f,
-                (_("&None"), _("E&xec"), _("Sym&link")), 0)
-            act("prompt permissions", "e", fd, ("", "x", "l")[r])
+            act("prompt permissions", "pe", fd)
         elif m and m != a: # changed from a to m
             act("local permissions", "e", fd, m)
         elif n and n != a: # changed from a to n
@@ -230,13 +226,7 @@
                 flagmergeact(f, f2, f2, f)
         elif f in ma: # clean, a different, no remote
             if n != ma[f]:
-                if repo.ui.promptchoice(
-                    _(" local changed %s which remote deleted\n"
-                      "use (c)hanged version or (d)elete?") % f,
-                    (_("&Changed"), _("&Delete")), 0):
-                    act("prompt delete", "r", f)
-                else:
-                    act("prompt keep", "a", f)
+                act("prompt delete", "pr", f)
             elif n[20:] == "a": # added, no remote
                 act("remote deleted", "f", f)
             elif n[20:] != "u":
@@ -260,13 +250,56 @@
         elif f not in ma:
             act("remote created", "g", f)
         elif n != ma[f]:
+            act("prompt recreating", "pg", f)
+
+    return action
+
+def promptquestions(repo, action):
+    "prompt for actions that need user input, and update the actions"
+
+    newaction = []
+
+    def promptflags(f):
+        r = repo.ui.promptchoice(
+            _(" conflicting flags for %s\n"
+              "(n)one, e(x)ec or sym(l)ink?") % f,
+            (_("&None"), _("E&xec"), _("Sym&link")), 0)
+        if r == 1:
+            return "x" # Exec
+        if r == 2:
+            return "l" # Symlink
+        return ""
+
+    def act(msg, m, f, *args):
+        repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
+        newaction.append((f, m) + args)
+
+    for a in action:
+        f, m = a[:2]
+        if m == "pr":
+            if repo.ui.promptchoice(
+                _(" local changed %s which remote deleted\n"
+                  "use (c)hanged version or (d)elete?") % f,
+                (_("&Changed"), _("&Delete")), 0):
+                act("prompted delete", "r", f)
+            else:
+                act("prompted keep", "a", f)
+
+        elif m == "pg":
             if repo.ui.promptchoice(
                 _("remote changed %s which local deleted\n"
                   "use (c)hanged version or leave (d)eleted?") % f,
                 (_("&Changed"), _("&Deleted")), 0) == 0:
-                act("prompt recreating", "g", f)
+                act("prompted recreating", "g", f)
+            # else swallow
 
-    return action
+        elif m == "pe":
+            act("prompted permissions", "e", f, promptflags(f))
+
+        else:
+            newaction.append(a)
+
+    return newaction
 
 # the action sort order (particularly, r first and e last)
 actionkeys = {"r": 0, "a": 1, "d": 1, "dr": 1, "f": 1, "g": 1, "m": 1, "e": 2}
@@ -570,6 +603,9 @@
         action += _forgetremoved(wc, p2, branchmerge)
         action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
 
+        ### user prompt phase
+        action = promptquestions(repo, action)
+
         ### apply phase
         if not branchmerge: # just jump to the new rev
             fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
diff -r 123433001cc6 -r d505651ca21f tests/test-merge-types.t
--- a/tests/test-merge-types.t	Sun Dec 25 01:51:44 2011 +0100
+++ b/tests/test-merge-types.t	Wed Dec 21 03:55:57 2011 +0100
@@ -24,9 +24,10 @@
   resolving manifests
    overwrite: False, partial: False
    ancestor: dc8452f1f7df, local: 300b353ff13f+, remote: 5d0a685473c5
+   a: prompt permissions -> pe
    conflicting flags for a
   (n)one, e(x)ec or sym(l)ink? n
-   a: prompt permissions -> e
+   a: prompted permissions -> e
   updating: a 1/1 files (100.00%)
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
@@ -53,9 +54,10 @@
    overwrite: False, partial: False
    ancestor: dc8452f1f7df, local: 5d0a685473c5+, remote: 300b353ff13f
    a: remote is newer -> g
+   a: prompt permissions -> pe
    conflicting flags for a
   (n)one, e(x)ec or sym(l)ink? n
-   a: prompt permissions -> e
+   a: prompted permissions -> e
   updating: a 1/2 files (50.00%)
   getting a
   updating: a 2/2 files (100.00%)
diff -r 123433001cc6 -r d505651ca21f tests/test-rename-merge2.t
--- a/tests/test-rename-merge2.t	Sun Dec 25 01:51:44 2011 +0100
+++ b/tests/test-rename-merge2.t	Wed Dec 21 03:55:57 2011 +0100
@@ -586,9 +586,10 @@
    ancestor: 924404dff337, local: 02963e448370+, remote: 8dbce441892a
    b: versions differ -> m
    rev: versions differ -> m
+   a: prompt recreating -> pg
   remote changed a which local deleted
   use (c)hanged version or leave (d)eleted? c
-   a: prompt recreating -> g
+   a: prompted recreating -> g
   preserving b for resolve of b
   preserving rev for resolve of rev
   updating: a 1/3 files (33.33%)
@@ -617,11 +618,12 @@
   resolving manifests
    overwrite: False, partial: False
    ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
+   a: prompt delete -> pr
+   b: versions differ -> m
+   rev: versions differ -> m
    local changed a which remote deleted
   use (c)hanged version or (d)elete? c
-   a: prompt keep -> a
-   b: versions differ -> m
-   rev: versions differ -> m
+   a: prompted keep -> a
   preserving b for resolve of b
   preserving rev for resolve of rev
   updating: a 1/3 files (33.33%)


More information about the Mercurial-devel mailing list