Mercurial > hg
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')), |