annotate mercurial/formatter.py @ 52216:fa58f4f97337 stable tip

ci: shard the test run on mac os X This should comes with some benefit: - spread the load across more runner, - reduce the real-time CI run, - reduce the "retry" run when we need them. We start with the Mac jobs, but that would be tremendously useful for Windows too. For linux, we need to reduce the startup overhead for this to be worth it. Building smaller image and speeding up clone should help with that.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 08 Nov 2024 17:08:11 +0100
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)