##// END OF EJS Templates
ui: get readline and prompt to behave better depending on interactivity
Bryan O'Sullivan -
r5036:ca0d0222 default
parent child Browse files
Show More
@@ -24,6 +24,8 b' def updateconfig(source, dest, sections='
24 dest.set(section, name, value)
24 dest.set(section, name, value)
25
25
26 class ui(object):
26 class ui(object):
27 _isatty = None
28
27 def __init__(self, verbose=False, debug=False, quiet=False,
29 def __init__(self, verbose=False, debug=False, quiet=False,
28 interactive=True, traceback=False, report_untrusted=True,
30 interactive=True, traceback=False, report_untrusted=True,
29 parentui=None):
31 parentui=None):
@@ -62,6 +64,11 b' class ui(object):'
62 def __getattr__(self, key):
64 def __getattr__(self, key):
63 return getattr(self.parentui, key)
65 return getattr(self.parentui, key)
64
66
67 def isatty(self):
68 if ui._isatty is None:
69 ui._isatty = os.isatty(sys.stdin.fileno())
70 return ui._isatty
71
65 def updateopts(self, verbose=False, debug=False, quiet=False,
72 def updateopts(self, verbose=False, debug=False, quiet=False,
66 interactive=True, traceback=False, config=[]):
73 interactive=True, traceback=False, config=[]):
67 for section, name, value in config:
74 for section, name, value in config:
@@ -204,7 +211,9 b' class ui(object):'
204 if name is None or name in ('quiet', 'verbose', 'debug'):
211 if name is None or name in ('quiet', 'verbose', 'debug'):
205 self.verbosity_constraints()
212 self.verbosity_constraints()
206 if name is None or name == 'interactive':
213 if name is None or name == 'interactive':
207 self.interactive = self.configbool("ui", "interactive", True)
214 self.interactive = self.configbool("ui", "interactive", None)
215 if self.interactive is None:
216 self.interactive = self.isatty()
208 if name is None or name == 'report_untrusted':
217 if name is None or name == 'report_untrusted':
209 self.report_untrusted = (
218 self.report_untrusted = (
210 self.configbool("ui", "report_untrusted", True))
219 self.configbool("ui", "report_untrusted", True))
@@ -382,17 +391,29 b' class ui(object):'
382 try: sys.stderr.flush()
391 try: sys.stderr.flush()
383 except: pass
392 except: pass
384
393
385 def readline(self):
394 def readline(self, prompt=''):
386 return sys.stdin.readline()[:-1]
395 if self.isatty():
396 try:
397 # magically add command line editing support, where
398 # available
399 import readline
400 # force demandimport to really load the module
401 readline.read_history_file
402 except ImportError:
403 pass
404 return raw_input(prompt)
405
387 def prompt(self, msg, pat=None, default="y"):
406 def prompt(self, msg, pat=None, default="y"):
388 if not self.interactive: return default
407 if not self.interactive: return default
389 while 1:
408 try:
390 self.write(msg, " ")
409 r = self.readline(msg + ' ')
391 r = self.readline()
392 if not pat or re.match(pat, r):
410 if not pat or re.match(pat, r):
393 return r
411 return r
394 else:
412 else:
395 self.write(_("unrecognized response\n"))
413 self.write(_("unrecognized response\n"))
414 except EOFError:
415 raise util.Abort(_('response expected'))
416
396 def getpass(self, prompt=None, default=None):
417 def getpass(self, prompt=None, default=None):
397 if not self.interactive: return default
418 if not self.interactive: return default
398 return getpass.getpass(prompt or _('password: '))
419 return getpass.getpass(prompt or _('password: '))
General Comments 0
You need to be logged in to leave comments. Login now