comparison hgext/blackbox.py @ 40797:ea2688c84e4b

blackbox: just try writing to repo.vfs and update lastlogger on success This is simpler and more robust. Before, an empty ".hg" directory would be created if it's removed after checking vfs.isdir('.').
author Yuya Nishihara <yuya@tcha.org>
date Sat, 17 Nov 2018 22:10:27 +0900
parents 567e164f89b8
children 644adf9c20fb
comparison
equal deleted inserted replaced
40796:03bca908d9fb 40797:ea2688c84e4b
119 for i in pycompat.xrange(maxfiles - 1, 1, -1): 119 for i in pycompat.xrange(maxfiles - 1, 1, -1):
120 rotate(oldpath='%s.%d' % (path, i - 1), 120 rotate(oldpath='%s.%d' % (path, i - 1),
121 newpath='%s.%d' % (path, i)) 121 newpath='%s.%d' % (path, i))
122 rotate(oldpath=path, 122 rotate(oldpath=path,
123 newpath=maxfiles > 0 and path + '.1') 123 newpath=maxfiles > 0 and path + '.1')
124 return vfs(name, 'a') 124 return vfs(name, 'a', makeparentdirs=False)
125 125
126 class proxylogger(object): 126 class proxylogger(object):
127 """Forward log events to another logger to be set later""" 127 """Forward log events to another logger to be set later"""
128 128
129 def __init__(self): 129 def __init__(self):
141 class blackboxlogger(object): 141 class blackboxlogger(object):
142 def __init__(self, ui, repo): 142 def __init__(self, ui, repo):
143 self._repo = repo 143 self._repo = repo
144 self._trackedevents = set(ui.configlist('blackbox', 'track')) 144 self._trackedevents = set(ui.configlist('blackbox', 'track'))
145 145
146 @property
147 def _bbvfs(self):
148 vfs = self._repo.vfs
149 if not vfs.isdir('.'):
150 vfs = None
151 return vfs
152
153 def tracked(self, event): 146 def tracked(self, event):
154 return b'*' in self._trackedevents or event in self._trackedevents 147 return b'*' in self._trackedevents or event in self._trackedevents
155 148
156 def log(self, ui, event, msg, opts): 149 def log(self, ui, event, msg, opts):
157 if self._bbvfs:
158 _lastlogger.logger = self
159 else:
160 return
161
162 default = ui.configdate('devel', 'default-date') 150 default = ui.configdate('devel', 'default-date')
163 date = dateutil.datestr(default, ui.config('blackbox', 'date-format')) 151 date = dateutil.datestr(default, ui.config('blackbox', 'date-format'))
164 user = procutil.getuser() 152 user = procutil.getuser()
165 pid = '%d' % procutil.getpid() 153 pid = '%d' % procutil.getpid()
166 rev = '(unknown)' 154 rev = '(unknown)'
176 else: 164 else:
177 src = '' 165 src = ''
178 try: 166 try:
179 fmt = '%s %s @%s%s (%s)%s> %s' 167 fmt = '%s %s @%s%s (%s)%s> %s'
180 args = (date, user, rev, changed, pid, src, msg) 168 args = (date, user, rev, changed, pid, src, msg)
181 with _openlogfile(ui, self._bbvfs) as fp: 169 with _openlogfile(ui, self._repo.vfs) as fp:
182 fp.write(fmt % args) 170 fp.write(fmt % args)
183 except (IOError, OSError) as err: 171 except (IOError, OSError) as err:
184 # deactivate this to avoid failed logging again 172 # deactivate this to avoid failed logging again
185 self._trackedevents.clear() 173 self._trackedevents.clear()
186 ui.debug('warning: cannot write to blackbox.log: %s\n' % 174 ui.debug('warning: cannot write to blackbox.log: %s\n' %
187 encoding.strtolocal(err.strerror)) 175 encoding.strtolocal(err.strerror))
176 return
177 _lastlogger.logger = self
188 178
189 def uipopulate(ui): 179 def uipopulate(ui):
190 ui.setlogger(b'blackbox', _lastlogger) 180 ui.setlogger(b'blackbox', _lastlogger)
191 181
192 def reposetup(ui, repo): 182 def reposetup(ui, repo):