mercurial/ui.py
changeset 8208 32a2a1e244f1
parent 8206 cce63ef1045b
child 8220 6e6ebeb52899
equal deleted inserted replaced
8207:dd8d5be57d65 8208:32a2a1e244f1
    14 
    14 
    15 class ui(object):
    15 class ui(object):
    16     def __init__(self, src=None):
    16     def __init__(self, src=None):
    17         self._buffers = []
    17         self._buffers = []
    18         self.quiet = self.verbose = self.debugflag = self._traceback = False
    18         self.quiet = self.verbose = self.debugflag = self._traceback = False
    19         self.interactive = self._reportuntrusted = True
    19         self._reportuntrusted = True
    20         self._ocfg = config.config() # overlay
    20         self._ocfg = config.config() # overlay
    21         self._tcfg = config.config() # trusted
    21         self._tcfg = config.config() # trusted
    22         self._ucfg = config.config() # untrusted
    22         self._ucfg = config.config() # untrusted
    23         self._trustusers = {}
    23         self._trustusers = {}
    24         self._trustgroups = {}
    24         self._trustgroups = {}
    35             for f in util.rcpath():
    35             for f in util.rcpath():
    36                 self.readconfig(f, trust=True)
    36                 self.readconfig(f, trust=True)
    37     def copy(self):
    37     def copy(self):
    38         return ui(self)
    38         return ui(self)
    39 
    39 
    40     _isatty = None
       
    41     def isatty(self):
       
    42         if ui._isatty is None:
       
    43             try:
       
    44                 ui._isatty = sys.stdin.isatty()
       
    45             except AttributeError: # not a real file object
       
    46                 ui._isatty = False
       
    47             except IOError:
       
    48                 # access to stdin is unsafe in a WSGI environment
       
    49                 ui._isatty = False
       
    50         return ui._isatty
       
    51 
       
    52     def _is_trusted(self, fp, f):
    40     def _is_trusted(self, fp, f):
    53         st = util.fstat(fp)
    41         st = util.fstat(fp)
    54         if util.isowner(fp, st):
    42         if util.isowner(fp, st):
    55             return True
    43             return True
    56 
    44 
   110         self.verbose = self.debugflag or self.configbool('ui', 'verbose')
    98         self.verbose = self.debugflag or self.configbool('ui', 'verbose')
   111         self.quiet = not self.debugflag and self.configbool('ui', 'quiet')
    99         self.quiet = not self.debugflag and self.configbool('ui', 'quiet')
   112         if self.verbose and self.quiet:
   100         if self.verbose and self.quiet:
   113             self.quiet = self.verbose = False
   101             self.quiet = self.verbose = False
   114         self._reportuntrusted = self.configbool("ui", "report_untrusted", True)
   102         self._reportuntrusted = self.configbool("ui", "report_untrusted", True)
   115         self.interactive = self.configbool("ui", "interactive", self.isatty())
       
   116         self._traceback = self.configbool('ui', 'traceback', False)
   103         self._traceback = self.configbool('ui', 'traceback', False)
   117 
   104 
   118         # update trust information
   105         # update trust information
   119         for user in self.configlist('trusted', 'users'):
   106         for user in self.configlist('trusted', 'users'):
   120             self._trustusers[user] = 1
   107             self._trustusers[user] = 1
   257         try: sys.stdout.flush()
   244         try: sys.stdout.flush()
   258         except: pass
   245         except: pass
   259         try: sys.stderr.flush()
   246         try: sys.stderr.flush()
   260         except: pass
   247         except: pass
   261 
   248 
       
   249     def interactive(self):
       
   250         return self.configbool("ui", "interactive") or sys.stdin.isatty()
       
   251 
   262     def _readline(self, prompt=''):
   252     def _readline(self, prompt=''):
   263         if self.isatty():
   253         if sys.stdin.isatty():
   264             try:
   254             try:
   265                 # magically add command line editing support, where
   255                 # magically add command line editing support, where
   266                 # available
   256                 # available
   267                 import readline
   257                 import readline
   268                 # force demandimport to really load the module
   258                 # force demandimport to really load the module
   280     def prompt(self, msg, pat=None, default="y"):
   270     def prompt(self, msg, pat=None, default="y"):
   281         """Prompt user with msg, read response, and ensure it matches pat
   271         """Prompt user with msg, read response, and ensure it matches pat
   282 
   272 
   283         If not interactive -- the default is returned
   273         If not interactive -- the default is returned
   284         """
   274         """
   285         if not self.interactive:
   275         if not self.interactive():
   286             self.note(msg, ' ', default, "\n")
   276             self.note(msg, ' ', default, "\n")
   287             return default
   277             return default
   288         while True:
   278         while True:
   289             try:
   279             try:
   290                 r = self._readline(msg + ' ')
   280                 r = self._readline(msg + ' ')
   296                     self.write(_("unrecognized response\n"))
   286                     self.write(_("unrecognized response\n"))
   297             except EOFError:
   287             except EOFError:
   298                 raise util.Abort(_('response expected'))
   288                 raise util.Abort(_('response expected'))
   299 
   289 
   300     def getpass(self, prompt=None, default=None):
   290     def getpass(self, prompt=None, default=None):
   301         if not self.interactive: return default
   291         if not self.interactive(): return default
   302         try:
   292         try:
   303             return getpass.getpass(prompt or _('password: '))
   293             return getpass.getpass(prompt or _('password: '))
   304         except EOFError:
   294         except EOFError:
   305             raise util.Abort(_('response expected'))
   295             raise util.Abort(_('response expected'))
   306     def status(self, *msg):
   296     def status(self, *msg):