Mercurial > hg
annotate hgext/beautifygraph.py @ 40056:324b4b10351e
revlog: rewrite censoring logic
I was able to corrupt a revlog relatively easily with the existing
censoring code. The underlying problem is that the existing code
doesn't fully take delta chains into account. When copying revisions
that occur after the censored revision, the delta base can refer
to a censored revision. Then at read time, things blow up due to the
revision data not being a compressed delta.
This commit rewrites the revlog censoring code to take a higher-level
approach. We now create a new revlog instance pointing at temp files.
We iterate through each revision in the source revlog and insert
those revisions into the new revlog, replacing the censored revision's
data along the way.
The new implementation isn't as efficient as the old one. This is
because it will fully engage delta computation on insertion. But I
don't think it matters.
The new implementation is a bit hacky because it attempts to reload
the revlog instance with a new revlog index/data file. This is fragile.
But this is needed because the index (which could be backed by C) would
have a cached copy of the old, possibly changed data and that could
lead to problems accessing index or revision data later.
One benefit of the new approach is that we integrate with the
transaction. The old revlog is backed up and if the transaction is
rolled back, the original revlog is restored.
As part of this, we had to teach the transaction about the store
vfs. I'm not super keen about this. But this was the easiest way
to hook things up to the transaction. We /could/ just ignore the
transaction like we were doing before. But any file mutation should
be governed by transaction semantics, including undo during rollback.
Differential Revision: https://phab.mercurial-scm.org/D4869
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 02 Oct 2018 17:34:34 -0700 |
parents | 5b9f116104f9 |
children | c2a0bc6412db |
rev | line source |
---|---|
38340
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
1 # -*- coding: UTF-8 -*- |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
2 # beautifygraph.py - improve graph output by using Unicode characters |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
3 # |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
4 # Copyright 2018 John Stiles <johnstiles@gmail.com> |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
5 # |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
7 # GNU General Public License version 2 or any later version. |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
8 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
9 '''beautify log -G output by using Unicode characters (EXPERIMENTAL) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
10 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
11 A terminal with UTF-8 support and monospace narrow text are required. |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
12 ''' |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
13 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
14 from __future__ import absolute_import |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
15 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
16 from mercurial.i18n import _ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
17 from mercurial import ( |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
18 encoding, |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
19 extensions, |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
20 graphmod, |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38340
diff
changeset
|
21 pycompat, |
38340
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
22 templatekw, |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
23 ) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
24 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
25 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
26 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
27 # be specifying the version(s) of Mercurial they are tested with, or |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
28 # leave the attribute unspecified. |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
29 testedwith = 'ships-with-hg-core' |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
30 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
31 def prettyedge(before, edge, after): |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
32 if edge == '~': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
33 return '\xE2\x95\xA7' # U+2567 ╧ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
34 if edge == 'X': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
35 return '\xE2\x95\xB3' # U+2573 ╳ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
36 if edge == '/': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
37 return '\xE2\x95\xB1' # U+2571 ╱ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
38 if edge == '-': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
39 return '\xE2\x94\x80' # U+2500 ─ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
40 if edge == '|': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
41 return '\xE2\x94\x82' # U+2502 │ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
42 if edge == ':': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
43 return '\xE2\x94\x86' # U+2506 ┆ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
44 if edge == '\\': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
45 return '\xE2\x95\xB2' # U+2572 ╲ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
46 if edge == '+': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
47 if before == ' ' and not after == ' ': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
48 return '\xE2\x94\x9C' # U+251C ├ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
49 if after == ' ' and not before == ' ': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
50 return '\xE2\x94\xA4' # U+2524 ┤ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
51 return '\xE2\x94\xBC' # U+253C ┼ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
52 return edge |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
53 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
54 def convertedges(line): |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
55 line = ' %s ' % line |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
56 pretty = [] |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38340
diff
changeset
|
57 for idx in pycompat.xrange(len(line) - 2): |
39054
de3a9d7ec1c2
beautifygraph: use slicing instead of subscripting on bytestr
Augie Fackler <augie@google.com>
parents:
39053
diff
changeset
|
58 pretty.append(prettyedge(line[idx:idx + 1], |
de3a9d7ec1c2
beautifygraph: use slicing instead of subscripting on bytestr
Augie Fackler <augie@google.com>
parents:
39053
diff
changeset
|
59 line[idx + 1:idx + 2], |
de3a9d7ec1c2
beautifygraph: use slicing instead of subscripting on bytestr
Augie Fackler <augie@google.com>
parents:
39053
diff
changeset
|
60 line[idx + 2:idx + 3])) |
38340
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
61 return ''.join(pretty) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
62 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
63 def getprettygraphnode(orig, *args, **kwargs): |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
64 node = orig(*args, **kwargs) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
65 if node == 'o': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
66 return '\xE2\x97\x8B' # U+25CB ○ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
67 if node == '@': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
68 return '\xE2\x97\x8D' # U+25CD ◍ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
69 if node == '*': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
70 return '\xE2\x88\x97' # U+2217 ∗ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
71 if node == 'x': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
72 return '\xE2\x97\x8C' # U+25CC ◌ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
73 if node == '_': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
74 return '\xE2\x95\xA4' # U+2564 ╤ |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
75 return node |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
76 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
77 def outputprettygraph(orig, ui, graph, *args, **kwargs): |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
78 (edges, text) = zip(*graph) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
79 graph = zip([convertedges(e) for e in edges], text) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
80 return orig(ui, graph, *args, **kwargs) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
81 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
82 def extsetup(ui): |
39198
362cb82385ea
beautifygraph: don't warn about busted terminal if HGPLAIN is set
Augie Fackler <augie@google.com>
parents:
38340
diff
changeset
|
83 if ui.plain('graph'): |
362cb82385ea
beautifygraph: don't warn about busted terminal if HGPLAIN is set
Augie Fackler <augie@google.com>
parents:
38340
diff
changeset
|
84 return |
362cb82385ea
beautifygraph: don't warn about busted terminal if HGPLAIN is set
Augie Fackler <augie@google.com>
parents:
38340
diff
changeset
|
85 |
38340
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
86 if encoding.encoding != 'UTF-8': |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
87 ui.warn(_('beautifygraph: unsupported encoding, UTF-8 required\n')) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
88 return |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
89 |
39053
836433f3bdd6
beautifygraph: use sysstr for checking encoding._wide
Augie Fackler <augie@google.com>
parents:
38783
diff
changeset
|
90 if r'A' in encoding._wide: |
38340
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
91 ui.warn(_('beautifygraph: unsupported terminal settings, ' |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
92 'monospace narrow text required\n')) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
93 return |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
94 |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
95 extensions.wrapfunction(graphmod, 'outputgraph', outputprettygraph) |
9abe91a503da
graph: improve graph output by using Unicode characters
John Stiles <johnstiles@gmail.com>
parents:
diff
changeset
|
96 extensions.wrapfunction(templatekw, 'getgraphnode', getprettygraphnode) |