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 = sys.stdin.isatty() |
|
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) |