hgext/blackbox.py
changeset 40762 37d6ee46a965
parent 40760 ffd574c144d2
child 40763 3ede5d1724bb
equal deleted inserted replaced
40761:691c68bc1222 40762:37d6ee46a965
    86     default=lambda: ['*'],
    86     default=lambda: ['*'],
    87 )
    87 )
    88 configitem('blackbox', 'date-format',
    88 configitem('blackbox', 'date-format',
    89     default='%Y/%m/%d %H:%M:%S',
    89     default='%Y/%m/%d %H:%M:%S',
    90 )
    90 )
    91 
       
    92 _lastlogger = None
       
    93 
    91 
    94 def _openlogfile(ui, vfs):
    92 def _openlogfile(ui, vfs):
    95     def rotate(oldpath, newpath):
    93     def rotate(oldpath, newpath):
    96         try:
    94         try:
    97             vfs.unlink(newpath)
    95             vfs.unlink(newpath)
   123                            newpath='%s.%d' % (path, i))
   121                            newpath='%s.%d' % (path, i))
   124                 rotate(oldpath=path,
   122                 rotate(oldpath=path,
   125                        newpath=maxfiles > 0 and path + '.1')
   123                        newpath=maxfiles > 0 and path + '.1')
   126     return vfs(name, 'a')
   124     return vfs(name, 'a')
   127 
   125 
       
   126 class proxylogger(object):
       
   127     """Forward log events to another logger to be set later"""
       
   128 
       
   129     def __init__(self):
       
   130         self.logger = None
       
   131 
       
   132     def tracked(self, event):
       
   133         return self.logger is not None and self.logger.tracked(event)
       
   134 
       
   135     def log(self, ui, event, msg, opts):
       
   136         assert self.logger is not None
       
   137         self.logger.log(ui, event, msg, opts)
       
   138 
       
   139 _lastlogger = proxylogger()
       
   140 
   128 class blackboxlogger(object):
   141 class blackboxlogger(object):
   129     def __init__(self, ui):
   142     def __init__(self, ui):
   130         self._repo = None
   143         self._repo = None
   131         self._trackedevents = set(ui.configlist('blackbox', 'track'))
   144         self._trackedevents = set(ui.configlist('blackbox', 'track'))
   132 
   145 
   141 
   154 
   142     def tracked(self, event):
   155     def tracked(self, event):
   143         return b'*' in self._trackedevents or event in self._trackedevents
   156         return b'*' in self._trackedevents or event in self._trackedevents
   144 
   157 
   145     def log(self, ui, event, msg, opts):
   158     def log(self, ui, event, msg, opts):
   146         global _lastlogger
       
   147         if self._bbvfs:
   159         if self._bbvfs:
   148             _lastlogger = self
   160             _lastlogger.logger = self
   149         elif _lastlogger and _lastlogger._bbvfs:
       
   150             # certain logger instances exist outside the context of
       
   151             # a repo, so just default to the last blackbox logger that
       
   152             # was seen.
       
   153             pass
       
   154         else:
   161         else:
   155             return
   162             return
   156         _lastlogger._log(ui, event, msg, opts)
   163 
   157 
       
   158     def _log(self, ui, event, msg, opts):
       
   159         default = ui.configdate('devel', 'default-date')
   164         default = ui.configdate('devel', 'default-date')
   160         date = dateutil.datestr(default, ui.config('blackbox', 'date-format'))
   165         date = dateutil.datestr(default, ui.config('blackbox', 'date-format'))
   161         user = procutil.getuser()
   166         user = procutil.getuser()
   162         pid = '%d' % procutil.getpid()
   167         pid = '%d' % procutil.getpid()
   163         rev = '(unknown)'
   168         rev = '(unknown)'
   185 
   190 
   186     def setrepo(self, repo):
   191     def setrepo(self, repo):
   187         self._repo = repo
   192         self._repo = repo
   188 
   193 
   189 def uipopulate(ui):
   194 def uipopulate(ui):
   190     ui.setlogger(b'blackbox', blackboxlogger(ui))
   195     ui.setlogger(b'blackbox', _lastlogger)
   191 
   196 
   192 def reposetup(ui, repo):
   197 def reposetup(ui, repo):
   193     # During 'hg pull' a httppeer repo is created to represent the remote repo.
   198     # During 'hg pull' a httppeer repo is created to represent the remote repo.
   194     # It doesn't have a .hg directory to put a blackbox in, so we don't do
   199     # It doesn't have a .hg directory to put a blackbox in, so we don't do
   195     # the blackbox setup for it.
   200     # the blackbox setup for it.
   198 
   203 
   199     # Since blackbox.log is stored in the repo directory, the logger should be
   204     # Since blackbox.log is stored in the repo directory, the logger should be
   200     # instantiated per repository.
   205     # instantiated per repository.
   201     logger = blackboxlogger(ui)
   206     logger = blackboxlogger(ui)
   202     ui.setlogger(b'blackbox', logger)
   207     ui.setlogger(b'blackbox', logger)
   203     if logger:
   208     logger.setrepo(repo)
   204         logger.setrepo(repo)
   209 
   205 
   210     # Set _lastlogger even if ui.log is not called. This gives blackbox a
   206         # Set _lastlogger even if ui.log is not called. This gives blackbox a
   211     # fallback place to log
   207         # fallback place to log.
   212     if _lastlogger.logger is None:
   208         global _lastlogger
   213         _lastlogger.logger = logger
   209         if _lastlogger is None:
       
   210             _lastlogger = logger
       
   211 
   214 
   212     repo._wlockfreeprefix.add('blackbox.log')
   215     repo._wlockfreeprefix.add('blackbox.log')
   213 
   216 
   214 @command('blackbox',
   217 @command('blackbox',
   215     [('l', 'limit', 10, _('the number of events to show')),
   218     [('l', 'limit', 10, _('the number of events to show')),