annotate hgext/blackbox.py @ 52033:88aa21d654e5

rust-dirstate: actually remember the identity This was an oversight that likely had no influence on anything since we have only been writing the dirstate for status. We will start writing the dirstate for more operations now, so we'll need this fixed.
author Raphaël Gomès <rgomes@octobus.net>
date Mon, 30 Sep 2024 17:43:51 +0200
parents f4733654f144
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18676
1506eb487ddd blackbox: fix copyright
Bryan O'Sullivan <bryano@fb.com>
parents: 18675
diff changeset
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
1506eb487ddd blackbox: fix copyright
Bryan O'Sullivan <bryano@fb.com>
parents: 18675
diff changeset
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.
42615
56132ebd14c6 blackbox: disable extremely verbose logging (issue6110)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 41532
diff changeset
12 The events that get logged can be configured via the blackbox.track and
56132ebd14c6 blackbox: disable extremely verbose logging (issue6110)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 41532
diff changeset
13 blackbox.ignore config keys.
28246
b862e793ec10 blackbox: log dirty state
timeless <timeless@mozdev.org>
parents: 28245
diff changeset
14
19162
27013ace80eb blackbox: fix literal block syntax
Takumi IINO <trot.thunder@gmail.com>
parents: 19066
diff changeset
15 Examples::
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
16
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
17 [blackbox]
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
18 track = *
42615
56132ebd14c6 blackbox: disable extremely verbose logging (issue6110)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 41532
diff changeset
19 ignore = pythonhook
28303
ce24de063aa5 blackbox: rewrite dirty documentation noting it is expensive
timeless <timeless@mozdev.org>
parents: 28248
diff changeset
20 # dirty is *EXPENSIVE* (slow);
ce24de063aa5 blackbox: rewrite dirty documentation noting it is expensive
timeless <timeless@mozdev.org>
parents: 28248
diff changeset
21 # each log entry indicates `+` if the repository is dirty, like :hg:`id`.
28246
b862e793ec10 blackbox: log dirty state
timeless <timeless@mozdev.org>
parents: 28245
diff changeset
22 dirty = True
28305
f5ae291dfedf blackbox: optionally log event source
timeless <timeless@mozdev.org>
parents: 28304
diff changeset
23 # record the source of log messages
f5ae291dfedf blackbox: optionally log event source
timeless <timeless@mozdev.org>
parents: 28304
diff changeset
24 logsource = True
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
25
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
26 [blackbox]
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
27 track = command, commandfinish, commandexception, exthook, pythonhook
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
28
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
29 [blackbox]
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
30 track = incoming
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
31
19066
2cad301a7f06 blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents: 19052
diff changeset
32 [blackbox]
2cad301a7f06 blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents: 19052
diff changeset
33 # limit the size of a log file
2cad301a7f06 blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents: 19052
diff changeset
34 maxsize = 1.5 MB
2cad301a7f06 blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents: 19052
diff changeset
35 # 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
36 maxfiles = 3
2cad301a7f06 blackbox: automatically rotate log files
Bryan O'Sullivan <bryano@fb.com>
parents: 19052
diff changeset
37
40439
25f1c7bd649d blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents: 40295
diff changeset
38 [blackbox]
48572
fe4922564661 blackbox: correct date format doc
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 46600
diff changeset
39 # Include microseconds in log entries with %f (see Python function
40439
25f1c7bd649d blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents: 40295
diff changeset
40 # datetime.datetime.strftime)
46600
36f3a64846c8 blackbox: Remove misleading quotes in config example
Simon Sapin <simon.sapin@octobus.net>
parents: 45942
diff changeset
41 date-format = %Y-%m-%d @ %H:%M:%S.%f
40439
25f1c7bd649d blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents: 40295
diff changeset
42
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
43 """
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
44
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 50993
diff changeset
45 from __future__ import annotations
28090
8113c88b8e6d blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28027
diff changeset
46
8113c88b8e6d blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28027
diff changeset
47 import re
8113c88b8e6d blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28027
diff changeset
48
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
49 from mercurial.i18n import _
28245
caa2a0c6fbb7 blackbox: log working directory version
timeless <timeless@mozdev.org>
parents: 28244
diff changeset
50 from mercurial.node import hex
caa2a0c6fbb7 blackbox: log working directory version
timeless <timeless@mozdev.org>
parents: 28244
diff changeset
51
28090
8113c88b8e6d blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28027
diff changeset
52 from mercurial import (
35667
de598e84c244 py3: cast error message to localstr in blackbox.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34972
diff changeset
53 encoding,
40799
03127e580980 loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents: 40798
diff changeset
54 loggingutil,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32155
diff changeset
55 registrar,
28090
8113c88b8e6d blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28027
diff changeset
56 )
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
57 from mercurial.utils import (
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
58 dateutil,
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
59 procutil,
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
60 )
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
61
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 28552
diff changeset
62 # 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
63 # 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
64 # 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
65 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
66 testedwith = b'ships-with-hg-core'
33134
7dc090faa8a4 blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32412
diff changeset
67
7dc090faa8a4 blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32412
diff changeset
68 cmdtable = {}
7dc090faa8a4 blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32412
diff changeset
69 command = registrar.command(cmdtable)
7dc090faa8a4 blackbox: minor code reordering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32412
diff changeset
70
40799
03127e580980 loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents: 40798
diff changeset
71 _lastlogger = loggingutil.proxylogger()
40762
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
72
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
73
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
74 class blackboxlogger:
40764
567e164f89b8 blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents: 40763
diff changeset
75 def __init__(self, ui, repo):
567e164f89b8 blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents: 40763
diff changeset
76 self._repo = repo
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
77 self._trackedevents = set(ui.configlist(b'blackbox', b'track'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
78 self._ignoredevents = set(ui.configlist(b'blackbox', b'ignore'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
79 self._maxfiles = ui.configint(b'blackbox', b'maxfiles')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
80 self._maxsize = ui.configbytes(b'blackbox', b'maxsize')
40993
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
81 self._inlog = False
40644
a9393d7600f3 blackbox: extract logger class from ui wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 40643
diff changeset
82
40648
85372dc0cca3 blackbox: extract function to test if log event is tracked
Yuya Nishihara <yuya@tcha.org>
parents: 40647
diff changeset
83 def tracked(self, event):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
84 return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
85 b'*' in self._trackedevents and event not in self._ignoredevents
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
86 ) or event in self._trackedevents
40648
85372dc0cca3 blackbox: extract function to test if log event is tracked
Yuya Nishihara <yuya@tcha.org>
parents: 40647
diff changeset
87
40645
fff3e213ace9 blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents: 40644
diff changeset
88 def log(self, ui, event, msg, opts):
40993
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
89 # self._log() -> ctx.dirty() may create new subrepo instance, which
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
90 # ui is derived from baseui. So the recursion guard in ui.log()
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
91 # doesn't work as it's local to the ui instance.
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
92 if self._inlog:
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
93 return
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
94 self._inlog = True
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
95 try:
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
96 self._log(ui, event, msg, opts)
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
97 finally:
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
98 self._inlog = False
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
99
49d48489a16b blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
100 def _log(self, ui, event, msg, opts):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
101 default = ui.configdate(b'devel', b'default-date')
48573
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
102 dateformat = ui.config(b'blackbox', b'date-format')
50941
4323af38e3f2 blackbox: add a option to duplicate output to stderr too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49853
diff changeset
103 debug_to_stderr = ui.configbool(b'blackbox', b'debug.to-stderr')
48573
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
104 if dateformat:
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
105 date = dateutil.datestr(default, dateformat)
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
106 else:
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
107 # We want to display milliseconds (more precision seems
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
108 # unnecessary). Since %.3f is not supported, use %f and truncate
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
109 # microseconds.
48574
abbecb5cd6f3 blackbox: change year in logs to ISO 8601 format
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48573
diff changeset
110 date = dateutil.datestr(default, b'%Y-%m-%d %H:%M:%S.%f')[:-3]
40645
fff3e213ace9 blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents: 40644
diff changeset
111 user = procutil.getuser()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
112 pid = b'%d' % procutil.getpid()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
113 changed = b''
40646
179c02baaa8c blackbox: initialize repo attribute properly
Yuya Nishihara <yuya@tcha.org>
parents: 40645
diff changeset
114 ctx = self._repo[None]
40645
fff3e213ace9 blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents: 40644
diff changeset
115 parents = ctx.parents()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
116 rev = b'+'.join([hex(p.node()) for p in parents])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
117 if ui.configbool(b'blackbox', b'dirty') and ctx.dirty(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
118 missing=True, merge=False, branch=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
119 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
120 changed = b'+'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
121 if ui.configbool(b'blackbox', b'logsource'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
122 src = b' [%s]' % event
40645
fff3e213ace9 blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents: 40644
diff changeset
123 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
124 src = b''
40645
fff3e213ace9 blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents: 40644
diff changeset
125 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
126 fmt = b'%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
127 args = (date, user, rev, changed, pid, src, msg)
40799
03127e580980 loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents: 40798
diff changeset
128 with loggingutil.openlogfile(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
129 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
130 self._repo.vfs,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
131 name=b'blackbox.log',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
132 maxfiles=self._maxfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
133 maxsize=self._maxsize,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
134 ) as fp:
50941
4323af38e3f2 blackbox: add a option to duplicate output to stderr too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49853
diff changeset
135 msg = fmt % args
4323af38e3f2 blackbox: add a option to duplicate output to stderr too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49853
diff changeset
136 fp.write(msg)
4323af38e3f2 blackbox: add a option to duplicate output to stderr too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49853
diff changeset
137 if debug_to_stderr:
4323af38e3f2 blackbox: add a option to duplicate output to stderr too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49853
diff changeset
138 ui.write_err(msg)
40645
fff3e213ace9 blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents: 40644
diff changeset
139 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
140 # 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
141 self._trackedevents.clear()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
142 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
143 b'warning: cannot write to blackbox.log: %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
144 % encoding.strtolocal(err.strerror)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
145 )
40797
ea2688c84e4b blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents: 40764
diff changeset
146 return
ea2688c84e4b blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents: 40764
diff changeset
147 _lastlogger.logger = self
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
148
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
149
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40648
diff changeset
150 def uipopulate(ui):
40762
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
151 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
152
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
153
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
154 def reposetup(ui, repo):
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
155 # 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
156 # 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
157 # the blackbox setup for it.
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
158 if not repo.local():
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
159 return
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
160
40730
55b053af7196 ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents: 40648
diff changeset
161 # 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
162 # instantiated per repository.
40764
567e164f89b8 blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents: 40763
diff changeset
163 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
164 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
165
40762
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
166 # 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
167 # fallback place to log
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
168 if _lastlogger.logger is None:
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
169 _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
170
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
171 repo._wlockfreeprefix.add(b'blackbox.log')
18673
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
172
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
173
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
174 @command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
175 b'blackbox',
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
176 [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
177 (b'l', b'limit', 10, _(b'the number of events to show')),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
178 ],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
179 _(b'hg blackbox [OPTION]...'),
40295
fa88170c10bb help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents: 40293
diff changeset
180 helpcategory=command.CATEGORY_MAINTENANCE,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
181 helpbasic=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42615
diff changeset
182 )
18673
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
183 def blackbox(ui, repo, *revs, **opts):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
184 """view the recent repository events"""
18673
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
185
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
186 if not repo.vfs.exists(b'blackbox.log'):
18673
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
187 return
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
188
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
189 limit = opts.get('limit')
49853
e63ab79b2fa1 typing: add some assertions that a variable isn't None
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
190 assert limit is not None # help pytype
e63ab79b2fa1 typing: add some assertions that a variable isn't None
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
191
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
192 fp = repo.vfs(b'blackbox.log', b'r')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
193 lines = fp.read().split(b'\n')
18673
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
194
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
195 count = 0
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
196 output = []
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
197 for line in reversed(lines):
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
198 if count >= limit:
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
199 break
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
200
48574
abbecb5cd6f3 blackbox: change year in logs to ISO 8601 format
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48573
diff changeset
201 # count the commands by matching lines like:
abbecb5cd6f3 blackbox: change year in logs to ISO 8601 format
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48573
diff changeset
202 # 2013/01/23 19:13:36 root>
abbecb5cd6f3 blackbox: change year in logs to ISO 8601 format
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48573
diff changeset
203 # 2013/01/23 19:13:36 root (1234)>
abbecb5cd6f3 blackbox: change year in logs to ISO 8601 format
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48573
diff changeset
204 # 2013/01/23 19:13:36 root @0000000000000000000000000000000000000000 (1234)>
abbecb5cd6f3 blackbox: change year in logs to ISO 8601 format
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48573
diff changeset
205 # 2013-01-23 19:13:36.000 root @0000000000000000000000000000000000000000 (1234)>
48573
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
206 if re.match(
48574
abbecb5cd6f3 blackbox: change year in logs to ISO 8601 format
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48573
diff changeset
207 br'^\d{4}[-/]\d{2}[-/]\d{2} \d{2}:\d{2}:\d{2}(.\d*)? .*> .*', line
48573
011f5218ff2d blackbox: add milliseconds to blackbox logs by default
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 48572
diff changeset
208 ):
18673
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
209 count += 1
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
210 output.append(line)
f27598902007 blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents: 18669
diff changeset
211
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
212 ui.status(b'\n'.join(reversed(output)))