mercurial/loggingutil.py
changeset 40799 03127e580980
parent 40798 644adf9c20fb
child 40800 698477777883
equal deleted inserted replaced
40798:644adf9c20fb 40799:03127e580980
       
     1 # loggingutil.py - utility for logging events
       
     2 #
       
     3 # Copyright 2010 Nicolas Dumazet
       
     4 # Copyright 2013 Facebook, Inc.
       
     5 #
       
     6 # This software may be used and distributed according to the terms of the
       
     7 # GNU General Public License version 2 or any later version.
       
     8 
       
     9 from __future__ import absolute_import
       
    10 
       
    11 import errno
       
    12 
       
    13 from . import (
       
    14     pycompat,
       
    15 )
       
    16 
       
    17 def openlogfile(ui, vfs, name, maxfiles=0, maxsize=0):
       
    18     def rotate(oldpath, newpath):
       
    19         try:
       
    20             vfs.unlink(newpath)
       
    21         except OSError as err:
       
    22             if err.errno != errno.ENOENT:
       
    23                 ui.debug("warning: cannot remove '%s': %s\n" %
       
    24                          (newpath, err.strerror))
       
    25         try:
       
    26             if newpath:
       
    27                 vfs.rename(oldpath, newpath)
       
    28         except OSError as err:
       
    29             if err.errno != errno.ENOENT:
       
    30                 ui.debug("warning: cannot rename '%s' to '%s': %s\n" %
       
    31                          (newpath, oldpath, err.strerror))
       
    32 
       
    33     if maxsize > 0:
       
    34         try:
       
    35             st = vfs.stat(name)
       
    36         except OSError:
       
    37             pass
       
    38         else:
       
    39             if st.st_size >= maxsize:
       
    40                 path = vfs.join(name)
       
    41                 for i in pycompat.xrange(maxfiles - 1, 1, -1):
       
    42                     rotate(oldpath='%s.%d' % (path, i - 1),
       
    43                            newpath='%s.%d' % (path, i))
       
    44                 rotate(oldpath=path,
       
    45                        newpath=maxfiles > 0 and path + '.1')
       
    46     return vfs(name, 'a', makeparentdirs=False)
       
    47 
       
    48 class proxylogger(object):
       
    49     """Forward log events to another logger to be set later"""
       
    50 
       
    51     def __init__(self):
       
    52         self.logger = None
       
    53 
       
    54     def tracked(self, event):
       
    55         return self.logger is not None and self.logger.tracked(event)
       
    56 
       
    57     def log(self, ui, event, msg, opts):
       
    58         assert self.logger is not None
       
    59         self.logger.log(ui, event, msg, opts)