Mercurial > hg
annotate hgext/blackbox.py @ 48507:58a3be48ddd2
simplemerge: stop merging file flags
As 384df4db6520 (merge: merge file flags together with file content,
2013-01-09) explains, we shouldn't do a 3-way merge of the
symlink. However, since 84614212ae39 (flags: actually merge flags in
simplemerge, 2020-05-16), we do that in
`simplemerge.simplemerge()`. What's more, the merging of the
executable flag there isn't actually necessary; it was made a no-op by
the very next commit, i.e. 4234c9af515d (flags: read flag from
dirstate/disk for workingcopyctx (issue5743), 2020-05-16).
I found the overall flag-merging code (not the bit in
`simplemerge.py`) very hard to follow, but I think I now finally
understand how it works. `mergestate.resolve()` calculates the merged
file flags and sets them on the local side of the merge (confusingly
by calling `_restore_backup()`). Then it calls
`filemerge.filemerge()`, which in turn calls
`simplemerge.simplemerge()` (if premerge is enabled). That means that
the flags on the local side `fcs.flags()` are already correct when the
flag-merging code in `simplemerge.simplemerge()` runs. Interestingly,
that code still works when the local side already has the merged
value, it just doesn't change the value. Here's a truth table to
explain why:
```
BLOMCAR
0000000
0011111
0101011
0111111
1000000
1010000
1100000
1111101
```
B: Base
L: Local
O: Other
M: Merged flags from `mergestate.resolve()`, i.e. what's called "local"
when we get to `simplemerge.simplemerge()`
C: `commonflags` in `simplemerge.simplemerge()`, i.e. `M & O`
A: `addedflags` in `simplemerge.simplemerge()`, i.e. `(M ^ O) - B`
R: Re-merged flags `simplemerge.simplemerge()`, i.e. `C | A`
As you can see, the re-merged flags are always unchanged compared to
the initial merged flags (R equals M).
Therefore, this patch effectively backs out 84614212ae39. (I might
later refactor this code to have the flags explicitly passed in.)
`simplemerge.simplemerge()` is also called from
`contrib/simplemerge.py`, but that code never passes any flags.
Differential Revision: https://phab.mercurial-scm.org/D11879
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Mon, 06 Dec 2021 23:17:43 -0800 |
parents | 36f3a64846c8 |
children | fe4922564661 |
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. |
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 | 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 | 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] |
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
39 # 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
|
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 |
28090
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
45 from __future__ import absolute_import |
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 |
33135
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
71 configtable = {} |
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
72 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
|
73 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
74 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
75 b'blackbox', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
76 b'dirty', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
77 default=False, |
33189
1df74b71396d
configitems: register the 'blackbox.dirty' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33136
diff
changeset
|
78 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
79 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
80 b'blackbox', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
81 b'maxsize', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
82 default=b'1 MB', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
83 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
84 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
85 b'blackbox', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
86 b'logsource', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
87 default=False, |
33135
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
88 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
89 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
90 b'blackbox', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
91 b'maxfiles', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
92 default=7, |
33190
0ef40bb20264
configitems: register the 'blackbox.logsource' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33189
diff
changeset
|
93 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
94 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
95 b'blackbox', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
96 b'track', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
97 default=lambda: [b'*'], |
34745
0b46440b1b45
configitems: register the 'blackbox.maxfiles' config
Boris Feld <boris.feld@octobus.net>
parents:
34583
diff
changeset
|
98 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
99 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
100 b'blackbox', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
101 b'ignore', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
102 default=lambda: [b'chgserver', b'cmdserver', b'extension'], |
42615
56132ebd14c6
blackbox: disable extremely verbose logging (issue6110)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
41532
diff
changeset
|
103 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
104 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
105 b'blackbox', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
106 b'date-format', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
107 default=b'%Y/%m/%d %H:%M:%S', |
40439
25f1c7bd649d
blackbox: add configitem for format of log timestamps
Matt DeVore <matvore@google.com>
parents:
40295
diff
changeset
|
108 ) |
33135
0a638f37f2d2
configitems: register 'blackbox.maxsize' as an example of 'configbytes'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33134
diff
changeset
|
109 |
40799
03127e580980
loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents:
40798
diff
changeset
|
110 _lastlogger = loggingutil.proxylogger() |
40762
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
111 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
112 |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
113 class blackboxlogger(object): |
40764
567e164f89b8
blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents:
40763
diff
changeset
|
114 def __init__(self, ui, repo): |
567e164f89b8
blackbox: initialize logger with repo instance
Yuya Nishihara <yuya@tcha.org>
parents:
40763
diff
changeset
|
115 self._repo = repo |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
116 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
|
117 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
|
118 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
|
119 self._maxsize = ui.configbytes(b'blackbox', b'maxsize') |
40993
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
120 self._inlog = False |
40644
a9393d7600f3
blackbox: extract logger class from ui wrapper
Yuya Nishihara <yuya@tcha.org>
parents:
40643
diff
changeset
|
121 |
40648
85372dc0cca3
blackbox: extract function to test if log event is tracked
Yuya Nishihara <yuya@tcha.org>
parents:
40647
diff
changeset
|
122 def tracked(self, event): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
123 return ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
124 b'*' in self._trackedevents and event not in self._ignoredevents |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
125 ) 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
|
126 |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
127 def log(self, ui, event, msg, opts): |
40993
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
128 # self._log() -> ctx.dirty() may create new subrepo instance, which |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
129 # 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
|
130 # 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
|
131 if self._inlog: |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
132 return |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
133 self._inlog = True |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
134 try: |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
135 self._log(ui, event, msg, opts) |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
136 finally: |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
137 self._inlog = False |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
138 |
49d48489a16b
blackbox: resurrect recursion guard
Yuya Nishihara <yuya@tcha.org>
parents:
40799
diff
changeset
|
139 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
|
140 default = ui.configdate(b'devel', b'default-date') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
141 date = dateutil.datestr(default, ui.config(b'blackbox', b'date-format')) |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
142 user = procutil.getuser() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
143 pid = b'%d' % procutil.getpid() |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
144 changed = b'' |
40646
179c02baaa8c
blackbox: initialize repo attribute properly
Yuya Nishihara <yuya@tcha.org>
parents:
40645
diff
changeset
|
145 ctx = self._repo[None] |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
146 parents = ctx.parents() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
147 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
|
148 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
|
149 missing=True, merge=False, branch=False |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
150 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
151 changed = b'+' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
152 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
|
153 src = b' [%s]' % event |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
154 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
155 src = b'' |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
156 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
157 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
|
158 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
|
159 with loggingutil.openlogfile( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
160 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
161 self._repo.vfs, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
162 name=b'blackbox.log', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
163 maxfiles=self._maxfiles, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
164 maxsize=self._maxsize, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
165 ) as fp: |
40645
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
166 fp.write(fmt % args) |
fff3e213ace9
blackbox: unindent "if True" block
Yuya Nishihara <yuya@tcha.org>
parents:
40644
diff
changeset
|
167 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
|
168 # 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
|
169 self._trackedevents.clear() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
170 ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
171 b'warning: cannot write to blackbox.log: %s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
172 % encoding.strtolocal(err.strerror) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
173 ) |
40797
ea2688c84e4b
blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents:
40764
diff
changeset
|
174 return |
ea2688c84e4b
blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents:
40764
diff
changeset
|
175 _lastlogger.logger = self |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
176 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
177 |
40730
55b053af7196
ui: manage logger instances and event filtering by core ui
Yuya Nishihara <yuya@tcha.org>
parents:
40648
diff
changeset
|
178 def uipopulate(ui): |
40762
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40760
diff
changeset
|
179 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
|
180 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
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 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 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
|
200 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
201 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
202 @command( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 b'blackbox', |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
204 [ |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
205 (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
|
206 ], |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
207 _(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
|
208 helpcategory=command.CATEGORY_MAINTENANCE, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
209 helpbasic=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42615
diff
changeset
|
210 ) |
18673
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
211 def blackbox(ui, repo, *revs, **opts): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
212 """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
|
213 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
214 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
|
215 return |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
216 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43077
diff
changeset
|
217 limit = opts.get('limit') |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
218 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
|
219 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
|
220 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
221 count = 0 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
222 output = [] |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
223 for line in reversed(lines): |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
224 if count >= limit: |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
225 break |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
226 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
227 # count the commands by matching lines like: 2013/01/23 19:13:36 root> |
41532
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
228 if re.match(br'^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} .*> .*', line): |
18673
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
229 count += 1 |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
230 output.append(line) |
f27598902007
blackbox: adds a 'blackbox' command for viewing recent logs
Durham Goode <durham@fb.com>
parents:
18669
diff
changeset
|
231 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
232 ui.status(b'\n'.join(reversed(output))) |