hgext/blackbox.py
changeset 40799 03127e580980
parent 40798 644adf9c20fb
child 40993 49d48489a16b
equal deleted inserted replaced
40798:644adf9c20fb 40799:03127e580980
    40 
    40 
    41 """
    41 """
    42 
    42 
    43 from __future__ import absolute_import
    43 from __future__ import absolute_import
    44 
    44 
    45 import errno
       
    46 import re
    45 import re
    47 
    46 
    48 from mercurial.i18n import _
    47 from mercurial.i18n import _
    49 from mercurial.node import hex
    48 from mercurial.node import hex
    50 
    49 
    51 from mercurial import (
    50 from mercurial import (
    52     encoding,
    51     encoding,
    53     pycompat,
    52     loggingutil,
    54     registrar,
    53     registrar,
    55 )
    54 )
    56 from mercurial.utils import (
    55 from mercurial.utils import (
    57     dateutil,
    56     dateutil,
    58     procutil,
    57     procutil,
    87 )
    86 )
    88 configitem('blackbox', 'date-format',
    87 configitem('blackbox', 'date-format',
    89     default='%Y/%m/%d %H:%M:%S',
    88     default='%Y/%m/%d %H:%M:%S',
    90 )
    89 )
    91 
    90 
    92 def _openlogfile(ui, vfs, name, maxfiles=0, maxsize=0):
    91 _lastlogger = loggingutil.proxylogger()
    93     def rotate(oldpath, newpath):
       
    94         try:
       
    95             vfs.unlink(newpath)
       
    96         except OSError as err:
       
    97             if err.errno != errno.ENOENT:
       
    98                 ui.debug("warning: cannot remove '%s': %s\n" %
       
    99                          (newpath, err.strerror))
       
   100         try:
       
   101             if newpath:
       
   102                 vfs.rename(oldpath, newpath)
       
   103         except OSError as err:
       
   104             if err.errno != errno.ENOENT:
       
   105                 ui.debug("warning: cannot rename '%s' to '%s': %s\n" %
       
   106                          (newpath, oldpath, err.strerror))
       
   107 
       
   108     if maxsize > 0:
       
   109         try:
       
   110             st = vfs.stat(name)
       
   111         except OSError:
       
   112             pass
       
   113         else:
       
   114             if st.st_size >= maxsize:
       
   115                 path = vfs.join(name)
       
   116                 for i in pycompat.xrange(maxfiles - 1, 1, -1):
       
   117                     rotate(oldpath='%s.%d' % (path, i - 1),
       
   118                            newpath='%s.%d' % (path, i))
       
   119                 rotate(oldpath=path,
       
   120                        newpath=maxfiles > 0 and path + '.1')
       
   121     return vfs(name, 'a', makeparentdirs=False)
       
   122 
       
   123 class proxylogger(object):
       
   124     """Forward log events to another logger to be set later"""
       
   125 
       
   126     def __init__(self):
       
   127         self.logger = None
       
   128 
       
   129     def tracked(self, event):
       
   130         return self.logger is not None and self.logger.tracked(event)
       
   131 
       
   132     def log(self, ui, event, msg, opts):
       
   133         assert self.logger is not None
       
   134         self.logger.log(ui, event, msg, opts)
       
   135 
       
   136 _lastlogger = proxylogger()
       
   137 
    92 
   138 class blackboxlogger(object):
    93 class blackboxlogger(object):
   139     def __init__(self, ui, repo):
    94     def __init__(self, ui, repo):
   140         self._repo = repo
    95         self._repo = repo
   141         self._trackedevents = set(ui.configlist('blackbox', 'track'))
    96         self._trackedevents = set(ui.configlist('blackbox', 'track'))
   163         else:
   118         else:
   164             src = ''
   119             src = ''
   165         try:
   120         try:
   166             fmt = '%s %s @%s%s (%s)%s> %s'
   121             fmt = '%s %s @%s%s (%s)%s> %s'
   167             args = (date, user, rev, changed, pid, src, msg)
   122             args = (date, user, rev, changed, pid, src, msg)
   168             with _openlogfile(ui, self._repo.vfs, name='blackbox.log',
   123             with loggingutil.openlogfile(
   169                               maxfiles=self._maxfiles,
   124                     ui, self._repo.vfs, name='blackbox.log',
   170                               maxsize=self._maxsize) as fp:
   125                     maxfiles=self._maxfiles, maxsize=self._maxsize) as fp:
   171                 fp.write(fmt % args)
   126                 fp.write(fmt % args)
   172         except (IOError, OSError) as err:
   127         except (IOError, OSError) as err:
   173             # deactivate this to avoid failed logging again
   128             # deactivate this to avoid failed logging again
   174             self._trackedevents.clear()
   129             self._trackedevents.clear()
   175             ui.debug('warning: cannot write to blackbox.log: %s\n' %
   130             ui.debug('warning: cannot write to blackbox.log: %s\n' %