diff mercurial/ui.py @ 9048:86b4a9b0ddda

ui: extract choice from prompt avoid translating single characters (as l for _local or sym_link)
author Simon Heimberg <simohe@besonet.ch>
date Sun, 21 Jun 2009 01:13:19 +0200
parents 01ada7b1861d
children 6adc899c98d0
line wrap: on
line diff
--- a/mercurial/ui.py	Sun Jul 05 17:09:01 2009 +0200
+++ b/mercurial/ui.py	Sun Jun 21 01:13:19 2009 +0200
@@ -269,30 +269,35 @@
             line = line[:-1]
         return line
 
-    def prompt(self, msg, choices=None, default="y"):
-        """Prompt user with msg, read response, and ensure it matches
-        one of the provided choices. choices is a sequence of acceptable
-        responses with the format: ('&None', 'E&xec', 'Sym&link')
-        No sequence implies no response checking. Responses are case
-        insensitive. If ui is not interactive, the default is returned.
+    def prompt(self, msg, default="y"):
+        """Prompt user with msg, read response.
+        If ui is not interactive, the default is returned.
         """
         if not self.interactive():
             self.write(msg, ' ', default, "\n")
             return default
+        try:
+            r = self._readline(msg + ' ')
+            if not r:
+                return default
+            return r
+        except EOFError:
+            raise util.Abort(_('response expected'))
+
+    def promptchoice(self, msg, choices, default=0):
+        """Prompt user with msg, read response, and ensure it matches
+        one of the provided choices. The index of the choice is returned.
+        choices is a sequence of acceptable responses with the format:
+        ('&None', 'E&xec', 'Sym&link') Responses are case insensitive. 
+        If ui is not interactive, the default is returned.
+        """
+        resps = [s[s.index('&')+1].lower() for s in choices]
         while True:
-            try:
-                r = self._readline(msg + ' ')
-                if not r:
-                    return default
-                if not choices:
-                    return r
-                resps = [s[s.index('&')+1].lower() for s in choices]
-                if r.lower() in resps:
-                    return r.lower()
-                else:
-                    self.write(_("unrecognized response\n"))
-            except EOFError:
-                raise util.Abort(_('response expected'))
+            r = self.prompt(msg, resps[default])
+            if r.lower() in resps:
+                return resps.index(r.lower())
+            self.write(_("unrecognized response\n"))
+
 
     def getpass(self, prompt=None, default=None):
         if not self.interactive(): return default