annotate mercurial/formatter.py @ 52038:b7d99348ea36

rust-files: also return filenode and flags when listing a revision's files This is going to be useful when implementing parts of `update` and makes it so we don't have to fetch the manifest and each entry twice.
author Raphaël Gomès <rgomes@octobus.net>
date Mon, 30 Sep 2024 12:10:35 +0200
parents f4733654f144
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
1 # formatter.py - generic output formatting for mercurial
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
2 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46769
diff changeset
3 # Copyright 2012 Olivia Mackall <olivia@selenic.com>
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 #
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
8 """Generic output formatting for Mercurial
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
9
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
10 The formatter provides API to show data in various ways. The following
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
11 functions should be used in place of ui.write():
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
12
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
13 - fm.write() for unconditional output
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
14 - fm.condwrite() to show some extra data conditionally in plain output
31172
16272d8c24f6 formatter: add support for changeset templating
Yuya Nishihara <yuya@tcha.org>
parents: 31170
diff changeset
15 - fm.context() to provide changectx to template output
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
16 - fm.data() to provide extra data to JSON or template output
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
17 - fm.plain() to show raw text that isn't provided to JSON or template output
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
18
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
19 To show structured data (e.g. date tuples, dicts, lists), apply fm.format*()
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
20 beforehand so the data is converted to the appropriate data type. Use
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
21 fm.isplain() if you need to convert or format data conditionally which isn't
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
22 supported by the formatter API.
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
23
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
24 To build nested structure (i.e. a list of dicts), use fm.nested().
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
25
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
26 See also https://www.mercurial-scm.org/wiki/GenericTemplatingPlan
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
27
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
28 fm.condwrite() vs 'if cond:':
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
29
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
30 In most cases, use fm.condwrite() so users can selectively show the data
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
31 in template output. If it's costly to build data, use plain 'if cond:' with
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
32 fm.write().
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
33
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
34 fm.nested() vs fm.formatdict() (or fm.formatlist()):
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
35
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
36 fm.nested() should be used to form a tree structure (a list of dicts of
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
37 lists of dicts...) which can be accessed through template keywords, e.g.
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
38 "{foo % "{bar % {...}} {baz % {...}}"}". On the other hand, fm.formatdict()
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
39 exports a dict-type object to template, which can be accessed by e.g.
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
40 "{get(foo, key)}" function.
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
41
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
42 Doctest helper:
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
43
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
44 >>> def show(fn, verbose=False, **opts):
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
45 ... import sys
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
46 ... from . import ui as uimod
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
47 ... ui = uimod.ui()
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
48 ... ui.verbose = verbose
34255
d6af8da4a3b8 py3: rewrite stdout hack of doctest by using ui.pushbuffer()
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
49 ... ui.pushbuffer()
d6af8da4a3b8 py3: rewrite stdout hack of doctest by using ui.pushbuffer()
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
50 ... try:
34256
ebe3d0095c69 py3: convert system strings to bytes in doctest of formatter.py
Yuya Nishihara <yuya@tcha.org>
parents: 34255
diff changeset
51 ... return fn(ui, ui.formatter(pycompat.sysbytes(fn.__name__),
ebe3d0095c69 py3: convert system strings to bytes in doctest of formatter.py
Yuya Nishihara <yuya@tcha.org>
parents: 34255
diff changeset
52 ... pycompat.byteskwargs(opts)))
34255
d6af8da4a3b8 py3: rewrite stdout hack of doctest by using ui.pushbuffer()
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
53 ... finally:
d6af8da4a3b8 py3: rewrite stdout hack of doctest by using ui.pushbuffer()
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
54 ... print(pycompat.sysstr(ui.popbuffer()), end='')
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
55
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
56 Basic example:
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
57
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
58 >>> def files(ui, fm):
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33090
diff changeset
59 ... files = [(b'foo', 123, (0, 0)), (b'bar', 456, (1, 0))]
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
60 ... for f in files:
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
61 ... fm.startitem()
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33090
diff changeset
62 ... fm.write(b'path', b'%s', f[0])
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33090
diff changeset
63 ... fm.condwrite(ui.verbose, b'date', b' %s',
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33090
diff changeset
64 ... fm.formatdate(f[2], b'%Y-%m-%d %H:%M:%S'))
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
65 ... fm.data(size=f[1])
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33090
diff changeset
66 ... fm.plain(b'\\n')
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
67 ... fm.end()
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
68 >>> show(files)
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
69 foo
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
70 bar
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
71 >>> show(files, verbose=True)
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
72 foo 1970-01-01 00:00:00
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
73 bar 1970-01-01 00:00:01
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33090
diff changeset
74 >>> show(files, template=b'json')
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
75 [
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
76 {
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
77 "date": [0, 0],
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
78 "path": "foo",
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
79 "size": 123
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
80 },
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
81 {
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
82 "date": [1, 0],
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
83 "path": "bar",
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
84 "size": 456
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
85 }
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
86 ]
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33090
diff changeset
87 >>> show(files, template=b'path: {path}\\ndate: {date|rfc3339date}\\n')
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
88 path: foo
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
89 date: 1970-01-01T00:00:00+00:00
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
90 path: bar
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
91 date: 1970-01-01T00:00:01+00:00
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
92
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
93 Nested example:
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
94
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
95 >>> def subrepos(ui, fm):
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
96 ... fm.startitem()
35470
a33be093ec62 templater: look up symbols/resources as if they were separated (issue5699)
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
97 ... fm.write(b'reponame', b'[%s]\\n', b'baz')
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
98 ... files(ui, fm.nested(b'files', tmpl=b'{reponame}'))
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
99 ... fm.end()
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
100 >>> show(subrepos)
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
101 [baz]
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
102 foo
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
103 bar
35470
a33be093ec62 templater: look up symbols/resources as if they were separated (issue5699)
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
104 >>> show(subrepos, template=b'{reponame}: {join(files % "{path}", ", ")}\\n')
30560
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
105 baz: foo, bar
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
106 """
783016005122 formatter: add overview of API and example as doctest
Yuya Nishihara <yuya@tcha.org>
parents: 29949
diff changeset
107
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51729
diff changeset
108 from __future__ import annotations
25950
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
109
32580
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
110 import contextlib
31807
e6eb86b154c5 templater: provide loop counter as "index" keyword
Yuya Nishihara <yuya@tcha.org>
parents: 31805
diff changeset
111 import itertools
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
112 import os
48870
df56e6bd37f6 py3: use pickle directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 46819
diff changeset
113 import pickle
51729
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
114 import typing
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
115
25950
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
116 from .i18n import _
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
117 from .node import (
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
118 hex,
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
119 short,
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
120 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
121 from .thirdparty import attr
25950
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
122
51729
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
123 # Force pytype to use the non-vendored package
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
124 if typing.TYPE_CHECKING:
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
125 # noinspection PyPackageRequirements
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
126 import attr
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
127
25950
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
128 from . import (
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26373
diff changeset
129 error,
32159
0fd15522a848 py3: use pycompat.byteskwargs to converts kwargs to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31925
diff changeset
130 pycompat,
31782
654e9a1c8a6c formatter: use templatefilters.json()
Yuya Nishihara <yuya@tcha.org>
parents: 31396
diff changeset
131 templatefilters,
29676
c3a9cd78b151 formatter: add function to convert list to appropriate format (issue5217)
Yuya Nishihara <yuya@tcha.org>
parents: 29324
diff changeset
132 templatekw,
25950
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
133 templater,
36920
6ff6e1d6b5b8 templater: move stringify() to templateutil module
Yuya Nishihara <yuya@tcha.org>
parents: 36634
diff changeset
134 templateutil,
29324
b501579147f1 py3: conditionalize cPickle import by adding in util
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28957
diff changeset
135 util,
25950
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
136 )
40274
a8b9174517c7 formatter: use stringutil.pprint() in debug output to drop b''
Yuya Nishihara <yuya@tcha.org>
parents: 40140
diff changeset
137 from .utils import (
41996
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
138 cborutil,
40274
a8b9174517c7 formatter: use stringutil.pprint() in debug output to drop b''
Yuya Nishihara <yuya@tcha.org>
parents: 40140
diff changeset
139 dateutil,
a8b9174517c7 formatter: use stringutil.pprint() in debug output to drop b''
Yuya Nishihara <yuya@tcha.org>
parents: 40140
diff changeset
140 stringutil,
a8b9174517c7 formatter: use stringutil.pprint() in debug output to drop b''
Yuya Nishihara <yuya@tcha.org>
parents: 40140
diff changeset
141 )
25950
175873e36d03 formatter: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25838
diff changeset
142
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
143
43335
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
144 def isprintable(obj):
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
145 """Check if the given object can be directly passed in to formatter's
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
146 write() and data() functions
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
147
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
148 Returns False if the object is unsupported or must be pre-processed by
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
149 formatdate(), formatdict(), or formatlist().
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
150 """
48932
176f1a0d15dc py3: use int instead of pycompat.long
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
151 return isinstance(obj, (type(None), bool, int, int, float, bytes))
43335
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
152
242ad45b60b3 config: fix -Tjson to not crash due to unsupported defaultvalue types
Yuya Nishihara <yuya@tcha.org>
parents: 43106
diff changeset
153
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48932
diff changeset
154 class _nullconverter:
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
155 '''convert non-primitive data types to be processed by formatter'''
33090
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
156
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
157 # set to True if context object should be stored as item
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
158 storecontext = False
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
159
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
160 @staticmethod
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
161 def wrapnested(data, tmpl, sep):
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
162 '''wrap nested data by appropriate type'''
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
163 return data
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
164
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
165 @staticmethod
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
166 def formatdate(date, fmt):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
167 '''convert date tuple to appropriate format'''
37770
31750413f8d7 formatter: convert timestamp to int
Yuya Nishihara <yuya@tcha.org>
parents: 37597
diff changeset
168 # timestamp can be float, but the canonical form should be int
31750413f8d7 formatter: convert timestamp to int
Yuya Nishihara <yuya@tcha.org>
parents: 37597
diff changeset
169 ts, tz = date
31750413f8d7 formatter: convert timestamp to int
Yuya Nishihara <yuya@tcha.org>
parents: 37597
diff changeset
170 return (int(ts), tz)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
171
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
172 @staticmethod
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
173 def formatdict(data, key, value, fmt, sep):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
174 '''convert dict or key-value pairs to appropriate dict format'''
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
175 # use plain dict instead of util.sortdict so that data can be
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
176 # serialized as a builtin dict in pickle output
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
177 return dict(data)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
178
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
179 @staticmethod
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
180 def formatlist(data, name, fmt, sep):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
181 '''convert iterable to appropriate list format'''
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
182 return list(data)
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
183
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
184
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48932
diff changeset
185 class baseformatter:
46769
67a2ecea8bd9 debugdiscovery: also integrate the discovery output in the json one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45320
diff changeset
186 # set to True if the formater output a strict format that does not support
67a2ecea8bd9 debugdiscovery: also integrate the discovery output in the json one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45320
diff changeset
187 # arbitrary output in the stream.
67a2ecea8bd9 debugdiscovery: also integrate the discovery output in the json one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45320
diff changeset
188 strict_format = False
67a2ecea8bd9 debugdiscovery: also integrate the discovery output in the json one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45320
diff changeset
189
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
190 def __init__(self, ui, topic, opts, converter):
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
191 self._ui = ui
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
192 self._topic = topic
37597
d110167610db formatter: carry opts to file-based formatters by basefm
Yuya Nishihara <yuya@tcha.org>
parents: 37596
diff changeset
193 self._opts = opts
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
194 self._converter = converter
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
195 self._item = None
22701
cb28d2b3db0b formatter: add general way to switch hex/short functions
Yuya Nishihara <yuya@tcha.org>
parents: 22674
diff changeset
196 # function to convert node to string suitable for this output
cb28d2b3db0b formatter: add general way to switch hex/short functions
Yuya Nishihara <yuya@tcha.org>
parents: 22674
diff changeset
197 self.hexfunc = hex
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
198
29882
307b20e5e505 formatter: add context manager interface for convenience
Yuya Nishihara <yuya@tcha.org>
parents: 29837
diff changeset
199 def __enter__(self):
307b20e5e505 formatter: add context manager interface for convenience
Yuya Nishihara <yuya@tcha.org>
parents: 29837
diff changeset
200 return self
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
201
29882
307b20e5e505 formatter: add context manager interface for convenience
Yuya Nishihara <yuya@tcha.org>
parents: 29837
diff changeset
202 def __exit__(self, exctype, excvalue, traceback):
307b20e5e505 formatter: add context manager interface for convenience
Yuya Nishihara <yuya@tcha.org>
parents: 29837
diff changeset
203 if exctype is None:
307b20e5e505 formatter: add context manager interface for convenience
Yuya Nishihara <yuya@tcha.org>
parents: 29837
diff changeset
204 self.end()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
205
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
206 def _showitem(self):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
207 '''show a formatted item once all data is collected'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
208
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
209 def startitem(self):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
210 '''begin an item in the format list'''
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
211 if self._item is not None:
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
212 self._showitem()
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
213 self._item = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
214
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
215 def formatdate(self, date, fmt=b'%a %b %d %H:%M:%S %Y %1%2'):
29678
2f3f18ad55a2 formatter: add function to convert date tuple to appropriate format
Yuya Nishihara <yuya@tcha.org>
parents: 29676
diff changeset
216 '''convert date tuple to appropriate format'''
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
217 return self._converter.formatdate(date, fmt)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
218
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
219 def formatdict(self, data, key=b'key', value=b'value', fmt=None, sep=b' '):
29794
4891f3b93182 formatter: add function to convert dict to appropriate format
Yuya Nishihara <yuya@tcha.org>
parents: 29678
diff changeset
220 '''convert dict or key-value pairs to appropriate dict format'''
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
221 return self._converter.formatdict(data, key, value, fmt, sep)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
222
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
223 def formatlist(self, data, name, fmt=None, sep=b' '):
29676
c3a9cd78b151 formatter: add function to convert list to appropriate format (issue5217)
Yuya Nishihara <yuya@tcha.org>
parents: 29324
diff changeset
224 '''convert iterable to appropriate list format'''
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
225 # name is mandatory argument for now, but it could be optional if
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
226 # we have default template keyword, e.g. {item}
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
227 return self._converter.formatlist(data, name, fmt, sep)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
228
31172
16272d8c24f6 formatter: add support for changeset templating
Yuya Nishihara <yuya@tcha.org>
parents: 31170
diff changeset
229 def context(self, **ctxs):
16272d8c24f6 formatter: add support for changeset templating
Yuya Nishihara <yuya@tcha.org>
parents: 31170
diff changeset
230 '''insert context objects to be used to render template keywords'''
33090
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
231 ctxs = pycompat.byteskwargs(ctxs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
232 assert all(k in {b'repo', b'ctx', b'fctx'} for k in ctxs)
33090
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
233 if self._converter.storecontext:
39583
ee1e74ee037c formatter: fill missing resources by formatter, not by resource mapper
Yuya Nishihara <yuya@tcha.org>
parents: 39582
diff changeset
234 # populate missing resources in fctx -> ctx -> repo order
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
235 if b'fctx' in ctxs and b'ctx' not in ctxs:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
236 ctxs[b'ctx'] = ctxs[b'fctx'].changectx()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
237 if b'ctx' in ctxs and b'repo' not in ctxs:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
238 ctxs[b'repo'] = ctxs[b'ctx'].repo()
33090
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
239 self._item.update(ctxs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
240
38356
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
241 def datahint(self):
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
242 '''set of field names to be referenced'''
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
243 return set()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
244
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
245 def data(self, **data):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
246 '''insert data into item that's not shown in default output'''
32159
0fd15522a848 py3: use pycompat.byteskwargs to converts kwargs to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31925
diff changeset
247 data = pycompat.byteskwargs(data)
17630
ff5ed1ecd43a formatter: improve implementation of data method
David M. Carr <david@carrclan.us>
parents: 17597
diff changeset
248 self._item.update(data)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
249
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
250 def write(self, fields, deftext, *fielddata, **opts):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
251 '''do default text output while assigning data to item'''
26372
55de800937e0 formatter: verify number of arguments passed to write functions
Yuya Nishihara <yuya@tcha.org>
parents: 25950
diff changeset
252 fieldkeys = fields.split()
40140
46f9b1d2daf0 formatter: more details on assertion failure
Boris Feld <boris.feld@octobus.net>
parents: 39624
diff changeset
253 assert len(fieldkeys) == len(fielddata), (fieldkeys, fielddata)
26373
aa610ffad4e8 formatter: use dict.update() to set arguments passed to write functions
Yuya Nishihara <yuya@tcha.org>
parents: 26372
diff changeset
254 self._item.update(zip(fieldkeys, fielddata))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
255
17909
3326fd05eb1f formatter: add condwrite method
Matt Mackall <mpm@selenic.com>
parents: 17630
diff changeset
256 def condwrite(self, cond, fields, deftext, *fielddata, **opts):
3326fd05eb1f formatter: add condwrite method
Matt Mackall <mpm@selenic.com>
parents: 17630
diff changeset
257 '''do conditional write (primarily for plain formatter)'''
26372
55de800937e0 formatter: verify number of arguments passed to write functions
Yuya Nishihara <yuya@tcha.org>
parents: 25950
diff changeset
258 fieldkeys = fields.split()
55de800937e0 formatter: verify number of arguments passed to write functions
Yuya Nishihara <yuya@tcha.org>
parents: 25950
diff changeset
259 assert len(fieldkeys) == len(fielddata)
26373
aa610ffad4e8 formatter: use dict.update() to set arguments passed to write functions
Yuya Nishihara <yuya@tcha.org>
parents: 26372
diff changeset
260 self._item.update(zip(fieldkeys, fielddata))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
261
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
262 def plain(self, text, **opts):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
263 '''show raw text for non-templated mode'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
264
29949
e7cacb45c4be formatter: introduce isplain() to replace (the inverse of) __nonzero__() (API)
Mathias De Maré <mathias.demare@gmail.com>
parents: 29882
diff changeset
265 def isplain(self):
e7cacb45c4be formatter: introduce isplain() to replace (the inverse of) __nonzero__() (API)
Mathias De Maré <mathias.demare@gmail.com>
parents: 29882
diff changeset
266 '''check for plain formatter usage'''
e7cacb45c4be formatter: introduce isplain() to replace (the inverse of) __nonzero__() (API)
Mathias De Maré <mathias.demare@gmail.com>
parents: 29882
diff changeset
267 return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
268
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
269 def nested(self, field, tmpl=None, sep=b''):
29837
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
270 '''sub formatter to store nested data in the specified field'''
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
271 data = []
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
272 self._item[field] = self._converter.wrapnested(data, tmpl, sep)
29837
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
273 return _nestedformatter(self._ui, self._converter, data)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
274
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
275 def end(self):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
276 '''end output for the formatter'''
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
277 if self._item is not None:
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
278 self._showitem()
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
279
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
280
37597
d110167610db formatter: carry opts to file-based formatters by basefm
Yuya Nishihara <yuya@tcha.org>
parents: 37596
diff changeset
281 def nullformatter(ui, topic, opts):
32581
e9bf3e132ea9 formatter: add nullformatter
Yuya Nishihara <yuya@tcha.org>
parents: 32580
diff changeset
282 '''formatter that prints nothing'''
37597
d110167610db formatter: carry opts to file-based formatters by basefm
Yuya Nishihara <yuya@tcha.org>
parents: 37596
diff changeset
283 return baseformatter(ui, topic, opts, converter=_nullconverter)
32581
e9bf3e132ea9 formatter: add nullformatter
Yuya Nishihara <yuya@tcha.org>
parents: 32580
diff changeset
284
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
285
29837
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
286 class _nestedformatter(baseformatter):
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
287 '''build sub items and store them in the parent formatter'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
288
29837
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
289 def __init__(self, ui, converter, data):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
290 baseformatter.__init__(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
291 self, ui, topic=b'', opts={}, converter=converter
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
292 )
29837
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
293 self._data = data
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
294
29837
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
295 def _showitem(self):
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
296 self._data.append(self._item)
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
297
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
298
29794
4891f3b93182 formatter: add function to convert dict to appropriate format
Yuya Nishihara <yuya@tcha.org>
parents: 29678
diff changeset
299 def _iteritems(data):
4891f3b93182 formatter: add function to convert dict to appropriate format
Yuya Nishihara <yuya@tcha.org>
parents: 29678
diff changeset
300 '''iterate key-value pairs in stable order'''
4891f3b93182 formatter: add function to convert dict to appropriate format
Yuya Nishihara <yuya@tcha.org>
parents: 29678
diff changeset
301 if isinstance(data, dict):
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48888
diff changeset
302 return sorted(data.items())
29794
4891f3b93182 formatter: add function to convert dict to appropriate format
Yuya Nishihara <yuya@tcha.org>
parents: 29678
diff changeset
303 return data
4891f3b93182 formatter: add function to convert dict to appropriate format
Yuya Nishihara <yuya@tcha.org>
parents: 29678
diff changeset
304
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
305
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48932
diff changeset
306 class _plainconverter:
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
307 '''convert non-primitive data types to text'''
33090
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
308
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
309 storecontext = False
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
310
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
311 @staticmethod
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
312 def wrapnested(data, tmpl, sep):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
313 raise error.ProgrammingError(b'plainformatter should never be nested')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
314
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
315 @staticmethod
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
316 def formatdate(date, fmt):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
317 '''stringify date tuple in the given format'''
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36445
diff changeset
318 return dateutil.datestr(date, fmt)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
319
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
320 @staticmethod
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
321 def formatdict(data, key, value, fmt, sep):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
322 '''stringify key-value pairs separated by sep'''
36634
cafd0586876b templater: byte-stringify dict/list values before passing to default format
Yuya Nishihara <yuya@tcha.org>
parents: 36633
diff changeset
323 prefmt = pycompat.identity
36633
034a07e60e98 templater: allow dynamically switching the default dict/list formatting
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
324 if fmt is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
325 fmt = b'%s=%s'
36634
cafd0586876b templater: byte-stringify dict/list values before passing to default format
Yuya Nishihara <yuya@tcha.org>
parents: 36633
diff changeset
326 prefmt = pycompat.bytestr
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
327 return sep.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
328 fmt % (prefmt(k), prefmt(v)) for k, v in _iteritems(data)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
329 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
330
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
331 @staticmethod
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
332 def formatlist(data, name, fmt, sep):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
333 '''stringify iterable separated by sep'''
36634
cafd0586876b templater: byte-stringify dict/list values before passing to default format
Yuya Nishihara <yuya@tcha.org>
parents: 36633
diff changeset
334 prefmt = pycompat.identity
36633
034a07e60e98 templater: allow dynamically switching the default dict/list formatting
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
335 if fmt is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
336 fmt = b'%s'
36634
cafd0586876b templater: byte-stringify dict/list values before passing to default format
Yuya Nishihara <yuya@tcha.org>
parents: 36633
diff changeset
337 prefmt = pycompat.bytestr
cafd0586876b templater: byte-stringify dict/list values before passing to default format
Yuya Nishihara <yuya@tcha.org>
parents: 36633
diff changeset
338 return sep.join(fmt % prefmt(e) for e in data)
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
339
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
340
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
341 class plainformatter(baseformatter):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
342 '''the default text output scheme'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
343
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
344 def __init__(self, ui, out, topic, opts):
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
345 baseformatter.__init__(self, ui, topic, opts, _plainconverter)
22701
cb28d2b3db0b formatter: add general way to switch hex/short functions
Yuya Nishihara <yuya@tcha.org>
parents: 22674
diff changeset
346 if ui.debugflag:
cb28d2b3db0b formatter: add general way to switch hex/short functions
Yuya Nishihara <yuya@tcha.org>
parents: 22674
diff changeset
347 self.hexfunc = hex
cb28d2b3db0b formatter: add general way to switch hex/short functions
Yuya Nishihara <yuya@tcha.org>
parents: 22674
diff changeset
348 else:
cb28d2b3db0b formatter: add general way to switch hex/short functions
Yuya Nishihara <yuya@tcha.org>
parents: 22674
diff changeset
349 self.hexfunc = short
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
350 if ui is out:
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
351 self._write = ui.write
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
352 else:
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
353 self._write = lambda s, **opts: out.write(s)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
354
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
355 def startitem(self):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
356 pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
357
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
358 def data(self, **data):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
359 pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
360
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
361 def write(self, fields, deftext, *fielddata, **opts):
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
362 self._write(deftext % fielddata, **opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
363
17909
3326fd05eb1f formatter: add condwrite method
Matt Mackall <mpm@selenic.com>
parents: 17630
diff changeset
364 def condwrite(self, cond, fields, deftext, *fielddata, **opts):
3326fd05eb1f formatter: add condwrite method
Matt Mackall <mpm@selenic.com>
parents: 17630
diff changeset
365 '''do conditional write'''
3326fd05eb1f formatter: add condwrite method
Matt Mackall <mpm@selenic.com>
parents: 17630
diff changeset
366 if cond:
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
367 self._write(deftext % fielddata, **opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
368
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
369 def plain(self, text, **opts):
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
370 self._write(text, **opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
371
29949
e7cacb45c4be formatter: introduce isplain() to replace (the inverse of) __nonzero__() (API)
Mathias De Maré <mathias.demare@gmail.com>
parents: 29882
diff changeset
372 def isplain(self):
e7cacb45c4be formatter: introduce isplain() to replace (the inverse of) __nonzero__() (API)
Mathias De Maré <mathias.demare@gmail.com>
parents: 29882
diff changeset
373 return True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
374
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
375 def nested(self, field, tmpl=None, sep=b''):
29837
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
376 # nested data will be directly written to ui
5b886289a1ca formatter: add fm.nested(field) to either write or build sub items
Yuya Nishihara <yuya@tcha.org>
parents: 29836
diff changeset
377 return self
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
378
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
379 def end(self):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
380 pass
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
381
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
382
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
383 class debugformatter(baseformatter):
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
384 def __init__(self, ui, out, topic, opts):
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
385 baseformatter.__init__(self, ui, topic, opts, _nullconverter)
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
386 self._out = out
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
387 self._out.write(b"%s = [\n" % self._topic)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
388
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
389 def _showitem(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
390 self._out.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
391 b' %s,\n' % stringutil.pprint(self._item, indent=4, level=1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
392 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
393
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
394 def end(self):
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
395 baseformatter.end(self)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
396 self._out.write(b"]\n")
16134
3c0327ea20c0 formatter: add basic formatters
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
397
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
398
22430
968247e8f4ac formatter: add pickle format
Matt Mackall <mpm@selenic.com>
parents: 22428
diff changeset
399 class pickleformatter(baseformatter):
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
400 def __init__(self, ui, out, topic, opts):
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
401 baseformatter.__init__(self, ui, topic, opts, _nullconverter)
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
402 self._out = out
22430
968247e8f4ac formatter: add pickle format
Matt Mackall <mpm@selenic.com>
parents: 22428
diff changeset
403 self._data = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
404
22430
968247e8f4ac formatter: add pickle format
Matt Mackall <mpm@selenic.com>
parents: 22428
diff changeset
405 def _showitem(self):
968247e8f4ac formatter: add pickle format
Matt Mackall <mpm@selenic.com>
parents: 22428
diff changeset
406 self._data.append(self._item)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
407
22430
968247e8f4ac formatter: add pickle format
Matt Mackall <mpm@selenic.com>
parents: 22428
diff changeset
408 def end(self):
968247e8f4ac formatter: add pickle format
Matt Mackall <mpm@selenic.com>
parents: 22428
diff changeset
409 baseformatter.end(self)
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
410 self._out.write(pickle.dumps(self._data))
22430
968247e8f4ac formatter: add pickle format
Matt Mackall <mpm@selenic.com>
parents: 22428
diff changeset
411
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
412
41996
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
413 class cborformatter(baseformatter):
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
414 '''serialize items as an indefinite-length CBOR array'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
415
41996
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
416 def __init__(self, ui, out, topic, opts):
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
417 baseformatter.__init__(self, ui, topic, opts, _nullconverter)
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
418 self._out = out
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
419 self._out.write(cborutil.BEGIN_INDEFINITE_ARRAY)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
420
41996
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
421 def _showitem(self):
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
422 self._out.write(b''.join(cborutil.streamencode(self._item)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
423
41996
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
424 def end(self):
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
425 baseformatter.end(self)
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
426 self._out.write(cborutil.BREAK)
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
427
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
428
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
429 class jsonformatter(baseformatter):
46769
67a2ecea8bd9 debugdiscovery: also integrate the discovery output in the json one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45320
diff changeset
430 strict_format = True
67a2ecea8bd9 debugdiscovery: also integrate the discovery output in the json one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45320
diff changeset
431
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
432 def __init__(self, ui, out, topic, opts):
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
433 baseformatter.__init__(self, ui, topic, opts, _nullconverter)
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
434 self._out = out
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
435 self._out.write(b"[")
31298
59d09565ac77 formatter: set _first on formatter, not ui
Martin von Zweigbergk <martinvonz@google.com>
parents: 31182
diff changeset
436 self._first = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
437
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
438 def _showitem(self):
31298
59d09565ac77 formatter: set _first on formatter, not ui
Martin von Zweigbergk <martinvonz@google.com>
parents: 31182
diff changeset
439 if self._first:
59d09565ac77 formatter: set _first on formatter, not ui
Martin von Zweigbergk <martinvonz@google.com>
parents: 31182
diff changeset
440 self._first = False
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
441 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
442 self._out.write(b",")
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
443
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
444 self._out.write(b"\n {\n")
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
445 first = True
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
446 for k, v in sorted(self._item.items()):
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
447 if first:
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
448 first = False
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
449 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
450 self._out.write(b",\n")
31782
654e9a1c8a6c formatter: use templatefilters.json()
Yuya Nishihara <yuya@tcha.org>
parents: 31396
diff changeset
451 u = templatefilters.json(v, paranoid=False)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
452 self._out.write(b' "%s": %s' % (k, u))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
453 self._out.write(b"\n }")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
454
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
455 def end(self):
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
456 baseformatter.end(self)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
457 self._out.write(b"\n]\n")
22428
427e80a18ef8 formatter: add json formatter
Matt Mackall <mpm@selenic.com>
parents: 22424
diff changeset
458
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
459
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48932
diff changeset
460 class _templateconverter:
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
461 '''convert non-primitive data types to be processed by templater'''
33090
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
462
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
463 storecontext = True
04b3743c1d7c formatter: proxy fm.context() through converter
Yuya Nishihara <yuya@tcha.org>
parents: 32952
diff changeset
464
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
465 @staticmethod
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
466 def wrapnested(data, tmpl, sep):
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
467 '''wrap nested data by templatable type'''
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
468 return templateutil.mappinglist(data, tmpl=tmpl, sep=sep)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
469
37500
8bb3899a0f47 formatter: make nested items somewhat readable in template output
Yuya Nishihara <yuya@tcha.org>
parents: 37105
diff changeset
470 @staticmethod
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
471 def formatdate(date, fmt):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
472 '''return date tuple'''
38285
8d6109b49b31 templater: introduce a wrapper for date tuple (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 37839
diff changeset
473 return templateutil.date(date)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
474
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
475 @staticmethod
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
476 def formatdict(data, key, value, fmt, sep):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
477 '''build object that can be evaluated as either plain string or dict'''
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
478 data = util.sortdict(_iteritems(data))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
479
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
480 def f():
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
481 yield _plainconverter.formatdict(data, key, value, fmt, sep)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
482
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
483 return templateutil.hybriddict(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
484 data, key=key, value=value, fmt=fmt, gen=f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
485 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
486
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
487 @staticmethod
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
488 def formatlist(data, name, fmt, sep):
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
489 '''build object that can be evaluated as either plain string or list'''
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
490 data = list(data)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
491
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
492 def f():
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
493 yield _plainconverter.formatlist(data, name, fmt, sep)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
494
36921
32f9b7e3f056 templater: move hybrid class and functions to templateutil module
Yuya Nishihara <yuya@tcha.org>
parents: 36920
diff changeset
495 return templateutil.hybridlist(data, name=name, fmt=fmt, gen=f)
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
496
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
497
25513
0c6f98398f8a formatter: add template support
Matt Mackall <mpm@selenic.com>
parents: 25512
diff changeset
498 class templateformatter(baseformatter):
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
499 def __init__(self, ui, out, topic, opts, spec, overridetemplates=None):
29836
18bac830eef3 formatter: factor out format*() functions to separate classes
Yuya Nishihara <yuya@tcha.org>
parents: 29794
diff changeset
500 baseformatter.__init__(self, ui, topic, opts, _templateconverter)
31182
5660c45ecba6 formatter: add argument to change output file of non-plain formatter
Yuya Nishihara <yuya@tcha.org>
parents: 31172
diff changeset
501 self._out = out
32841
883adaea9e80 formatter: render template specified by templatespec tuple
Yuya Nishihara <yuya@tcha.org>
parents: 32840
diff changeset
502 self._tref = spec.ref
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
503 self._t = loadtemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
504 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
505 spec,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
506 defaults=templatekw.keywords,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
507 resources=templateresources(ui),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
508 cache=templatekw.defaulttempl,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
509 )
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
510 if overridetemplates:
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
511 self._t.cache.update(overridetemplates)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
512 self._parts = templatepartsmap(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
513 spec, self._t, [b'docheader', b'docfooter', b'separator']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
514 )
31807
e6eb86b154c5 templater: provide loop counter as "index" keyword
Yuya Nishihara <yuya@tcha.org>
parents: 31805
diff changeset
515 self._counter = itertools.count()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
516 self._renderitem(b'docheader', {})
32949
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
517
25513
0c6f98398f8a formatter: add template support
Matt Mackall <mpm@selenic.com>
parents: 25512
diff changeset
518 def _showitem(self):
32948
12a0794fa2e3 formatter: extract helper function to render template
Yuya Nishihara <yuya@tcha.org>
parents: 32897
diff changeset
519 item = self._item.copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
520 item[b'index'] = index = next(self._counter)
32950
5100ce217dfa formatter: add support for separator template
Yuya Nishihara <yuya@tcha.org>
parents: 32949
diff changeset
521 if index > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
522 self._renderitem(b'separator', {})
32948
12a0794fa2e3 formatter: extract helper function to render template
Yuya Nishihara <yuya@tcha.org>
parents: 32897
diff changeset
523 self._renderitem(self._tref, item)
12a0794fa2e3 formatter: extract helper function to render template
Yuya Nishihara <yuya@tcha.org>
parents: 32897
diff changeset
524
32949
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
525 def _renderitem(self, part, item):
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
526 if part not in self._parts:
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
527 return
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
528 ref = self._parts[part]
43337
7e20b705da5b formatter: fix handling of None value in templater mapping
Yuya Nishihara <yuya@tcha.org>
parents: 43335
diff changeset
529 # None can't be put in the mapping dict since it means <unset>
7e20b705da5b formatter: fix handling of None value in templater mapping
Yuya Nishihara <yuya@tcha.org>
parents: 43335
diff changeset
530 for k, v in item.items():
7e20b705da5b formatter: fix handling of None value in templater mapping
Yuya Nishihara <yuya@tcha.org>
parents: 43335
diff changeset
531 if v is None:
7e20b705da5b formatter: fix handling of None value in templater mapping
Yuya Nishihara <yuya@tcha.org>
parents: 43335
diff changeset
532 item[k] = templateutil.wrappedvalue(v)
37103
be3f33f5e232 templater: switch 'revcache' based on new mapping items
Yuya Nishihara <yuya@tcha.org>
parents: 37102
diff changeset
533 self._out.write(self._t.render(ref, item))
25513
0c6f98398f8a formatter: add template support
Matt Mackall <mpm@selenic.com>
parents: 25512
diff changeset
534
38356
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
535 @util.propertycache
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
536 def _symbolsused(self):
38446
5b04a0c30f3f formatter: look for template symbols from the associated name
Yuya Nishihara <yuya@tcha.org>
parents: 38429
diff changeset
537 return self._t.symbolsused(self._tref)
38356
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
538
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
539 def datahint(self):
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
540 '''set of field names to be referenced from the template'''
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
541 return self._symbolsused[0]
8221df643176 formatter: provide hint of referenced field names
Yuya Nishihara <yuya@tcha.org>
parents: 38285
diff changeset
542
32949
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
543 def end(self):
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
544 baseformatter.end(self)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
545 self._renderitem(b'docfooter', {})
32949
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
546
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
547
37839
395571419274 formatter: ditch namedtuple in favor of attr
Yuya Nishihara <yuya@tcha.org>
parents: 37770
diff changeset
548 @attr.s(frozen=True)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48932
diff changeset
549 class templatespec:
37839
395571419274 formatter: ditch namedtuple in favor of attr
Yuya Nishihara <yuya@tcha.org>
parents: 37770
diff changeset
550 ref = attr.ib()
395571419274 formatter: ditch namedtuple in favor of attr
Yuya Nishihara <yuya@tcha.org>
parents: 37770
diff changeset
551 tmpl = attr.ib()
395571419274 formatter: ditch namedtuple in favor of attr
Yuya Nishihara <yuya@tcha.org>
parents: 37770
diff changeset
552 mapfile = attr.ib()
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
553 refargs = attr.ib(default=None)
45310
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
554 fp = attr.ib(default=None)
32838
615ec3f14aa9 formatter: wrap (tmpl, mapfile) by named tuple
Yuya Nishihara <yuya@tcha.org>
parents: 32835
diff changeset
555
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
556
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
557 def empty_templatespec():
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
558 return templatespec(None, None, None)
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
559
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
560
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
561 def reference_templatespec(ref, refargs=None):
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
562 return templatespec(ref, None, None, refargs)
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
563
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
564
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
565 def literal_templatespec(tmpl):
48888
07a7b57d3e33 formatter: remove conditional assert
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
566 assert not isinstance(tmpl, str), b'tmpl must not be a str'
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
567 return templatespec(b'', tmpl, None)
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
568
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
569
45310
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
570 def mapfile_templatespec(topic, mapfile, fp=None):
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
571 return templatespec(topic, None, mapfile, fp=fp)
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
572
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
573
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
574 def lookuptemplate(ui, topic, tmpl):
32835
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
575 """Find the template matching the given -T/--template spec 'tmpl'
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
576
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
577 'tmpl' can be any of the following:
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
578
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
579 - a literal template (e.g. '{rev}')
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
580 - a reference to built-in template (i.e. formatter)
32835
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
581 - a map-file name or path (e.g. 'changelog')
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
582 - a reference to [templates] in config file
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
583 - a path to raw template file
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
584
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
585 A map file defines a stand-alone template environment. If a map file
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
586 selected, all templates defined in the file will be loaded, and the
34715
f17a0e18c47e templater: load aliases from [templatealias] section in map file
Yuya Nishihara <yuya@tcha.org>
parents: 34425
diff changeset
587 template matching the given topic will be rendered. Aliases won't be
f17a0e18c47e templater: load aliases from [templatealias] section in map file
Yuya Nishihara <yuya@tcha.org>
parents: 34425
diff changeset
588 loaded from user config, but from the map file.
32875
c8f2cf18b82e formatter: load templates section like a map file
Yuya Nishihara <yuya@tcha.org>
parents: 32873
diff changeset
589
c8f2cf18b82e formatter: load templates section like a map file
Yuya Nishihara <yuya@tcha.org>
parents: 32873
diff changeset
590 If no map file selected, all templates in [templates] section will be
c8f2cf18b82e formatter: load templates section like a map file
Yuya Nishihara <yuya@tcha.org>
parents: 32873
diff changeset
591 available as well as aliases in [templatealias].
32835
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
592 """
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32833
diff changeset
593
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
594 if not tmpl:
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
595 return empty_templatespec()
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
596
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
597 # looks like a literal template?
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
598 if b'{' in tmpl:
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
599 return literal_templatespec(tmpl)
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
600
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
601 # a reference to built-in (formatter) template
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
602 if tmpl in {b'cbor', b'json', b'pickle', b'debug'}:
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
603 return reference_templatespec(tmpl)
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
604
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
605 # a function-style reference to built-in template
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
606 func, fsep, ftail = tmpl.partition(b'(')
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
607 if func in {b'cbor', b'json'} and fsep and ftail.endswith(b')'):
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
608 templater.parseexpr(tmpl) # make sure syntax errors are confined
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
609 return reference_templatespec(func, refargs=ftail[:-1])
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
610
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
611 # perhaps a stock style?
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
612 if not os.path.split(tmpl)[0]:
45320
4aa484efc926 templater: add exception-raising version of open_template()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45310
diff changeset
613 (mapname, fp) = templater.try_open_template(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
614 b'map-cmdline.' + tmpl
45320
4aa484efc926 templater: add exception-raising version of open_template()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45310
diff changeset
615 ) or templater.try_open_template(tmpl)
45260
653b2a439412 formatter: remove now-unnecessary check for file-ness
Martin von Zweigbergk <martinvonz@google.com>
parents: 43337
diff changeset
616 if mapname:
45310
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
617 return mapfile_templatespec(topic, mapname, fp)
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
618
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
619 # perhaps it's a reference to [templates]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
620 if ui.config(b'templates', tmpl):
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
621 return reference_templatespec(tmpl)
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
622
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
623 if tmpl == b'list':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
624 ui.write(_(b"available styles: %s\n") % templater.stylelist())
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
625 raise error.Abort(_(b"specify a template"))
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
626
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
627 # perhaps it's a path to a map or a template
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
628 if (b'/' in tmpl or b'\\' in tmpl) and os.path.isfile(tmpl):
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
629 # is it a mapfile for a style?
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
630 if os.path.basename(tmpl).startswith(b"map-"):
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
631 return mapfile_templatespec(topic, os.path.realpath(tmpl))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
632 with util.posixfile(tmpl, b'rb') as f:
32828
526f9f12f707 formatter: close raw template file explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 32581
diff changeset
633 tmpl = f.read()
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
634 return literal_templatespec(tmpl)
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
635
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
636 # constant string?
45264
8cce9f77ca73 templatespec: create a factory function for each type there is
Martin von Zweigbergk <martinvonz@google.com>
parents: 45262
diff changeset
637 return literal_templatespec(tmpl)
25511
c2a4dfe2a336 formatter: move most of template option helper to formatter
Matt Mackall <mpm@selenic.com>
parents: 24321
diff changeset
638
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
639
32949
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
640 def templatepartsmap(spec, t, partnames):
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
641 """Create a mapping of {part: ref}"""
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
642 partsmap = {spec.ref: spec.ref} # initial ref must exist in t
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
643 if spec.mapfile:
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
644 partsmap.update((p, p) for p in partnames if p in t)
32952
61b60b28c381 formatter: add support for parts map of [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32950
diff changeset
645 elif spec.ref:
61b60b28c381 formatter: add support for parts map of [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32950
diff changeset
646 for part in partnames:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
647 ref = b'%s:%s' % (spec.ref, part) # select config sub-section
32952
61b60b28c381 formatter: add support for parts map of [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32950
diff changeset
648 if ref in t:
61b60b28c381 formatter: add support for parts map of [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32950
diff changeset
649 partsmap[part] = ref
32949
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
650 return partsmap
13eebc189ff3 formatter: add support for docheader and docfooter templates
Yuya Nishihara <yuya@tcha.org>
parents: 32948
diff changeset
651
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
652
35483
817a3d20dd01 templater: register keywords to defaults table
Yuya Nishihara <yuya@tcha.org>
parents: 35470
diff changeset
653 def loadtemplater(ui, spec, defaults=None, resources=None, cache=None):
32832
11e667a8fcba formatter: factor out function to create templater from literal or map file
Yuya Nishihara <yuya@tcha.org>
parents: 32830
diff changeset
654 """Create a templater from either a literal template or loading from
11e667a8fcba formatter: factor out function to create templater from literal or map file
Yuya Nishihara <yuya@tcha.org>
parents: 32830
diff changeset
655 a map file"""
32838
615ec3f14aa9 formatter: wrap (tmpl, mapfile) by named tuple
Yuya Nishihara <yuya@tcha.org>
parents: 32835
diff changeset
656 assert not (spec.tmpl and spec.mapfile)
615ec3f14aa9 formatter: wrap (tmpl, mapfile) by named tuple
Yuya Nishihara <yuya@tcha.org>
parents: 32835
diff changeset
657 if spec.mapfile:
45262
22eafb16f1c5 formatter: inline a variable assigned from `templater.templater.frommapfile`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45260
diff changeset
658 return templater.templater.frommapfile(
45310
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
659 spec.mapfile,
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
660 spec.fp,
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
661 defaults=defaults,
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
662 resources=resources,
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
663 cache=cache,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
664 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
665 return maketemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
666 ui, spec.tmpl, defaults=defaults, resources=resources, cache=cache
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
667 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
668
28955
78759f78a44e templater: factor out function that creates templater from string template
Yuya Nishihara <yuya@tcha.org>
parents: 28954
diff changeset
669
35483
817a3d20dd01 templater: register keywords to defaults table
Yuya Nishihara <yuya@tcha.org>
parents: 35470
diff changeset
670 def maketemplater(ui, tmpl, defaults=None, resources=None, cache=None):
28955
78759f78a44e templater: factor out function that creates templater from string template
Yuya Nishihara <yuya@tcha.org>
parents: 28954
diff changeset
671 """Create a templater from a string template 'tmpl'"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
672 aliases = ui.configitems(b'templatealias')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
673 t = templater.templater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
674 defaults=defaults, resources=resources, cache=cache, aliases=aliases
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
675 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
676 t.cache.update(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
677 (k, templater.unquotestring(v)) for k, v in ui.configitems(b'templates')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
678 )
25512
8463433c2689 formatter: add a method to build a full templater from a -T option
Matt Mackall <mpm@selenic.com>
parents: 25511
diff changeset
679 if tmpl:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
680 t.cache[b''] = tmpl
25512
8463433c2689 formatter: add a method to build a full templater from a -T option
Matt Mackall <mpm@selenic.com>
parents: 25511
diff changeset
681 return t
8463433c2689 formatter: add a method to build a full templater from a -T option
Matt Mackall <mpm@selenic.com>
parents: 25511
diff changeset
682
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
683
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
684 # marker to denote a resource to be loaded on demand based on mapping values
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
685 # (e.g. (ctx, path) -> fctx)
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
686 _placeholder = object()
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
687
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
688
37073
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
689 class templateresources(templater.resourcemapper):
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
690 """Resource mapper designed for the default templatekw and function"""
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
691
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
692 def __init__(self, ui, repo=None):
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
693 self._resmap = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
694 b'cache': {}, # for templatekw/funcs to store reusable data
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
695 b'repo': repo,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
696 b'ui': ui,
37073
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
697 }
35469
f1c54d003327 templater: move repo, ui and cache to per-engine resources
Yuya Nishihara <yuya@tcha.org>
parents: 35468
diff changeset
698
39582
28f974d83c0a templater: remove unused context argument from most resourcemapper functions
Yuya Nishihara <yuya@tcha.org>
parents: 38446
diff changeset
699 def availablekeys(self, mapping):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
700 return {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
701 k for k in self.knownkeys() if self._getsome(mapping, k) is not None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
702 }
37075
46859b437697 templater: drop symbols which should be overridden by new 'ctx' (issue5612)
Yuya Nishihara <yuya@tcha.org>
parents: 37073
diff changeset
703
37073
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
704 def knownkeys(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
705 return {b'cache', b'ctx', b'fctx', b'repo', b'revcache', b'ui'}
37073
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
706
39582
28f974d83c0a templater: remove unused context argument from most resourcemapper functions
Yuya Nishihara <yuya@tcha.org>
parents: 38446
diff changeset
707 def lookup(self, mapping, key):
39584
109b2c2d9942 formatter: inline _gettermap and _knownkeys
Yuya Nishihara <yuya@tcha.org>
parents: 39583
diff changeset
708 if key not in self.knownkeys():
37073
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
709 return None
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
710 v = self._getsome(mapping, key)
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
711 if v is _placeholder:
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
712 v = mapping[key] = self._loadermap[key](self, mapping)
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
713 return v
37073
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
714
37102
638a241202a3 templater: add hook point to populate additional mapping items
Yuya Nishihara <yuya@tcha.org>
parents: 37075
diff changeset
715 def populatemap(self, context, origmapping, newmapping):
37103
be3f33f5e232 templater: switch 'revcache' based on new mapping items
Yuya Nishihara <yuya@tcha.org>
parents: 37102
diff changeset
716 mapping = {}
39585
990a0b071ea5 formatter: factor out function that detects node change and document it
Yuya Nishihara <yuya@tcha.org>
parents: 39584
diff changeset
717 if self._hasnodespec(newmapping):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
718 mapping[b'revcache'] = {} # per-ctx cache
39585
990a0b071ea5 formatter: factor out function that detects node change and document it
Yuya Nishihara <yuya@tcha.org>
parents: 39584
diff changeset
719 if self._hasnodespec(origmapping) and self._hasnodespec(newmapping):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
720 orignode = templateutil.runsymbol(context, origmapping, b'node')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
721 mapping[b'originalnode'] = orignode
39623
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
722 # put marker to override 'ctx'/'fctx' in mapping if any, and flag
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
723 # its existence to be reported by availablekeys()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
724 if b'ctx' not in newmapping and self._hasliteral(newmapping, b'node'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
725 mapping[b'ctx'] = _placeholder
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
726 if b'fctx' not in newmapping and self._hasliteral(newmapping, b'path'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
727 mapping[b'fctx'] = _placeholder
37103
be3f33f5e232 templater: switch 'revcache' based on new mapping items
Yuya Nishihara <yuya@tcha.org>
parents: 37102
diff changeset
728 return mapping
37102
638a241202a3 templater: add hook point to populate additional mapping items
Yuya Nishihara <yuya@tcha.org>
parents: 37075
diff changeset
729
39582
28f974d83c0a templater: remove unused context argument from most resourcemapper functions
Yuya Nishihara <yuya@tcha.org>
parents: 38446
diff changeset
730 def _getsome(self, mapping, key):
36983
036e4483d3a1 templater: process mapping dict by resource callables
Yuya Nishihara <yuya@tcha.org>
parents: 36982
diff changeset
731 v = mapping.get(key)
036e4483d3a1 templater: process mapping dict by resource callables
Yuya Nishihara <yuya@tcha.org>
parents: 36982
diff changeset
732 if v is not None:
036e4483d3a1 templater: process mapping dict by resource callables
Yuya Nishihara <yuya@tcha.org>
parents: 36982
diff changeset
733 return v
37073
44757e6dad93 templater: introduce resourcemapper class
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
734 return self._resmap.get(key)
36982
255f635c3204 templater: convert resources to a table of callables for future extension
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
735
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
736 def _hasliteral(self, mapping, key):
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
737 """Test if a literal value is set or unset in the given mapping"""
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
738 return key in mapping and not callable(mapping[key])
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
739
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
740 def _getliteral(self, mapping, key):
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
741 """Return value of the given name if it is a literal"""
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
742 v = mapping.get(key)
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
743 if callable(v):
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
744 return None
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
745 return v
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
746
39585
990a0b071ea5 formatter: factor out function that detects node change and document it
Yuya Nishihara <yuya@tcha.org>
parents: 39584
diff changeset
747 def _hasnodespec(self, mapping):
990a0b071ea5 formatter: factor out function that detects node change and document it
Yuya Nishihara <yuya@tcha.org>
parents: 39584
diff changeset
748 """Test if context revision is set or unset in the given mapping"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
749 return b'node' in mapping or b'ctx' in mapping
36984
939e0983c1d9 formatter: unblock storing fctx as a template resource
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
750
39623
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
751 def _loadctx(self, mapping):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
752 repo = self._getsome(mapping, b'repo')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
753 node = self._getliteral(mapping, b'node')
39623
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
754 if repo is None or node is None:
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
755 return
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
756 try:
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
757 return repo[node]
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
758 except error.RepoLookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
759 return None # maybe hidden/non-existent node
39623
34ecc0a09c76 formatter: populate ctx from repo and node value
Yuya Nishihara <yuya@tcha.org>
parents: 39586
diff changeset
760
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
761 def _loadfctx(self, mapping):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
762 ctx = self._getsome(mapping, b'ctx')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
763 path = self._getliteral(mapping, b'path')
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
764 if ctx is None or path is None:
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
765 return None
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
766 try:
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
767 return ctx[path]
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
768 except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
769 return None # maybe removed file?
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
770
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
771 _loadermap = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
772 b'ctx': _loadctx,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
773 b'fctx': _loadfctx,
39586
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
774 }
b1239aeef4d9 formatter: populate fctx from ctx and path value
Yuya Nishihara <yuya@tcha.org>
parents: 39585
diff changeset
775
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
776
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
777 def _internaltemplateformatter(
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
778 ui,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
779 out,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
780 topic,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
781 opts,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
782 spec,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
783 tmpl,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
784 docheader=b'',
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
785 docfooter=b'',
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
786 separator=b'',
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
787 ):
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
788 """Build template formatter that handles customizable built-in templates
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
789 such as -Tjson(...)"""
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
790 templates = {spec.ref: tmpl}
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
791 if docheader:
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
792 templates[b'%s:docheader' % spec.ref] = docheader
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
793 if docfooter:
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
794 templates[b'%s:docfooter' % spec.ref] = docfooter
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
795 if separator:
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
796 templates[b'%s:separator' % spec.ref] = separator
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
797 return templateformatter(
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
798 ui, out, topic, opts, spec, overridetemplates=templates
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
799 )
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
800
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
801
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
802 def formatter(ui, out, topic, opts):
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
803 spec = lookuptemplate(ui, topic, opts.get(b'template', b''))
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
804 if spec.ref == b"cbor" and spec.refargs is not None:
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
805 return _internaltemplateformatter(
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
806 ui,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
807 out,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
808 topic,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
809 opts,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
810 spec,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
811 tmpl=b'{dict(%s)|cbor}' % spec.refargs,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
812 docheader=cborutil.BEGIN_INDEFINITE_ARRAY,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
813 docfooter=cborutil.BREAK,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
814 )
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
815 elif spec.ref == b"cbor":
41996
77ef3498ceb3 template: add CBOR output format
Yuya Nishihara <yuya@tcha.org>
parents: 40277
diff changeset
816 return cborformatter(ui, out, topic, opts)
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
817 elif spec.ref == b"json" and spec.refargs is not None:
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
818 return _internaltemplateformatter(
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
819 ui,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
820 out,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
821 topic,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
822 opts,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
823 spec,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
824 tmpl=b'{dict(%s)|json}' % spec.refargs,
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
825 docheader=b'[\n ',
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
826 docfooter=b'\n]\n',
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
827 separator=b',\n ',
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
828 )
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
829 elif spec.ref == b"json":
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
830 return jsonformatter(ui, out, topic, opts)
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
831 elif spec.ref == b"pickle":
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
832 assert spec.refargs is None, r'function-style not supported'
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
833 return pickleformatter(ui, out, topic, opts)
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
834 elif spec.ref == b"debug":
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
835 assert spec.refargs is None, r'function-style not supported'
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
836 return debugformatter(ui, out, topic, opts)
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43099
diff changeset
837 elif spec.ref or spec.tmpl or spec.mapfile:
43101
1d12ae5096d1 formatter: map -Tjson(...) and -Tcbor(...) to templater
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
838 assert spec.refargs is None, r'function-style not supported'
43099
f1c5358f0d65 formatter: pass in template spec to templateformatter as argument
Yuya Nishihara <yuya@tcha.org>
parents: 43077
diff changeset
839 return templateformatter(ui, out, topic, opts, spec)
25838
31137258ae8b formatter: mark developer options
Matt Mackall <mpm@selenic.com>
parents: 25513
diff changeset
840 # developer config: ui.formatdebug
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
841 elif ui.configbool(b'ui', b'formatdebug'):
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
842 return debugformatter(ui, out, topic, opts)
25838
31137258ae8b formatter: mark developer options
Matt Mackall <mpm@selenic.com>
parents: 25513
diff changeset
843 # deprecated config: ui.formatjson
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
844 elif ui.configbool(b'ui', b'formatjson'):
32579
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
845 return jsonformatter(ui, out, topic, opts)
012e0da5b759 formatter: add option to redirect output to file object
Yuya Nishihara <yuya@tcha.org>
parents: 32159
diff changeset
846 return plainformatter(ui, out, topic, opts)
32580
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
847
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
848
32580
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
849 @contextlib.contextmanager
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
850 def openformatter(ui, filename, topic, opts):
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
851 """Create a formatter that writes outputs to the specified file
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
852
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
853 Must be invoked using the 'with' statement.
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
854 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
855 with util.posixfile(filename, b'wb') as out:
32580
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
856 with formatter(ui, out, topic, opts) as fm:
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
857 yield fm
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
858
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
859
32580
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
860 @contextlib.contextmanager
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
861 def _neverending(fm):
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
862 yield fm
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
863
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41996
diff changeset
864
37597
d110167610db formatter: carry opts to file-based formatters by basefm
Yuya Nishihara <yuya@tcha.org>
parents: 37596
diff changeset
865 def maybereopen(fm, filename):
32580
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
866 """Create a formatter backed by file if filename specified, else return
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
867 the given formatter
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
868
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
869 Must be invoked using the 'with' statement. This will never call fm.end()
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
870 of the given formatter.
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
871 """
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
872 if filename:
37597
d110167610db formatter: carry opts to file-based formatters by basefm
Yuya Nishihara <yuya@tcha.org>
parents: 37596
diff changeset
873 return openformatter(fm._ui, filename, fm._topic, fm._opts)
32580
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
874 else:
35985d407d49 formatter: add helper to create a formatter optionally backed by file
Yuya Nishihara <yuya@tcha.org>
parents: 32579
diff changeset
875 return _neverending(fm)