Mercurial > public > mercurial-scm > hg
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) |