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