comparison mercurial/ui.py @ 5036:ca0d02222d6a

ui: get readline and prompt to behave better depending on interactivity
author Bryan O'Sullivan <bos@serpentine.com>
date Tue, 31 Jul 2007 16:28:05 -0700
parents 9881abfc0e44
children c87de77a7d9f
comparison
equal deleted inserted replaced
5035:a675f6d5d069 5036:ca0d02222d6a
22 dest.add_section(section) 22 dest.add_section(section)
23 for name, value in source.items(section, raw=True): 23 for name, value in source.items(section, raw=True):
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):
30 self.overlay = None 32 self.overlay = None
31 self.buffers = [] 33 self.buffers = []
60 self.overlay = dupconfig(self.parentui.overlay) 62 self.overlay = dupconfig(self.parentui.overlay)
61 63
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:
68 self.setconfig(section, name, value) 75 self.setconfig(section, name, value)
69 76
202 # update verbosity/interactive/report_untrusted settings 209 # update verbosity/interactive/report_untrusted settings
203 if section is None or section == 'ui': 210 if section is None or section == 'ui':
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))
211 220
212 # update trust information 221 # update trust information
380 try: sys.stdout.flush() 389 try: sys.stdout.flush()
381 except: pass 390 except: pass
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: '))
399 def status(self, *msg): 420 def status(self, *msg):
400 if not self.quiet: self.write(*msg) 421 if not self.quiet: self.write(*msg)