mercurial/ui.py
changeset 5036 ca0d02222d6a
parent 4729 9881abfc0e44
child 5039 c87de77a7d9f
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)