comparison hgext/blackbox.py @ 40762:37d6ee46a965

blackbox: extract global last logger to proxylogger class So the blackboxlogger can be instantiated with a repo.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 11 Nov 2018 20:02:34 +0900
parents ffd574c144d2
children 3ede5d1724bb
comparison
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')),