Mercurial > public > mercurial-scm > hg
annotate 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 |
rev | line source |
---|---|
18676 | 1 # blackbox.py - log repository events to a file for post-mortem debugging |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
2 # |
18676 | 3 # Copyright 2010 Nicolas Dumazet |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
4 # Copyright 2013 Facebook, Inc. |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
5 # |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
7 # GNU General Public License version 2 or any later version. |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
8 |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
9 """log repository events to a blackbox for debugging |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
10 |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
11 Logs event information to .hg/blackbox.log to help debug and diagnose problems. |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
12 The events that get logged can be configured via the blackbox.track config key. |
28246 | 13 |
19162
27013ace80eb
blackbox: fix literal block syntax
Takumi IINO <trot.thunder@gmail.com>
parents:
19066
diff
changeset
|
14 Examples:: |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
15 |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
16 [blackbox] |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
17 track = * |
28303
ce24de063aa5
blackbox: rewrite dirty documentation noting it is expensive
timeless <timeless@mozdev.org>
parents:
28248
diff
changeset
|
18 # dirty is *EXPENSIVE* (slow); |
ce24de063aa5
blackbox: rewrite dirty documentation noting it is expensive
timeless <timeless@mozdev.org>
parents:
28248
diff
changeset
|
19 # each log entry indicates `+` if the repository is dirty, like :hg:`id`. |
28246 | 20 dirty = True |
28305
f5ae291dfedf
blackbox: optionally log event source
timeless <timeless@mozdev.org>
parents:
28304
diff
changeset
|
21 # record the source of log messages |
f5ae291dfedf
blackbox: optionally log event source
timeless <timeless@mozdev.org>
parents:
28304
diff
changeset
|
22 logsource = True |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
23 |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
24 [blackbox] |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
25 track = command, commandfinish, commandexception, exthook, pythonhook |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
26 |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
27 [blackbox] |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
28 track = incoming |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
29 |
19066
2cad301a7f06
blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents:
19052
diff
changeset
|
30 [blackbox] |
2cad301a7f06
blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents:
19052
diff
changeset
|
31 # limit the size of a log file |
2cad301a7f06
blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents:
19052
diff
changeset
|
32 maxsize = 1.5 MB |
2cad301a7f06
blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents:
19052
diff
changeset
|
33 # rotate up to N log files when the current one gets too big |
2cad301a7f06
blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents:
19052
diff
changeset
|
34 maxfiles = 3 |
2cad301a7f06
blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents:
19052
diff
changeset
|
35 |
40439
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
36 [blackbox] |
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
37 # Include nanoseconds in log entries with %f (see Python function |
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
38 # datetime.datetime.strftime) |
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
39 date-format = '%Y-%m-%d @ %H:%M:%S.%f' |
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
40 |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
41 """ |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
42 |
28090
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
43 from __future__ import absolute_import |
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
44 |
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
45 import errno |
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
46 import re |
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
47 |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
48 from mercurial.i18n import _ |
28245
caa2a0c6fbb7
blackbox: log working directory version
timeless <timeless@mozdev.org>
parents:
28244
diff
changeset
|
49 from mercurial.node import hex |
caa2a0c6fbb7
blackbox: log working directory version
timeless <timeless@mozdev.org>
parents:
28244
diff
changeset
|
50 |
28090
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
51 from mercurial import ( |
35667
de598e84c244
py3: cast error message to localstr in blackbox.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34972
diff
changeset
|
52 encoding, |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37120
diff
changeset
|
53 pycompat, |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32155
diff
changeset
|
54 registrar, |
28090
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
55 ) |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
56 from mercurial.utils import ( |
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
57 dateutil, |
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
58 procutil, |
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
59 ) |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
60 |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28552
diff
changeset
|
61 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
23877
diff
changeset
|
62 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
23877
diff
changeset
|
63 # be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
23877
diff
changeset
|
64 # leave the attribute unspecified. |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28552
diff
changeset
|
65 testedwith = 'ships-with-hg-core' |
33134
7dc090faa8a4
blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32412
diff
changeset
|
66 |
7dc090faa8a4
blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32412
diff
changeset
|
67 cmdtable = {} |
7dc090faa8a4
blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32412
diff
changeset
|
68 command = registrar.command(cmdtable) |
7dc090faa8a4
blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32412
diff
changeset
|
69 |
33135
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
70 configtable = {} |
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
71 configitem = registrar.configitem(configtable) |
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
72 |
33189
1df74b71396d
configitems: register the 'blackbox.dirty' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33136
diff
changeset
|
73 configitem('blackbox', 'dirty', |
1df74b71396d
configitems: register the 'blackbox.dirty' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33136
diff
changeset
|
74 default=False, |
1df74b71396d
configitems: register the 'blackbox.dirty' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33136
diff
changeset
|
75 ) |
33135
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
76 configitem('blackbox', 'maxsize', |
33136
59c135bb31bc
blackbox: use a human readable version of the default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33135
diff
changeset
|
77 default='1 MB', |
33135
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
78 ) |
33190
0ef40bb20264
configitems: register the 'blackbox.logsource' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33189
diff
changeset
|
79 configitem('blackbox', 'logsource', |
0ef40bb20264
configitems: register the 'blackbox.logsource' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33189
diff
changeset
|
80 default=False, |
0ef40bb20264
configitems: register the 'blackbox.logsource' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33189
diff
changeset
|
81 ) |
34745
0b46440b1b45
configitems: register the 'blackbox.maxfiles' config
Boris Feld <boris.feld@octobus.net>
parents:
34583
diff
changeset
|
82 configitem('blackbox', 'maxfiles', |
0b46440b1b45
configitems: register the 'blackbox.maxfiles' config
Boris Feld <boris.feld@octobus.net>
parents:
34583
diff
changeset
|
83 default=7, |
0b46440b1b45
configitems: register the 'blackbox.maxfiles' config
Boris Feld <boris.feld@octobus.net>
parents:
34583
diff
changeset
|
84 ) |
34517
49b72b6f6d66
configitems: register the 'blackbox.track' config
Boris Feld <boris.feld@octobus.net>
parents:
34300
diff
changeset
|
85 configitem('blackbox', 'track', |
34583
19b2c062654c
configitems: fix registration for 'blackbox.track' config
Boris Feld <boris.feld@octobus.net>
parents:
34517
diff
changeset
|
86 default=lambda: ['*'], |
34517
49b72b6f6d66
configitems: register the 'blackbox.track' config
Boris Feld <boris.feld@octobus.net>
parents:
34300
diff
changeset
|
87 ) |
40439
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
88 configitem('blackbox', 'date-format', |
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
89 default='%Y/%m/%d %H:%M:%S', |
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
90 ) |
33135
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
91 |
34300
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
92 def _openlogfile(ui, vfs): |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
93 def rotate(oldpath, newpath): |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
94 try: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
95 vfs.unlink(newpath) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
96 except OSError as err: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
97 if err.errno != errno.ENOENT: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
98 ui.debug("warning: cannot remove '%s': %s\n" % |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
99 (newpath, err.strerror)) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
100 try: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
101 if newpath: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
102 vfs.rename(oldpath, newpath) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
103 except OSError as err: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
104 if err.errno != errno.ENOENT: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
105 ui.debug("warning: cannot rename '%s' to '%s': %s\n" % |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
106 (newpath, oldpath, err.strerror)) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
107 |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
108 maxsize = ui.configbytes('blackbox', 'maxsize') |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
109 name = 'blackbox.log' |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
110 if maxsize > 0: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
111 try: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
112 st = vfs.stat(name) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
113 except OSError: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
114 pass |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
115 else: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
116 if st.st_size >= maxsize: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
117 path = vfs.join(name) |
34745
0b46440b1b45
configitems: register the 'blackbox.maxfiles' config
Boris Feld <boris.feld@octobus.net>
parents:
34583
diff
changeset
|
118 maxfiles = ui.configint('blackbox', 'maxfiles') |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37120
diff
changeset
|
119 for i in pycompat.xrange(maxfiles - 1, 1, -1): |
34300
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
120 rotate(oldpath='%s.%d' % (path, i - 1), |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
121 newpath='%s.%d' % (path, i)) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
122 rotate(oldpath=path, |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
123 newpath=maxfiles > 0 and path + '.1') |
40797
ea2688c84e4b
blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents:
40764
diff
changeset
|
124 return vfs(name, 'a', makeparentdirs=False) |
34300
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34299
diff
changeset
|
125 |
40762
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
126 class proxylogger(object): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
127 """Forward log events to another logger to be set later""" |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
128 |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
129 def __init__(self): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
130 self.logger = None |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
131 |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
132 def tracked(self, event): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
133 return self.logger is not None and self.logger.tracked(event) |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
134 |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
135 def log(self, ui, event, msg, opts): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
136 assert self.logger is not None |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
137 self.logger.log(ui, event, msg, opts) |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
138 |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
139 _lastlogger = proxylogger() |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
140 |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
141 class blackboxlogger(object): |
40764
567e164f89b8
blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents:
40763
diff
changeset
|
142 def __init__(self, ui, repo): |
567e164f89b8
blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents:
40763
diff
changeset
|
143 self._repo = repo |
40648
85372dc0cca3
blackbox: extract function to test if log event is tracked
Yuya Nishihara <yuya@tcha.org>
parents:
40647
diff
changeset
|
144 self._trackedevents = set(ui.configlist('blackbox', 'track')) |
40644
a9393d7600f3
blackbox: extract logger class from ui wrapper
Yuya Nishihara <yuya@tcha.org>
parents:
40643
diff
changeset
|
145 |
40648
85372dc0cca3
blackbox: extract function to test if log event is tracked
Yuya Nishihara <yuya@tcha.org>
parents:
40647
diff
changeset
|
146 def tracked(self, event): |
85372dc0cca3
blackbox: extract function to test if log event is tracked
Yuya Nishihara <yuya@tcha.org>
parents:
40647
diff
changeset
|
147 return b'*' in self._trackedevents or event in self._trackedevents |
85372dc0cca3
blackbox: extract function to test if log event is tracked
Yuya Nishihara <yuya@tcha.org>
parents:
40647
diff
changeset
|
148 |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
149 def log(self, ui, event, msg, opts): |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
150 default = ui.configdate('devel', 'default-date') |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
151 date = dateutil.datestr(default, ui.config('blackbox', 'date-format')) |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
152 user = procutil.getuser() |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
153 pid = '%d' % procutil.getpid() |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
154 rev = '(unknown)' |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
155 changed = '' |
40646
179c02baaa8c
blackbox: initialize repo attribute properly
Yuya Nishihara <yuya@tcha.org>
parents:
40645
diff
changeset
|
156 ctx = self._repo[None] |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
157 parents = ctx.parents() |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
158 rev = ('+'.join([hex(p.node()) for p in parents])) |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
159 if (ui.configbool('blackbox', 'dirty') and |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
160 ctx.dirty(missing=True, merge=False, branch=False)): |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
161 changed = '+' |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
162 if ui.configbool('blackbox', 'logsource'): |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
163 src = ' [%s]' % event |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
164 else: |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
165 src = '' |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
166 try: |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
167 fmt = '%s %s @%s%s (%s)%s> %s' |
40760
ffd574c144d2
ui: pass in formatted message to logger.log()
Yuya Nishihara <yuya@tcha.org>
parents:
40759
diff
changeset
|
168 args = (date, user, rev, changed, pid, src, msg) |
40797
ea2688c84e4b
blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents:
40764
diff
changeset
|
169 with _openlogfile(ui, self._repo.vfs) as fp: |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
170 fp.write(fmt % args) |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
171 except (IOError, OSError) as err: |
40758
eb5948f29c60
blackbox: change the way of deactivating the logger on write error
Yuya Nishihara <yuya@tcha.org>
parents:
40730
diff
changeset
|
172 # deactivate this to avoid failed logging again |
40763
3ede5d1724bb
blackbox: do not nullify repo to deactivate the logger on failure
Yuya Nishihara <yuya@tcha.org>
parents:
40762
diff
changeset
|
173 self._trackedevents.clear() |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
174 ui.debug('warning: cannot write to blackbox.log: %s\n' % |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
175 encoding.strtolocal(err.strerror)) |
40797
ea2688c84e4b
blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents:
40764
diff
changeset
|
176 return |
ea2688c84e4b
blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents:
40764
diff
changeset
|
177 _lastlogger.logger = self |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
178 |
40730
55b053af7196
ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents:
40648
diff
changeset
|
179 def uipopulate(ui): |
40762
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
180 ui.setlogger(b'blackbox', _lastlogger) |
40730
55b053af7196
ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents:
40648
diff
changeset
|
181 |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
182 def reposetup(ui, repo): |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
183 # During 'hg pull' a httppeer repo is created to represent the remote repo. |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
184 # It doesn't have a .hg directory to put a blackbox in, so we don't do |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
185 # the blackbox setup for it. |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
186 if not repo.local(): |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
187 return |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
188 |
40730
55b053af7196
ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents:
40648
diff
changeset
|
189 # Since blackbox.log is stored in the repo directory, the logger should be |
55b053af7196
ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents:
40648
diff
changeset
|
190 # instantiated per repository. |
40764
567e164f89b8
blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents:
40763
diff
changeset
|
191 logger = blackboxlogger(ui, repo) |
40730
55b053af7196
ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents:
40648
diff
changeset
|
192 ui.setlogger(b'blackbox', logger) |
34276
b90bd9a98c8b
blackbox: set lastui even if ui.log is not called (issue5518)
Jun Wu <quark@fb.com>
parents:
34275
diff
changeset
|
193 |
40762
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
194 # Set _lastlogger even if ui.log is not called. This gives blackbox a |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
195 # fallback place to log |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
196 if _lastlogger.logger is None: |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
197 _lastlogger.logger = logger |
34276
b90bd9a98c8b
blackbox: set lastui even if ui.log is not called (issue5518)
Jun Wu <quark@fb.com>
parents:
34275
diff
changeset
|
198 |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33361
diff
changeset
|
199 repo._wlockfreeprefix.add('blackbox.log') |
18673
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
200 |
40295
fa88170c10bb
help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents:
40293
diff
changeset
|
201 @command('blackbox', |
18673
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
202 [('l', 'limit', 10, _('the number of events to show')), |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
203 ], |
40293
c303d65d2e34
help: assigning categories to existing commands
rdamazio@google.com
parents:
38783
diff
changeset
|
204 _('hg blackbox [OPTION]...'), |
40295
fa88170c10bb
help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents:
40293
diff
changeset
|
205 helpcategory=command.CATEGORY_MAINTENANCE, |
fa88170c10bb
help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents:
40293
diff
changeset
|
206 helpbasic=True) |
18673
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
207 def blackbox(ui, repo, *revs, **opts): |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
208 '''view the recent repository events |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
209 ''' |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
210 |
28026
a6db1163befa
blackbox: refactor use of vfs as _bbvfs
timeless <timeless@mozdev.org>
parents:
28025
diff
changeset
|
211 if not repo.vfs.exists('blackbox.log'): |
18673
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
212 return |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
213 |
34972
375577785f49
py3: handle keyword arguments in hgext/blackbox.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34745
diff
changeset
|
214 limit = opts.get(r'limit') |
28244
c17d7b1c40be
blackbox: rename fp variable
timeless <timeless@mozdev.org>
parents:
28243
diff
changeset
|
215 fp = repo.vfs('blackbox.log', 'r') |
c17d7b1c40be
blackbox: rename fp variable
timeless <timeless@mozdev.org>
parents:
28243
diff
changeset
|
216 lines = fp.read().split('\n') |
18673
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
217 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
218 count = 0 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
219 output = [] |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
220 for line in reversed(lines): |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
221 if count >= limit: |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
222 break |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
223 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
224 # count the commands by matching lines like: 2013/01/23 19:13:36 root> |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
225 if re.match('^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} .*> .*', line): |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
226 count += 1 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
227 output.append(line) |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
228 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
229 ui.status('\n'.join(reversed(output))) |