##// END OF EJS Templates
templatefilters: handle TypeError by count()...
Yuya Nishihara -
r37246:05db4273 default
parent child Browse files
Show More
@@ -1,436 +1,440 b''
1 # templatefilters.py - common template expansion filters
1 # templatefilters.py - common template expansion filters
2 #
2 #
3 # Copyright 2005-2008 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2008 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import os
10 import os
11 import re
11 import re
12 import time
12 import time
13
13
14 from .i18n import _
14 from . import (
15 from . import (
15 encoding,
16 encoding,
16 error,
17 error,
17 node,
18 node,
18 pycompat,
19 pycompat,
19 registrar,
20 registrar,
20 templateutil,
21 templateutil,
21 url,
22 url,
22 util,
23 util,
23 )
24 )
24 from .utils import (
25 from .utils import (
25 dateutil,
26 dateutil,
26 stringutil,
27 stringutil,
27 )
28 )
28
29
29 urlerr = util.urlerr
30 urlerr = util.urlerr
30 urlreq = util.urlreq
31 urlreq = util.urlreq
31
32
32 if pycompat.ispy3:
33 if pycompat.ispy3:
33 long = int
34 long = int
34
35
35 # filters are callables like:
36 # filters are callables like:
36 # fn(obj)
37 # fn(obj)
37 # with:
38 # with:
38 # obj - object to be filtered (text, date, list and so on)
39 # obj - object to be filtered (text, date, list and so on)
39 filters = {}
40 filters = {}
40
41
41 templatefilter = registrar.templatefilter(filters)
42 templatefilter = registrar.templatefilter(filters)
42
43
43 @templatefilter('addbreaks', intype=bytes)
44 @templatefilter('addbreaks', intype=bytes)
44 def addbreaks(text):
45 def addbreaks(text):
45 """Any text. Add an XHTML "<br />" tag before the end of
46 """Any text. Add an XHTML "<br />" tag before the end of
46 every line except the last.
47 every line except the last.
47 """
48 """
48 return text.replace('\n', '<br/>\n')
49 return text.replace('\n', '<br/>\n')
49
50
50 agescales = [("year", 3600 * 24 * 365, 'Y'),
51 agescales = [("year", 3600 * 24 * 365, 'Y'),
51 ("month", 3600 * 24 * 30, 'M'),
52 ("month", 3600 * 24 * 30, 'M'),
52 ("week", 3600 * 24 * 7, 'W'),
53 ("week", 3600 * 24 * 7, 'W'),
53 ("day", 3600 * 24, 'd'),
54 ("day", 3600 * 24, 'd'),
54 ("hour", 3600, 'h'),
55 ("hour", 3600, 'h'),
55 ("minute", 60, 'm'),
56 ("minute", 60, 'm'),
56 ("second", 1, 's')]
57 ("second", 1, 's')]
57
58
58 @templatefilter('age', intype=templateutil.date)
59 @templatefilter('age', intype=templateutil.date)
59 def age(date, abbrev=False):
60 def age(date, abbrev=False):
60 """Date. Returns a human-readable date/time difference between the
61 """Date. Returns a human-readable date/time difference between the
61 given date/time and the current date/time.
62 given date/time and the current date/time.
62 """
63 """
63
64
64 def plural(t, c):
65 def plural(t, c):
65 if c == 1:
66 if c == 1:
66 return t
67 return t
67 return t + "s"
68 return t + "s"
68 def fmt(t, c, a):
69 def fmt(t, c, a):
69 if abbrev:
70 if abbrev:
70 return "%d%s" % (c, a)
71 return "%d%s" % (c, a)
71 return "%d %s" % (c, plural(t, c))
72 return "%d %s" % (c, plural(t, c))
72
73
73 now = time.time()
74 now = time.time()
74 then = date[0]
75 then = date[0]
75 future = False
76 future = False
76 if then > now:
77 if then > now:
77 future = True
78 future = True
78 delta = max(1, int(then - now))
79 delta = max(1, int(then - now))
79 if delta > agescales[0][1] * 30:
80 if delta > agescales[0][1] * 30:
80 return 'in the distant future'
81 return 'in the distant future'
81 else:
82 else:
82 delta = max(1, int(now - then))
83 delta = max(1, int(now - then))
83 if delta > agescales[0][1] * 2:
84 if delta > agescales[0][1] * 2:
84 return dateutil.shortdate(date)
85 return dateutil.shortdate(date)
85
86
86 for t, s, a in agescales:
87 for t, s, a in agescales:
87 n = delta // s
88 n = delta // s
88 if n >= 2 or s == 1:
89 if n >= 2 or s == 1:
89 if future:
90 if future:
90 return '%s from now' % fmt(t, n, a)
91 return '%s from now' % fmt(t, n, a)
91 return '%s ago' % fmt(t, n, a)
92 return '%s ago' % fmt(t, n, a)
92
93
93 @templatefilter('basename', intype=bytes)
94 @templatefilter('basename', intype=bytes)
94 def basename(path):
95 def basename(path):
95 """Any text. Treats the text as a path, and returns the last
96 """Any text. Treats the text as a path, and returns the last
96 component of the path after splitting by the path separator.
97 component of the path after splitting by the path separator.
97 For example, "foo/bar/baz" becomes "baz" and "foo/bar//" becomes "".
98 For example, "foo/bar/baz" becomes "baz" and "foo/bar//" becomes "".
98 """
99 """
99 return os.path.basename(path)
100 return os.path.basename(path)
100
101
101 @templatefilter('count')
102 @templatefilter('count')
102 def count(i):
103 def count(i):
103 """List or text. Returns the length as an integer."""
104 """List or text. Returns the length as an integer."""
104 return len(i)
105 try:
106 return len(i)
107 except TypeError:
108 raise error.ParseError(_('not countable'))
105
109
106 @templatefilter('dirname', intype=bytes)
110 @templatefilter('dirname', intype=bytes)
107 def dirname(path):
111 def dirname(path):
108 """Any text. Treats the text as a path, and strips the last
112 """Any text. Treats the text as a path, and strips the last
109 component of the path after splitting by the path separator.
113 component of the path after splitting by the path separator.
110 """
114 """
111 return os.path.dirname(path)
115 return os.path.dirname(path)
112
116
113 @templatefilter('domain', intype=bytes)
117 @templatefilter('domain', intype=bytes)
114 def domain(author):
118 def domain(author):
115 """Any text. Finds the first string that looks like an email
119 """Any text. Finds the first string that looks like an email
116 address, and extracts just the domain component. Example: ``User
120 address, and extracts just the domain component. Example: ``User
117 <user@example.com>`` becomes ``example.com``.
121 <user@example.com>`` becomes ``example.com``.
118 """
122 """
119 f = author.find('@')
123 f = author.find('@')
120 if f == -1:
124 if f == -1:
121 return ''
125 return ''
122 author = author[f + 1:]
126 author = author[f + 1:]
123 f = author.find('>')
127 f = author.find('>')
124 if f >= 0:
128 if f >= 0:
125 author = author[:f]
129 author = author[:f]
126 return author
130 return author
127
131
128 @templatefilter('email', intype=bytes)
132 @templatefilter('email', intype=bytes)
129 def email(text):
133 def email(text):
130 """Any text. Extracts the first string that looks like an email
134 """Any text. Extracts the first string that looks like an email
131 address. Example: ``User <user@example.com>`` becomes
135 address. Example: ``User <user@example.com>`` becomes
132 ``user@example.com``.
136 ``user@example.com``.
133 """
137 """
134 return stringutil.email(text)
138 return stringutil.email(text)
135
139
136 @templatefilter('escape', intype=bytes)
140 @templatefilter('escape', intype=bytes)
137 def escape(text):
141 def escape(text):
138 """Any text. Replaces the special XML/XHTML characters "&", "<"
142 """Any text. Replaces the special XML/XHTML characters "&", "<"
139 and ">" with XML entities, and filters out NUL characters.
143 and ">" with XML entities, and filters out NUL characters.
140 """
144 """
141 return url.escape(text.replace('\0', ''), True)
145 return url.escape(text.replace('\0', ''), True)
142
146
143 para_re = None
147 para_re = None
144 space_re = None
148 space_re = None
145
149
146 def fill(text, width, initindent='', hangindent=''):
150 def fill(text, width, initindent='', hangindent=''):
147 '''fill many paragraphs with optional indentation.'''
151 '''fill many paragraphs with optional indentation.'''
148 global para_re, space_re
152 global para_re, space_re
149 if para_re is None:
153 if para_re is None:
150 para_re = re.compile('(\n\n|\n\\s*[-*]\\s*)', re.M)
154 para_re = re.compile('(\n\n|\n\\s*[-*]\\s*)', re.M)
151 space_re = re.compile(br' +')
155 space_re = re.compile(br' +')
152
156
153 def findparas():
157 def findparas():
154 start = 0
158 start = 0
155 while True:
159 while True:
156 m = para_re.search(text, start)
160 m = para_re.search(text, start)
157 if not m:
161 if not m:
158 uctext = encoding.unifromlocal(text[start:])
162 uctext = encoding.unifromlocal(text[start:])
159 w = len(uctext)
163 w = len(uctext)
160 while 0 < w and uctext[w - 1].isspace():
164 while 0 < w and uctext[w - 1].isspace():
161 w -= 1
165 w -= 1
162 yield (encoding.unitolocal(uctext[:w]),
166 yield (encoding.unitolocal(uctext[:w]),
163 encoding.unitolocal(uctext[w:]))
167 encoding.unitolocal(uctext[w:]))
164 break
168 break
165 yield text[start:m.start(0)], m.group(1)
169 yield text[start:m.start(0)], m.group(1)
166 start = m.end(1)
170 start = m.end(1)
167
171
168 return "".join([stringutil.wrap(space_re.sub(' ',
172 return "".join([stringutil.wrap(space_re.sub(' ',
169 stringutil.wrap(para, width)),
173 stringutil.wrap(para, width)),
170 width, initindent, hangindent) + rest
174 width, initindent, hangindent) + rest
171 for para, rest in findparas()])
175 for para, rest in findparas()])
172
176
173 @templatefilter('fill68', intype=bytes)
177 @templatefilter('fill68', intype=bytes)
174 def fill68(text):
178 def fill68(text):
175 """Any text. Wraps the text to fit in 68 columns."""
179 """Any text. Wraps the text to fit in 68 columns."""
176 return fill(text, 68)
180 return fill(text, 68)
177
181
178 @templatefilter('fill76', intype=bytes)
182 @templatefilter('fill76', intype=bytes)
179 def fill76(text):
183 def fill76(text):
180 """Any text. Wraps the text to fit in 76 columns."""
184 """Any text. Wraps the text to fit in 76 columns."""
181 return fill(text, 76)
185 return fill(text, 76)
182
186
183 @templatefilter('firstline', intype=bytes)
187 @templatefilter('firstline', intype=bytes)
184 def firstline(text):
188 def firstline(text):
185 """Any text. Returns the first line of text."""
189 """Any text. Returns the first line of text."""
186 try:
190 try:
187 return text.splitlines(True)[0].rstrip('\r\n')
191 return text.splitlines(True)[0].rstrip('\r\n')
188 except IndexError:
192 except IndexError:
189 return ''
193 return ''
190
194
191 @templatefilter('hex', intype=bytes)
195 @templatefilter('hex', intype=bytes)
192 def hexfilter(text):
196 def hexfilter(text):
193 """Any text. Convert a binary Mercurial node identifier into
197 """Any text. Convert a binary Mercurial node identifier into
194 its long hexadecimal representation.
198 its long hexadecimal representation.
195 """
199 """
196 return node.hex(text)
200 return node.hex(text)
197
201
198 @templatefilter('hgdate', intype=templateutil.date)
202 @templatefilter('hgdate', intype=templateutil.date)
199 def hgdate(text):
203 def hgdate(text):
200 """Date. Returns the date as a pair of numbers: "1157407993
204 """Date. Returns the date as a pair of numbers: "1157407993
201 25200" (Unix timestamp, timezone offset).
205 25200" (Unix timestamp, timezone offset).
202 """
206 """
203 return "%d %d" % text
207 return "%d %d" % text
204
208
205 @templatefilter('isodate', intype=templateutil.date)
209 @templatefilter('isodate', intype=templateutil.date)
206 def isodate(text):
210 def isodate(text):
207 """Date. Returns the date in ISO 8601 format: "2009-08-18 13:00
211 """Date. Returns the date in ISO 8601 format: "2009-08-18 13:00
208 +0200".
212 +0200".
209 """
213 """
210 return dateutil.datestr(text, '%Y-%m-%d %H:%M %1%2')
214 return dateutil.datestr(text, '%Y-%m-%d %H:%M %1%2')
211
215
212 @templatefilter('isodatesec', intype=templateutil.date)
216 @templatefilter('isodatesec', intype=templateutil.date)
213 def isodatesec(text):
217 def isodatesec(text):
214 """Date. Returns the date in ISO 8601 format, including
218 """Date. Returns the date in ISO 8601 format, including
215 seconds: "2009-08-18 13:00:13 +0200". See also the rfc3339date
219 seconds: "2009-08-18 13:00:13 +0200". See also the rfc3339date
216 filter.
220 filter.
217 """
221 """
218 return dateutil.datestr(text, '%Y-%m-%d %H:%M:%S %1%2')
222 return dateutil.datestr(text, '%Y-%m-%d %H:%M:%S %1%2')
219
223
220 def indent(text, prefix):
224 def indent(text, prefix):
221 '''indent each non-empty line of text after first with prefix.'''
225 '''indent each non-empty line of text after first with prefix.'''
222 lines = text.splitlines()
226 lines = text.splitlines()
223 num_lines = len(lines)
227 num_lines = len(lines)
224 endswithnewline = text[-1:] == '\n'
228 endswithnewline = text[-1:] == '\n'
225 def indenter():
229 def indenter():
226 for i in xrange(num_lines):
230 for i in xrange(num_lines):
227 l = lines[i]
231 l = lines[i]
228 if i and l.strip():
232 if i and l.strip():
229 yield prefix
233 yield prefix
230 yield l
234 yield l
231 if i < num_lines - 1 or endswithnewline:
235 if i < num_lines - 1 or endswithnewline:
232 yield '\n'
236 yield '\n'
233 return "".join(indenter())
237 return "".join(indenter())
234
238
235 @templatefilter('json')
239 @templatefilter('json')
236 def json(obj, paranoid=True):
240 def json(obj, paranoid=True):
237 if obj is None:
241 if obj is None:
238 return 'null'
242 return 'null'
239 elif obj is False:
243 elif obj is False:
240 return 'false'
244 return 'false'
241 elif obj is True:
245 elif obj is True:
242 return 'true'
246 return 'true'
243 elif isinstance(obj, (int, long, float)):
247 elif isinstance(obj, (int, long, float)):
244 return pycompat.bytestr(obj)
248 return pycompat.bytestr(obj)
245 elif isinstance(obj, bytes):
249 elif isinstance(obj, bytes):
246 return '"%s"' % encoding.jsonescape(obj, paranoid=paranoid)
250 return '"%s"' % encoding.jsonescape(obj, paranoid=paranoid)
247 elif isinstance(obj, str):
251 elif isinstance(obj, str):
248 # This branch is unreachable on Python 2, because bytes == str
252 # This branch is unreachable on Python 2, because bytes == str
249 # and we'll return in the next-earlier block in the elif
253 # and we'll return in the next-earlier block in the elif
250 # ladder. On Python 3, this helps us catch bugs before they
254 # ladder. On Python 3, this helps us catch bugs before they
251 # hurt someone.
255 # hurt someone.
252 raise error.ProgrammingError(
256 raise error.ProgrammingError(
253 'Mercurial only does output with bytes on Python 3: %r' % obj)
257 'Mercurial only does output with bytes on Python 3: %r' % obj)
254 elif util.safehasattr(obj, 'keys'):
258 elif util.safehasattr(obj, 'keys'):
255 out = ['"%s": %s' % (encoding.jsonescape(k, paranoid=paranoid),
259 out = ['"%s": %s' % (encoding.jsonescape(k, paranoid=paranoid),
256 json(v, paranoid))
260 json(v, paranoid))
257 for k, v in sorted(obj.iteritems())]
261 for k, v in sorted(obj.iteritems())]
258 return '{' + ', '.join(out) + '}'
262 return '{' + ', '.join(out) + '}'
259 elif util.safehasattr(obj, '__iter__'):
263 elif util.safehasattr(obj, '__iter__'):
260 out = [json(i, paranoid) for i in obj]
264 out = [json(i, paranoid) for i in obj]
261 return '[' + ', '.join(out) + ']'
265 return '[' + ', '.join(out) + ']'
262 else:
266 else:
263 raise TypeError('cannot encode type %s' % obj.__class__.__name__)
267 raise TypeError('cannot encode type %s' % obj.__class__.__name__)
264
268
265 @templatefilter('lower', intype=bytes)
269 @templatefilter('lower', intype=bytes)
266 def lower(text):
270 def lower(text):
267 """Any text. Converts the text to lowercase."""
271 """Any text. Converts the text to lowercase."""
268 return encoding.lower(text)
272 return encoding.lower(text)
269
273
270 @templatefilter('nonempty', intype=bytes)
274 @templatefilter('nonempty', intype=bytes)
271 def nonempty(text):
275 def nonempty(text):
272 """Any text. Returns '(none)' if the string is empty."""
276 """Any text. Returns '(none)' if the string is empty."""
273 return text or "(none)"
277 return text or "(none)"
274
278
275 @templatefilter('obfuscate', intype=bytes)
279 @templatefilter('obfuscate', intype=bytes)
276 def obfuscate(text):
280 def obfuscate(text):
277 """Any text. Returns the input text rendered as a sequence of
281 """Any text. Returns the input text rendered as a sequence of
278 XML entities.
282 XML entities.
279 """
283 """
280 text = unicode(text, pycompat.sysstr(encoding.encoding), r'replace')
284 text = unicode(text, pycompat.sysstr(encoding.encoding), r'replace')
281 return ''.join(['&#%d;' % ord(c) for c in text])
285 return ''.join(['&#%d;' % ord(c) for c in text])
282
286
283 @templatefilter('permissions', intype=bytes)
287 @templatefilter('permissions', intype=bytes)
284 def permissions(flags):
288 def permissions(flags):
285 if "l" in flags:
289 if "l" in flags:
286 return "lrwxrwxrwx"
290 return "lrwxrwxrwx"
287 if "x" in flags:
291 if "x" in flags:
288 return "-rwxr-xr-x"
292 return "-rwxr-xr-x"
289 return "-rw-r--r--"
293 return "-rw-r--r--"
290
294
291 @templatefilter('person', intype=bytes)
295 @templatefilter('person', intype=bytes)
292 def person(author):
296 def person(author):
293 """Any text. Returns the name before an email address,
297 """Any text. Returns the name before an email address,
294 interpreting it as per RFC 5322.
298 interpreting it as per RFC 5322.
295 """
299 """
296 return stringutil.person(author)
300 return stringutil.person(author)
297
301
298 @templatefilter('revescape', intype=bytes)
302 @templatefilter('revescape', intype=bytes)
299 def revescape(text):
303 def revescape(text):
300 """Any text. Escapes all "special" characters, except @.
304 """Any text. Escapes all "special" characters, except @.
301 Forward slashes are escaped twice to prevent web servers from prematurely
305 Forward slashes are escaped twice to prevent web servers from prematurely
302 unescaping them. For example, "@foo bar/baz" becomes "@foo%20bar%252Fbaz".
306 unescaping them. For example, "@foo bar/baz" becomes "@foo%20bar%252Fbaz".
303 """
307 """
304 return urlreq.quote(text, safe='/@').replace('/', '%252F')
308 return urlreq.quote(text, safe='/@').replace('/', '%252F')
305
309
306 @templatefilter('rfc3339date', intype=templateutil.date)
310 @templatefilter('rfc3339date', intype=templateutil.date)
307 def rfc3339date(text):
311 def rfc3339date(text):
308 """Date. Returns a date using the Internet date format
312 """Date. Returns a date using the Internet date format
309 specified in RFC 3339: "2009-08-18T13:00:13+02:00".
313 specified in RFC 3339: "2009-08-18T13:00:13+02:00".
310 """
314 """
311 return dateutil.datestr(text, "%Y-%m-%dT%H:%M:%S%1:%2")
315 return dateutil.datestr(text, "%Y-%m-%dT%H:%M:%S%1:%2")
312
316
313 @templatefilter('rfc822date', intype=templateutil.date)
317 @templatefilter('rfc822date', intype=templateutil.date)
314 def rfc822date(text):
318 def rfc822date(text):
315 """Date. Returns a date using the same format used in email
319 """Date. Returns a date using the same format used in email
316 headers: "Tue, 18 Aug 2009 13:00:13 +0200".
320 headers: "Tue, 18 Aug 2009 13:00:13 +0200".
317 """
321 """
318 return dateutil.datestr(text, "%a, %d %b %Y %H:%M:%S %1%2")
322 return dateutil.datestr(text, "%a, %d %b %Y %H:%M:%S %1%2")
319
323
320 @templatefilter('short', intype=bytes)
324 @templatefilter('short', intype=bytes)
321 def short(text):
325 def short(text):
322 """Changeset hash. Returns the short form of a changeset hash,
326 """Changeset hash. Returns the short form of a changeset hash,
323 i.e. a 12 hexadecimal digit string.
327 i.e. a 12 hexadecimal digit string.
324 """
328 """
325 return text[:12]
329 return text[:12]
326
330
327 @templatefilter('shortbisect', intype=bytes)
331 @templatefilter('shortbisect', intype=bytes)
328 def shortbisect(label):
332 def shortbisect(label):
329 """Any text. Treats `label` as a bisection status, and
333 """Any text. Treats `label` as a bisection status, and
330 returns a single-character representing the status (G: good, B: bad,
334 returns a single-character representing the status (G: good, B: bad,
331 S: skipped, U: untested, I: ignored). Returns single space if `text`
335 S: skipped, U: untested, I: ignored). Returns single space if `text`
332 is not a valid bisection status.
336 is not a valid bisection status.
333 """
337 """
334 if label:
338 if label:
335 return label[0:1].upper()
339 return label[0:1].upper()
336 return ' '
340 return ' '
337
341
338 @templatefilter('shortdate', intype=templateutil.date)
342 @templatefilter('shortdate', intype=templateutil.date)
339 def shortdate(text):
343 def shortdate(text):
340 """Date. Returns a date like "2006-09-18"."""
344 """Date. Returns a date like "2006-09-18"."""
341 return dateutil.shortdate(text)
345 return dateutil.shortdate(text)
342
346
343 @templatefilter('slashpath', intype=bytes)
347 @templatefilter('slashpath', intype=bytes)
344 def slashpath(path):
348 def slashpath(path):
345 """Any text. Replaces the native path separator with slash."""
349 """Any text. Replaces the native path separator with slash."""
346 return util.pconvert(path)
350 return util.pconvert(path)
347
351
348 @templatefilter('splitlines', intype=bytes)
352 @templatefilter('splitlines', intype=bytes)
349 def splitlines(text):
353 def splitlines(text):
350 """Any text. Split text into a list of lines."""
354 """Any text. Split text into a list of lines."""
351 return templateutil.hybridlist(text.splitlines(), name='line')
355 return templateutil.hybridlist(text.splitlines(), name='line')
352
356
353 @templatefilter('stringescape', intype=bytes)
357 @templatefilter('stringescape', intype=bytes)
354 def stringescape(text):
358 def stringescape(text):
355 return stringutil.escapestr(text)
359 return stringutil.escapestr(text)
356
360
357 @templatefilter('stringify', intype=bytes)
361 @templatefilter('stringify', intype=bytes)
358 def stringify(thing):
362 def stringify(thing):
359 """Any type. Turns the value into text by converting values into
363 """Any type. Turns the value into text by converting values into
360 text and concatenating them.
364 text and concatenating them.
361 """
365 """
362 return thing # coerced by the intype
366 return thing # coerced by the intype
363
367
364 @templatefilter('stripdir', intype=bytes)
368 @templatefilter('stripdir', intype=bytes)
365 def stripdir(text):
369 def stripdir(text):
366 """Treat the text as path and strip a directory level, if
370 """Treat the text as path and strip a directory level, if
367 possible. For example, "foo" and "foo/bar" becomes "foo".
371 possible. For example, "foo" and "foo/bar" becomes "foo".
368 """
372 """
369 dir = os.path.dirname(text)
373 dir = os.path.dirname(text)
370 if dir == "":
374 if dir == "":
371 return os.path.basename(text)
375 return os.path.basename(text)
372 else:
376 else:
373 return dir
377 return dir
374
378
375 @templatefilter('tabindent', intype=bytes)
379 @templatefilter('tabindent', intype=bytes)
376 def tabindent(text):
380 def tabindent(text):
377 """Any text. Returns the text, with every non-empty line
381 """Any text. Returns the text, with every non-empty line
378 except the first starting with a tab character.
382 except the first starting with a tab character.
379 """
383 """
380 return indent(text, '\t')
384 return indent(text, '\t')
381
385
382 @templatefilter('upper', intype=bytes)
386 @templatefilter('upper', intype=bytes)
383 def upper(text):
387 def upper(text):
384 """Any text. Converts the text to uppercase."""
388 """Any text. Converts the text to uppercase."""
385 return encoding.upper(text)
389 return encoding.upper(text)
386
390
387 @templatefilter('urlescape', intype=bytes)
391 @templatefilter('urlescape', intype=bytes)
388 def urlescape(text):
392 def urlescape(text):
389 """Any text. Escapes all "special" characters. For example,
393 """Any text. Escapes all "special" characters. For example,
390 "foo bar" becomes "foo%20bar".
394 "foo bar" becomes "foo%20bar".
391 """
395 """
392 return urlreq.quote(text)
396 return urlreq.quote(text)
393
397
394 @templatefilter('user', intype=bytes)
398 @templatefilter('user', intype=bytes)
395 def userfilter(text):
399 def userfilter(text):
396 """Any text. Returns a short representation of a user name or email
400 """Any text. Returns a short representation of a user name or email
397 address."""
401 address."""
398 return stringutil.shortuser(text)
402 return stringutil.shortuser(text)
399
403
400 @templatefilter('emailuser', intype=bytes)
404 @templatefilter('emailuser', intype=bytes)
401 def emailuser(text):
405 def emailuser(text):
402 """Any text. Returns the user portion of an email address."""
406 """Any text. Returns the user portion of an email address."""
403 return stringutil.emailuser(text)
407 return stringutil.emailuser(text)
404
408
405 @templatefilter('utf8', intype=bytes)
409 @templatefilter('utf8', intype=bytes)
406 def utf8(text):
410 def utf8(text):
407 """Any text. Converts from the local character encoding to UTF-8."""
411 """Any text. Converts from the local character encoding to UTF-8."""
408 return encoding.fromlocal(text)
412 return encoding.fromlocal(text)
409
413
410 @templatefilter('xmlescape', intype=bytes)
414 @templatefilter('xmlescape', intype=bytes)
411 def xmlescape(text):
415 def xmlescape(text):
412 text = (text
416 text = (text
413 .replace('&', '&amp;')
417 .replace('&', '&amp;')
414 .replace('<', '&lt;')
418 .replace('<', '&lt;')
415 .replace('>', '&gt;')
419 .replace('>', '&gt;')
416 .replace('"', '&quot;')
420 .replace('"', '&quot;')
417 .replace("'", '&#39;')) # &apos; invalid in HTML
421 .replace("'", '&#39;')) # &apos; invalid in HTML
418 return re.sub('[\x00-\x08\x0B\x0C\x0E-\x1F]', ' ', text)
422 return re.sub('[\x00-\x08\x0B\x0C\x0E-\x1F]', ' ', text)
419
423
420 def websub(text, websubtable):
424 def websub(text, websubtable):
421 """:websub: Any text. Only applies to hgweb. Applies the regular
425 """:websub: Any text. Only applies to hgweb. Applies the regular
422 expression replacements defined in the websub section.
426 expression replacements defined in the websub section.
423 """
427 """
424 if websubtable:
428 if websubtable:
425 for regexp, format in websubtable:
429 for regexp, format in websubtable:
426 text = regexp.sub(format, text)
430 text = regexp.sub(format, text)
427 return text
431 return text
428
432
429 def loadfilter(ui, extname, registrarobj):
433 def loadfilter(ui, extname, registrarobj):
430 """Load template filter from specified registrarobj
434 """Load template filter from specified registrarobj
431 """
435 """
432 for name, func in registrarobj._table.iteritems():
436 for name, func in registrarobj._table.iteritems():
433 filters[name] = func
437 filters[name] = func
434
438
435 # tell hggettext to extract docstrings from these functions:
439 # tell hggettext to extract docstrings from these functions:
436 i18nfunctions = filters.values()
440 i18nfunctions = filters.values()
@@ -1,4846 +1,4852 b''
1 $ hg init a
1 $ hg init a
2 $ cd a
2 $ cd a
3 $ echo a > a
3 $ echo a > a
4 $ hg add a
4 $ hg add a
5 $ echo line 1 > b
5 $ echo line 1 > b
6 $ echo line 2 >> b
6 $ echo line 2 >> b
7 $ hg commit -l b -d '1000000 0' -u 'User Name <user@hostname>'
7 $ hg commit -l b -d '1000000 0' -u 'User Name <user@hostname>'
8
8
9 $ hg add b
9 $ hg add b
10 $ echo other 1 > c
10 $ echo other 1 > c
11 $ echo other 2 >> c
11 $ echo other 2 >> c
12 $ echo >> c
12 $ echo >> c
13 $ echo other 3 >> c
13 $ echo other 3 >> c
14 $ hg commit -l c -d '1100000 0' -u 'A. N. Other <other@place>'
14 $ hg commit -l c -d '1100000 0' -u 'A. N. Other <other@place>'
15
15
16 $ hg add c
16 $ hg add c
17 $ hg commit -m 'no person' -d '1200000 0' -u 'other@place'
17 $ hg commit -m 'no person' -d '1200000 0' -u 'other@place'
18 $ echo c >> c
18 $ echo c >> c
19 $ hg commit -m 'no user, no domain' -d '1300000 0' -u 'person'
19 $ hg commit -m 'no user, no domain' -d '1300000 0' -u 'person'
20
20
21 $ echo foo > .hg/branch
21 $ echo foo > .hg/branch
22 $ hg commit -m 'new branch' -d '1400000 0' -u 'person'
22 $ hg commit -m 'new branch' -d '1400000 0' -u 'person'
23
23
24 $ hg co -q 3
24 $ hg co -q 3
25 $ echo other 4 >> d
25 $ echo other 4 >> d
26 $ hg add d
26 $ hg add d
27 $ hg commit -m 'new head' -d '1500000 0' -u 'person'
27 $ hg commit -m 'new head' -d '1500000 0' -u 'person'
28
28
29 $ hg merge -q foo
29 $ hg merge -q foo
30 $ hg commit -m 'merge' -d '1500001 0' -u 'person'
30 $ hg commit -m 'merge' -d '1500001 0' -u 'person'
31
31
32 Test arithmetic operators have the right precedence:
32 Test arithmetic operators have the right precedence:
33
33
34 $ hg log -l 1 -T '{date(date, "%Y") + 5 * 10} {date(date, "%Y") - 2 * 3}\n'
34 $ hg log -l 1 -T '{date(date, "%Y") + 5 * 10} {date(date, "%Y") - 2 * 3}\n'
35 2020 1964
35 2020 1964
36 $ hg log -l 1 -T '{date(date, "%Y") * 5 + 10} {date(date, "%Y") * 3 - 2}\n'
36 $ hg log -l 1 -T '{date(date, "%Y") * 5 + 10} {date(date, "%Y") * 3 - 2}\n'
37 9860 5908
37 9860 5908
38
38
39 Test division:
39 Test division:
40
40
41 $ hg debugtemplate -r0 -v '{5 / 2} {mod(5, 2)}\n'
41 $ hg debugtemplate -r0 -v '{5 / 2} {mod(5, 2)}\n'
42 (template
42 (template
43 (/
43 (/
44 (integer '5')
44 (integer '5')
45 (integer '2'))
45 (integer '2'))
46 (string ' ')
46 (string ' ')
47 (func
47 (func
48 (symbol 'mod')
48 (symbol 'mod')
49 (list
49 (list
50 (integer '5')
50 (integer '5')
51 (integer '2')))
51 (integer '2')))
52 (string '\n'))
52 (string '\n'))
53 2 1
53 2 1
54 $ hg debugtemplate -r0 -v '{5 / -2} {mod(5, -2)}\n'
54 $ hg debugtemplate -r0 -v '{5 / -2} {mod(5, -2)}\n'
55 (template
55 (template
56 (/
56 (/
57 (integer '5')
57 (integer '5')
58 (negate
58 (negate
59 (integer '2')))
59 (integer '2')))
60 (string ' ')
60 (string ' ')
61 (func
61 (func
62 (symbol 'mod')
62 (symbol 'mod')
63 (list
63 (list
64 (integer '5')
64 (integer '5')
65 (negate
65 (negate
66 (integer '2'))))
66 (integer '2'))))
67 (string '\n'))
67 (string '\n'))
68 -3 -1
68 -3 -1
69 $ hg debugtemplate -r0 -v '{-5 / 2} {mod(-5, 2)}\n'
69 $ hg debugtemplate -r0 -v '{-5 / 2} {mod(-5, 2)}\n'
70 (template
70 (template
71 (/
71 (/
72 (negate
72 (negate
73 (integer '5'))
73 (integer '5'))
74 (integer '2'))
74 (integer '2'))
75 (string ' ')
75 (string ' ')
76 (func
76 (func
77 (symbol 'mod')
77 (symbol 'mod')
78 (list
78 (list
79 (negate
79 (negate
80 (integer '5'))
80 (integer '5'))
81 (integer '2')))
81 (integer '2')))
82 (string '\n'))
82 (string '\n'))
83 -3 1
83 -3 1
84 $ hg debugtemplate -r0 -v '{-5 / -2} {mod(-5, -2)}\n'
84 $ hg debugtemplate -r0 -v '{-5 / -2} {mod(-5, -2)}\n'
85 (template
85 (template
86 (/
86 (/
87 (negate
87 (negate
88 (integer '5'))
88 (integer '5'))
89 (negate
89 (negate
90 (integer '2')))
90 (integer '2')))
91 (string ' ')
91 (string ' ')
92 (func
92 (func
93 (symbol 'mod')
93 (symbol 'mod')
94 (list
94 (list
95 (negate
95 (negate
96 (integer '5'))
96 (integer '5'))
97 (negate
97 (negate
98 (integer '2'))))
98 (integer '2'))))
99 (string '\n'))
99 (string '\n'))
100 2 -1
100 2 -1
101
101
102 Filters bind closer than arithmetic:
102 Filters bind closer than arithmetic:
103
103
104 $ hg debugtemplate -r0 -v '{revset(".")|count - 1}\n'
104 $ hg debugtemplate -r0 -v '{revset(".")|count - 1}\n'
105 (template
105 (template
106 (-
106 (-
107 (|
107 (|
108 (func
108 (func
109 (symbol 'revset')
109 (symbol 'revset')
110 (string '.'))
110 (string '.'))
111 (symbol 'count'))
111 (symbol 'count'))
112 (integer '1'))
112 (integer '1'))
113 (string '\n'))
113 (string '\n'))
114 0
114 0
115
115
116 But negate binds closer still:
116 But negate binds closer still:
117
117
118 $ hg debugtemplate -r0 -v '{1-3|stringify}\n'
118 $ hg debugtemplate -r0 -v '{1-3|stringify}\n'
119 (template
119 (template
120 (-
120 (-
121 (integer '1')
121 (integer '1')
122 (|
122 (|
123 (integer '3')
123 (integer '3')
124 (symbol 'stringify')))
124 (symbol 'stringify')))
125 (string '\n'))
125 (string '\n'))
126 hg: parse error: arithmetic only defined on integers
126 hg: parse error: arithmetic only defined on integers
127 [255]
127 [255]
128 $ hg debugtemplate -r0 -v '{-3|stringify}\n'
128 $ hg debugtemplate -r0 -v '{-3|stringify}\n'
129 (template
129 (template
130 (|
130 (|
131 (negate
131 (negate
132 (integer '3'))
132 (integer '3'))
133 (symbol 'stringify'))
133 (symbol 'stringify'))
134 (string '\n'))
134 (string '\n'))
135 -3
135 -3
136
136
137 Filters bind as close as map operator:
137 Filters bind as close as map operator:
138
138
139 $ hg debugtemplate -r0 -v '{desc|splitlines % "{line}\n"}'
139 $ hg debugtemplate -r0 -v '{desc|splitlines % "{line}\n"}'
140 (template
140 (template
141 (%
141 (%
142 (|
142 (|
143 (symbol 'desc')
143 (symbol 'desc')
144 (symbol 'splitlines'))
144 (symbol 'splitlines'))
145 (template
145 (template
146 (symbol 'line')
146 (symbol 'line')
147 (string '\n'))))
147 (string '\n'))))
148 line 1
148 line 1
149 line 2
149 line 2
150
150
151 Keyword arguments:
151 Keyword arguments:
152
152
153 $ hg debugtemplate -r0 -v '{foo=bar|baz}'
153 $ hg debugtemplate -r0 -v '{foo=bar|baz}'
154 (template
154 (template
155 (keyvalue
155 (keyvalue
156 (symbol 'foo')
156 (symbol 'foo')
157 (|
157 (|
158 (symbol 'bar')
158 (symbol 'bar')
159 (symbol 'baz'))))
159 (symbol 'baz'))))
160 hg: parse error: can't use a key-value pair in this context
160 hg: parse error: can't use a key-value pair in this context
161 [255]
161 [255]
162
162
163 $ hg debugtemplate '{pad("foo", width=10, left=true)}\n'
163 $ hg debugtemplate '{pad("foo", width=10, left=true)}\n'
164 foo
164 foo
165
165
166 Call function which takes named arguments by filter syntax:
166 Call function which takes named arguments by filter syntax:
167
167
168 $ hg debugtemplate '{" "|separate}'
168 $ hg debugtemplate '{" "|separate}'
169 $ hg debugtemplate '{("not", "an", "argument", "list")|separate}'
169 $ hg debugtemplate '{("not", "an", "argument", "list")|separate}'
170 hg: parse error: unknown method 'list'
170 hg: parse error: unknown method 'list'
171 [255]
171 [255]
172
172
173 Second branch starting at nullrev:
173 Second branch starting at nullrev:
174
174
175 $ hg update null
175 $ hg update null
176 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
176 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
177 $ echo second > second
177 $ echo second > second
178 $ hg add second
178 $ hg add second
179 $ hg commit -m second -d '1000000 0' -u 'User Name <user@hostname>'
179 $ hg commit -m second -d '1000000 0' -u 'User Name <user@hostname>'
180 created new head
180 created new head
181
181
182 $ echo third > third
182 $ echo third > third
183 $ hg add third
183 $ hg add third
184 $ hg mv second fourth
184 $ hg mv second fourth
185 $ hg commit -m third -d "2020-01-01 10:01"
185 $ hg commit -m third -d "2020-01-01 10:01"
186
186
187 $ hg log --template '{join(file_copies, ",\n")}\n' -r .
187 $ hg log --template '{join(file_copies, ",\n")}\n' -r .
188 fourth (second)
188 fourth (second)
189 $ hg log -T '{file_copies % "{source} -> {name}\n"}' -r .
189 $ hg log -T '{file_copies % "{source} -> {name}\n"}' -r .
190 second -> fourth
190 second -> fourth
191 $ hg log -T '{rev} {ifcontains("fourth", file_copies, "t", "f")}\n' -r .:7
191 $ hg log -T '{rev} {ifcontains("fourth", file_copies, "t", "f")}\n' -r .:7
192 8 t
192 8 t
193 7 f
193 7 f
194
194
195 Working-directory revision has special identifiers, though they are still
195 Working-directory revision has special identifiers, though they are still
196 experimental:
196 experimental:
197
197
198 $ hg log -r 'wdir()' -T '{rev}:{node}\n'
198 $ hg log -r 'wdir()' -T '{rev}:{node}\n'
199 2147483647:ffffffffffffffffffffffffffffffffffffffff
199 2147483647:ffffffffffffffffffffffffffffffffffffffff
200
200
201 Some keywords are invalid for working-directory revision, but they should
201 Some keywords are invalid for working-directory revision, but they should
202 never cause crash:
202 never cause crash:
203
203
204 $ hg log -r 'wdir()' -T '{manifest}\n'
204 $ hg log -r 'wdir()' -T '{manifest}\n'
205
205
206
206
207 Internal resources shouldn't be exposed (issue5699):
207 Internal resources shouldn't be exposed (issue5699):
208
208
209 $ hg log -r. -T '{cache}{ctx}{repo}{revcache}{templ}{ui}'
209 $ hg log -r. -T '{cache}{ctx}{repo}{revcache}{templ}{ui}'
210
210
211 Never crash on internal resource not available:
211 Never crash on internal resource not available:
212
212
213 $ hg --cwd .. debugtemplate '{"c0bebeef"|shortest}\n'
213 $ hg --cwd .. debugtemplate '{"c0bebeef"|shortest}\n'
214 abort: template resource not available: ctx
214 abort: template resource not available: ctx
215 [255]
215 [255]
216
216
217 $ hg config -T '{author}'
217 $ hg config -T '{author}'
218
218
219 Quoting for ui.logtemplate
219 Quoting for ui.logtemplate
220
220
221 $ hg tip --config "ui.logtemplate={rev}\n"
221 $ hg tip --config "ui.logtemplate={rev}\n"
222 8
222 8
223 $ hg tip --config "ui.logtemplate='{rev}\n'"
223 $ hg tip --config "ui.logtemplate='{rev}\n'"
224 8
224 8
225 $ hg tip --config 'ui.logtemplate="{rev}\n"'
225 $ hg tip --config 'ui.logtemplate="{rev}\n"'
226 8
226 8
227 $ hg tip --config 'ui.logtemplate=n{rev}\n'
227 $ hg tip --config 'ui.logtemplate=n{rev}\n'
228 n8
228 n8
229
229
230 Make sure user/global hgrc does not affect tests
230 Make sure user/global hgrc does not affect tests
231
231
232 $ echo '[ui]' > .hg/hgrc
232 $ echo '[ui]' > .hg/hgrc
233 $ echo 'logtemplate =' >> .hg/hgrc
233 $ echo 'logtemplate =' >> .hg/hgrc
234 $ echo 'style =' >> .hg/hgrc
234 $ echo 'style =' >> .hg/hgrc
235
235
236 Add some simple styles to settings
236 Add some simple styles to settings
237
237
238 $ cat <<'EOF' >> .hg/hgrc
238 $ cat <<'EOF' >> .hg/hgrc
239 > [templates]
239 > [templates]
240 > simple = "{rev}\n"
240 > simple = "{rev}\n"
241 > simple2 = {rev}\n
241 > simple2 = {rev}\n
242 > rev = "should not precede {rev} keyword\n"
242 > rev = "should not precede {rev} keyword\n"
243 > EOF
243 > EOF
244
244
245 $ hg log -l1 -Tsimple
245 $ hg log -l1 -Tsimple
246 8
246 8
247 $ hg log -l1 -Tsimple2
247 $ hg log -l1 -Tsimple2
248 8
248 8
249 $ hg log -l1 -Trev
249 $ hg log -l1 -Trev
250 should not precede 8 keyword
250 should not precede 8 keyword
251 $ hg log -l1 -T '{simple}'
251 $ hg log -l1 -T '{simple}'
252 8
252 8
253
253
254 Map file shouldn't see user templates:
254 Map file shouldn't see user templates:
255
255
256 $ cat <<EOF > tmpl
256 $ cat <<EOF > tmpl
257 > changeset = 'nothing expanded:{simple}\n'
257 > changeset = 'nothing expanded:{simple}\n'
258 > EOF
258 > EOF
259 $ hg log -l1 --style ./tmpl
259 $ hg log -l1 --style ./tmpl
260 nothing expanded:
260 nothing expanded:
261
261
262 Test templates and style maps in files:
262 Test templates and style maps in files:
263
263
264 $ echo "{rev}" > tmpl
264 $ echo "{rev}" > tmpl
265 $ hg log -l1 -T./tmpl
265 $ hg log -l1 -T./tmpl
266 8
266 8
267 $ hg log -l1 -Tblah/blah
267 $ hg log -l1 -Tblah/blah
268 blah/blah (no-eol)
268 blah/blah (no-eol)
269
269
270 $ printf 'changeset = "{rev}\\n"\n' > map-simple
270 $ printf 'changeset = "{rev}\\n"\n' > map-simple
271 $ hg log -l1 -T./map-simple
271 $ hg log -l1 -T./map-simple
272 8
272 8
273
273
274 a map file may have [templates] and [templatealias] sections:
274 a map file may have [templates] and [templatealias] sections:
275
275
276 $ cat <<'EOF' > map-simple
276 $ cat <<'EOF' > map-simple
277 > [templates]
277 > [templates]
278 > changeset = "{a}\n"
278 > changeset = "{a}\n"
279 > [templatealias]
279 > [templatealias]
280 > a = rev
280 > a = rev
281 > EOF
281 > EOF
282 $ hg log -l1 -T./map-simple
282 $ hg log -l1 -T./map-simple
283 8
283 8
284
284
285 so it can be included in hgrc
285 so it can be included in hgrc
286
286
287 $ cat <<'EOF' > myhgrc
287 $ cat <<'EOF' > myhgrc
288 > %include map-simple
288 > %include map-simple
289 > [templates]
289 > [templates]
290 > foo = "{changeset}"
290 > foo = "{changeset}"
291 > EOF
291 > EOF
292 $ HGRCPATH=./myhgrc hg log -l1 -Tfoo
292 $ HGRCPATH=./myhgrc hg log -l1 -Tfoo
293 8
293 8
294 $ HGRCPATH=./myhgrc hg log -l1 -T'{a}\n'
294 $ HGRCPATH=./myhgrc hg log -l1 -T'{a}\n'
295 8
295 8
296
296
297 Test template map inheritance
297 Test template map inheritance
298
298
299 $ echo "__base__ = map-cmdline.default" > map-simple
299 $ echo "__base__ = map-cmdline.default" > map-simple
300 $ printf 'cset = "changeset: ***{rev}***\\n"\n' >> map-simple
300 $ printf 'cset = "changeset: ***{rev}***\\n"\n' >> map-simple
301 $ hg log -l1 -T./map-simple
301 $ hg log -l1 -T./map-simple
302 changeset: ***8***
302 changeset: ***8***
303 tag: tip
303 tag: tip
304 user: test
304 user: test
305 date: Wed Jan 01 10:01:00 2020 +0000
305 date: Wed Jan 01 10:01:00 2020 +0000
306 summary: third
306 summary: third
307
307
308
308
309 Test docheader, docfooter and separator in template map
309 Test docheader, docfooter and separator in template map
310
310
311 $ cat <<'EOF' > map-myjson
311 $ cat <<'EOF' > map-myjson
312 > docheader = '\{\n'
312 > docheader = '\{\n'
313 > docfooter = '\n}\n'
313 > docfooter = '\n}\n'
314 > separator = ',\n'
314 > separator = ',\n'
315 > changeset = ' {dict(rev, node|short)|json}'
315 > changeset = ' {dict(rev, node|short)|json}'
316 > EOF
316 > EOF
317 $ hg log -l2 -T./map-myjson
317 $ hg log -l2 -T./map-myjson
318 {
318 {
319 {"node": "95c24699272e", "rev": 8},
319 {"node": "95c24699272e", "rev": 8},
320 {"node": "29114dbae42b", "rev": 7}
320 {"node": "29114dbae42b", "rev": 7}
321 }
321 }
322
322
323 Test docheader, docfooter and separator in [templates] section
323 Test docheader, docfooter and separator in [templates] section
324
324
325 $ cat <<'EOF' >> .hg/hgrc
325 $ cat <<'EOF' >> .hg/hgrc
326 > [templates]
326 > [templates]
327 > myjson = ' {dict(rev, node|short)|json}'
327 > myjson = ' {dict(rev, node|short)|json}'
328 > myjson:docheader = '\{\n'
328 > myjson:docheader = '\{\n'
329 > myjson:docfooter = '\n}\n'
329 > myjson:docfooter = '\n}\n'
330 > myjson:separator = ',\n'
330 > myjson:separator = ',\n'
331 > :docheader = 'should not be selected as a docheader for literal templates\n'
331 > :docheader = 'should not be selected as a docheader for literal templates\n'
332 > EOF
332 > EOF
333 $ hg log -l2 -Tmyjson
333 $ hg log -l2 -Tmyjson
334 {
334 {
335 {"node": "95c24699272e", "rev": 8},
335 {"node": "95c24699272e", "rev": 8},
336 {"node": "29114dbae42b", "rev": 7}
336 {"node": "29114dbae42b", "rev": 7}
337 }
337 }
338 $ hg log -l1 -T'{rev}\n'
338 $ hg log -l1 -T'{rev}\n'
339 8
339 8
340
340
341 Template should precede style option
341 Template should precede style option
342
342
343 $ hg log -l1 --style default -T '{rev}\n'
343 $ hg log -l1 --style default -T '{rev}\n'
344 8
344 8
345
345
346 Add a commit with empty description, to ensure that the templates
346 Add a commit with empty description, to ensure that the templates
347 below will omit the description line.
347 below will omit the description line.
348
348
349 $ echo c >> c
349 $ echo c >> c
350 $ hg add c
350 $ hg add c
351 $ hg commit -qm ' '
351 $ hg commit -qm ' '
352
352
353 Default style is like normal output. Phases style should be the same
353 Default style is like normal output. Phases style should be the same
354 as default style, except for extra phase lines.
354 as default style, except for extra phase lines.
355
355
356 $ hg log > log.out
356 $ hg log > log.out
357 $ hg log --style default > style.out
357 $ hg log --style default > style.out
358 $ cmp log.out style.out || diff -u log.out style.out
358 $ cmp log.out style.out || diff -u log.out style.out
359 $ hg log -T phases > phases.out
359 $ hg log -T phases > phases.out
360 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
360 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
361 +phase: draft
361 +phase: draft
362 +phase: draft
362 +phase: draft
363 +phase: draft
363 +phase: draft
364 +phase: draft
364 +phase: draft
365 +phase: draft
365 +phase: draft
366 +phase: draft
366 +phase: draft
367 +phase: draft
367 +phase: draft
368 +phase: draft
368 +phase: draft
369 +phase: draft
369 +phase: draft
370 +phase: draft
370 +phase: draft
371
371
372 $ hg log -v > log.out
372 $ hg log -v > log.out
373 $ hg log -v --style default > style.out
373 $ hg log -v --style default > style.out
374 $ cmp log.out style.out || diff -u log.out style.out
374 $ cmp log.out style.out || diff -u log.out style.out
375 $ hg log -v -T phases > phases.out
375 $ hg log -v -T phases > phases.out
376 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
376 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
377 +phase: draft
377 +phase: draft
378 +phase: draft
378 +phase: draft
379 +phase: draft
379 +phase: draft
380 +phase: draft
380 +phase: draft
381 +phase: draft
381 +phase: draft
382 +phase: draft
382 +phase: draft
383 +phase: draft
383 +phase: draft
384 +phase: draft
384 +phase: draft
385 +phase: draft
385 +phase: draft
386 +phase: draft
386 +phase: draft
387
387
388 $ hg log -q > log.out
388 $ hg log -q > log.out
389 $ hg log -q --style default > style.out
389 $ hg log -q --style default > style.out
390 $ cmp log.out style.out || diff -u log.out style.out
390 $ cmp log.out style.out || diff -u log.out style.out
391 $ hg log -q -T phases > phases.out
391 $ hg log -q -T phases > phases.out
392 $ cmp log.out phases.out || diff -u log.out phases.out
392 $ cmp log.out phases.out || diff -u log.out phases.out
393
393
394 $ hg log --debug > log.out
394 $ hg log --debug > log.out
395 $ hg log --debug --style default > style.out
395 $ hg log --debug --style default > style.out
396 $ cmp log.out style.out || diff -u log.out style.out
396 $ cmp log.out style.out || diff -u log.out style.out
397 $ hg log --debug -T phases > phases.out
397 $ hg log --debug -T phases > phases.out
398 $ cmp log.out phases.out || diff -u log.out phases.out
398 $ cmp log.out phases.out || diff -u log.out phases.out
399
399
400 Default style of working-directory revision should also be the same (but
400 Default style of working-directory revision should also be the same (but
401 date may change while running tests):
401 date may change while running tests):
402
402
403 $ hg log -r 'wdir()' | sed 's|^date:.*|date:|' > log.out
403 $ hg log -r 'wdir()' | sed 's|^date:.*|date:|' > log.out
404 $ hg log -r 'wdir()' --style default | sed 's|^date:.*|date:|' > style.out
404 $ hg log -r 'wdir()' --style default | sed 's|^date:.*|date:|' > style.out
405 $ cmp log.out style.out || diff -u log.out style.out
405 $ cmp log.out style.out || diff -u log.out style.out
406
406
407 $ hg log -r 'wdir()' -v | sed 's|^date:.*|date:|' > log.out
407 $ hg log -r 'wdir()' -v | sed 's|^date:.*|date:|' > log.out
408 $ hg log -r 'wdir()' -v --style default | sed 's|^date:.*|date:|' > style.out
408 $ hg log -r 'wdir()' -v --style default | sed 's|^date:.*|date:|' > style.out
409 $ cmp log.out style.out || diff -u log.out style.out
409 $ cmp log.out style.out || diff -u log.out style.out
410
410
411 $ hg log -r 'wdir()' -q > log.out
411 $ hg log -r 'wdir()' -q > log.out
412 $ hg log -r 'wdir()' -q --style default > style.out
412 $ hg log -r 'wdir()' -q --style default > style.out
413 $ cmp log.out style.out || diff -u log.out style.out
413 $ cmp log.out style.out || diff -u log.out style.out
414
414
415 $ hg log -r 'wdir()' --debug | sed 's|^date:.*|date:|' > log.out
415 $ hg log -r 'wdir()' --debug | sed 's|^date:.*|date:|' > log.out
416 $ hg log -r 'wdir()' --debug --style default \
416 $ hg log -r 'wdir()' --debug --style default \
417 > | sed 's|^date:.*|date:|' > style.out
417 > | sed 's|^date:.*|date:|' > style.out
418 $ cmp log.out style.out || diff -u log.out style.out
418 $ cmp log.out style.out || diff -u log.out style.out
419
419
420 Default style should also preserve color information (issue2866):
420 Default style should also preserve color information (issue2866):
421
421
422 $ cp $HGRCPATH $HGRCPATH-bak
422 $ cp $HGRCPATH $HGRCPATH-bak
423 $ cat <<EOF >> $HGRCPATH
423 $ cat <<EOF >> $HGRCPATH
424 > [extensions]
424 > [extensions]
425 > color=
425 > color=
426 > EOF
426 > EOF
427
427
428 $ hg --color=debug log > log.out
428 $ hg --color=debug log > log.out
429 $ hg --color=debug log --style default > style.out
429 $ hg --color=debug log --style default > style.out
430 $ cmp log.out style.out || diff -u log.out style.out
430 $ cmp log.out style.out || diff -u log.out style.out
431 $ hg --color=debug log -T phases > phases.out
431 $ hg --color=debug log -T phases > phases.out
432 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
432 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
433 +[log.phase|phase: draft]
433 +[log.phase|phase: draft]
434 +[log.phase|phase: draft]
434 +[log.phase|phase: draft]
435 +[log.phase|phase: draft]
435 +[log.phase|phase: draft]
436 +[log.phase|phase: draft]
436 +[log.phase|phase: draft]
437 +[log.phase|phase: draft]
437 +[log.phase|phase: draft]
438 +[log.phase|phase: draft]
438 +[log.phase|phase: draft]
439 +[log.phase|phase: draft]
439 +[log.phase|phase: draft]
440 +[log.phase|phase: draft]
440 +[log.phase|phase: draft]
441 +[log.phase|phase: draft]
441 +[log.phase|phase: draft]
442 +[log.phase|phase: draft]
442 +[log.phase|phase: draft]
443
443
444 $ hg --color=debug -v log > log.out
444 $ hg --color=debug -v log > log.out
445 $ hg --color=debug -v log --style default > style.out
445 $ hg --color=debug -v log --style default > style.out
446 $ cmp log.out style.out || diff -u log.out style.out
446 $ cmp log.out style.out || diff -u log.out style.out
447 $ hg --color=debug -v log -T phases > phases.out
447 $ hg --color=debug -v log -T phases > phases.out
448 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
448 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
449 +[log.phase|phase: draft]
449 +[log.phase|phase: draft]
450 +[log.phase|phase: draft]
450 +[log.phase|phase: draft]
451 +[log.phase|phase: draft]
451 +[log.phase|phase: draft]
452 +[log.phase|phase: draft]
452 +[log.phase|phase: draft]
453 +[log.phase|phase: draft]
453 +[log.phase|phase: draft]
454 +[log.phase|phase: draft]
454 +[log.phase|phase: draft]
455 +[log.phase|phase: draft]
455 +[log.phase|phase: draft]
456 +[log.phase|phase: draft]
456 +[log.phase|phase: draft]
457 +[log.phase|phase: draft]
457 +[log.phase|phase: draft]
458 +[log.phase|phase: draft]
458 +[log.phase|phase: draft]
459
459
460 $ hg --color=debug -q log > log.out
460 $ hg --color=debug -q log > log.out
461 $ hg --color=debug -q log --style default > style.out
461 $ hg --color=debug -q log --style default > style.out
462 $ cmp log.out style.out || diff -u log.out style.out
462 $ cmp log.out style.out || diff -u log.out style.out
463 $ hg --color=debug -q log -T phases > phases.out
463 $ hg --color=debug -q log -T phases > phases.out
464 $ cmp log.out phases.out || diff -u log.out phases.out
464 $ cmp log.out phases.out || diff -u log.out phases.out
465
465
466 $ hg --color=debug --debug log > log.out
466 $ hg --color=debug --debug log > log.out
467 $ hg --color=debug --debug log --style default > style.out
467 $ hg --color=debug --debug log --style default > style.out
468 $ cmp log.out style.out || diff -u log.out style.out
468 $ cmp log.out style.out || diff -u log.out style.out
469 $ hg --color=debug --debug log -T phases > phases.out
469 $ hg --color=debug --debug log -T phases > phases.out
470 $ cmp log.out phases.out || diff -u log.out phases.out
470 $ cmp log.out phases.out || diff -u log.out phases.out
471
471
472 $ mv $HGRCPATH-bak $HGRCPATH
472 $ mv $HGRCPATH-bak $HGRCPATH
473
473
474 Remove commit with empty commit message, so as to not pollute further
474 Remove commit with empty commit message, so as to not pollute further
475 tests.
475 tests.
476
476
477 $ hg --config extensions.strip= strip -q .
477 $ hg --config extensions.strip= strip -q .
478
478
479 Revision with no copies (used to print a traceback):
479 Revision with no copies (used to print a traceback):
480
480
481 $ hg tip -v --template '\n'
481 $ hg tip -v --template '\n'
482
482
483
483
484 Compact style works:
484 Compact style works:
485
485
486 $ hg log -Tcompact
486 $ hg log -Tcompact
487 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
487 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
488 third
488 third
489
489
490 7:-1 29114dbae42b 1970-01-12 13:46 +0000 user
490 7:-1 29114dbae42b 1970-01-12 13:46 +0000 user
491 second
491 second
492
492
493 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
493 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
494 merge
494 merge
495
495
496 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
496 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
497 new head
497 new head
498
498
499 4 bbe44766e73d 1970-01-17 04:53 +0000 person
499 4 bbe44766e73d 1970-01-17 04:53 +0000 person
500 new branch
500 new branch
501
501
502 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
502 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
503 no user, no domain
503 no user, no domain
504
504
505 2 97054abb4ab8 1970-01-14 21:20 +0000 other
505 2 97054abb4ab8 1970-01-14 21:20 +0000 other
506 no person
506 no person
507
507
508 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
508 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
509 other 1
509 other 1
510
510
511 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
511 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
512 line 1
512 line 1
513
513
514
514
515 $ hg log -v --style compact
515 $ hg log -v --style compact
516 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
516 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
517 third
517 third
518
518
519 7:-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
519 7:-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
520 second
520 second
521
521
522 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
522 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
523 merge
523 merge
524
524
525 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
525 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
526 new head
526 new head
527
527
528 4 bbe44766e73d 1970-01-17 04:53 +0000 person
528 4 bbe44766e73d 1970-01-17 04:53 +0000 person
529 new branch
529 new branch
530
530
531 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
531 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
532 no user, no domain
532 no user, no domain
533
533
534 2 97054abb4ab8 1970-01-14 21:20 +0000 other@place
534 2 97054abb4ab8 1970-01-14 21:20 +0000 other@place
535 no person
535 no person
536
536
537 1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
537 1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
538 other 1
538 other 1
539 other 2
539 other 2
540
540
541 other 3
541 other 3
542
542
543 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
543 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
544 line 1
544 line 1
545 line 2
545 line 2
546
546
547
547
548 $ hg log --debug --style compact
548 $ hg log --debug --style compact
549 8[tip]:7,-1 95c24699272e 2020-01-01 10:01 +0000 test
549 8[tip]:7,-1 95c24699272e 2020-01-01 10:01 +0000 test
550 third
550 third
551
551
552 7:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
552 7:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
553 second
553 second
554
554
555 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
555 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
556 merge
556 merge
557
557
558 5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
558 5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
559 new head
559 new head
560
560
561 4:3,-1 bbe44766e73d 1970-01-17 04:53 +0000 person
561 4:3,-1 bbe44766e73d 1970-01-17 04:53 +0000 person
562 new branch
562 new branch
563
563
564 3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
564 3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
565 no user, no domain
565 no user, no domain
566
566
567 2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other@place
567 2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other@place
568 no person
568 no person
569
569
570 1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
570 1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
571 other 1
571 other 1
572 other 2
572 other 2
573
573
574 other 3
574 other 3
575
575
576 0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
576 0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
577 line 1
577 line 1
578 line 2
578 line 2
579
579
580
580
581 Test xml styles:
581 Test xml styles:
582
582
583 $ hg log --style xml -r 'not all()'
583 $ hg log --style xml -r 'not all()'
584 <?xml version="1.0"?>
584 <?xml version="1.0"?>
585 <log>
585 <log>
586 </log>
586 </log>
587
587
588 $ hg log --style xml
588 $ hg log --style xml
589 <?xml version="1.0"?>
589 <?xml version="1.0"?>
590 <log>
590 <log>
591 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
591 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
592 <tag>tip</tag>
592 <tag>tip</tag>
593 <author email="test">test</author>
593 <author email="test">test</author>
594 <date>2020-01-01T10:01:00+00:00</date>
594 <date>2020-01-01T10:01:00+00:00</date>
595 <msg xml:space="preserve">third</msg>
595 <msg xml:space="preserve">third</msg>
596 </logentry>
596 </logentry>
597 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
597 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
598 <parent revision="-1" node="0000000000000000000000000000000000000000" />
598 <parent revision="-1" node="0000000000000000000000000000000000000000" />
599 <author email="user@hostname">User Name</author>
599 <author email="user@hostname">User Name</author>
600 <date>1970-01-12T13:46:40+00:00</date>
600 <date>1970-01-12T13:46:40+00:00</date>
601 <msg xml:space="preserve">second</msg>
601 <msg xml:space="preserve">second</msg>
602 </logentry>
602 </logentry>
603 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
603 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
604 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
604 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
605 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
605 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
606 <author email="person">person</author>
606 <author email="person">person</author>
607 <date>1970-01-18T08:40:01+00:00</date>
607 <date>1970-01-18T08:40:01+00:00</date>
608 <msg xml:space="preserve">merge</msg>
608 <msg xml:space="preserve">merge</msg>
609 </logentry>
609 </logentry>
610 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
610 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
611 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
611 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
612 <author email="person">person</author>
612 <author email="person">person</author>
613 <date>1970-01-18T08:40:00+00:00</date>
613 <date>1970-01-18T08:40:00+00:00</date>
614 <msg xml:space="preserve">new head</msg>
614 <msg xml:space="preserve">new head</msg>
615 </logentry>
615 </logentry>
616 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
616 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
617 <branch>foo</branch>
617 <branch>foo</branch>
618 <author email="person">person</author>
618 <author email="person">person</author>
619 <date>1970-01-17T04:53:20+00:00</date>
619 <date>1970-01-17T04:53:20+00:00</date>
620 <msg xml:space="preserve">new branch</msg>
620 <msg xml:space="preserve">new branch</msg>
621 </logentry>
621 </logentry>
622 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
622 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
623 <author email="person">person</author>
623 <author email="person">person</author>
624 <date>1970-01-16T01:06:40+00:00</date>
624 <date>1970-01-16T01:06:40+00:00</date>
625 <msg xml:space="preserve">no user, no domain</msg>
625 <msg xml:space="preserve">no user, no domain</msg>
626 </logentry>
626 </logentry>
627 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
627 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
628 <author email="other@place">other</author>
628 <author email="other@place">other</author>
629 <date>1970-01-14T21:20:00+00:00</date>
629 <date>1970-01-14T21:20:00+00:00</date>
630 <msg xml:space="preserve">no person</msg>
630 <msg xml:space="preserve">no person</msg>
631 </logentry>
631 </logentry>
632 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
632 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
633 <author email="other@place">A. N. Other</author>
633 <author email="other@place">A. N. Other</author>
634 <date>1970-01-13T17:33:20+00:00</date>
634 <date>1970-01-13T17:33:20+00:00</date>
635 <msg xml:space="preserve">other 1
635 <msg xml:space="preserve">other 1
636 other 2
636 other 2
637
637
638 other 3</msg>
638 other 3</msg>
639 </logentry>
639 </logentry>
640 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
640 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
641 <author email="user@hostname">User Name</author>
641 <author email="user@hostname">User Name</author>
642 <date>1970-01-12T13:46:40+00:00</date>
642 <date>1970-01-12T13:46:40+00:00</date>
643 <msg xml:space="preserve">line 1
643 <msg xml:space="preserve">line 1
644 line 2</msg>
644 line 2</msg>
645 </logentry>
645 </logentry>
646 </log>
646 </log>
647
647
648 $ hg log -v --style xml
648 $ hg log -v --style xml
649 <?xml version="1.0"?>
649 <?xml version="1.0"?>
650 <log>
650 <log>
651 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
651 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
652 <tag>tip</tag>
652 <tag>tip</tag>
653 <author email="test">test</author>
653 <author email="test">test</author>
654 <date>2020-01-01T10:01:00+00:00</date>
654 <date>2020-01-01T10:01:00+00:00</date>
655 <msg xml:space="preserve">third</msg>
655 <msg xml:space="preserve">third</msg>
656 <paths>
656 <paths>
657 <path action="A">fourth</path>
657 <path action="A">fourth</path>
658 <path action="A">third</path>
658 <path action="A">third</path>
659 <path action="R">second</path>
659 <path action="R">second</path>
660 </paths>
660 </paths>
661 <copies>
661 <copies>
662 <copy source="second">fourth</copy>
662 <copy source="second">fourth</copy>
663 </copies>
663 </copies>
664 </logentry>
664 </logentry>
665 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
665 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
666 <parent revision="-1" node="0000000000000000000000000000000000000000" />
666 <parent revision="-1" node="0000000000000000000000000000000000000000" />
667 <author email="user@hostname">User Name</author>
667 <author email="user@hostname">User Name</author>
668 <date>1970-01-12T13:46:40+00:00</date>
668 <date>1970-01-12T13:46:40+00:00</date>
669 <msg xml:space="preserve">second</msg>
669 <msg xml:space="preserve">second</msg>
670 <paths>
670 <paths>
671 <path action="A">second</path>
671 <path action="A">second</path>
672 </paths>
672 </paths>
673 </logentry>
673 </logentry>
674 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
674 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
675 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
675 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
676 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
676 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
677 <author email="person">person</author>
677 <author email="person">person</author>
678 <date>1970-01-18T08:40:01+00:00</date>
678 <date>1970-01-18T08:40:01+00:00</date>
679 <msg xml:space="preserve">merge</msg>
679 <msg xml:space="preserve">merge</msg>
680 <paths>
680 <paths>
681 </paths>
681 </paths>
682 </logentry>
682 </logentry>
683 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
683 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
684 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
684 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
685 <author email="person">person</author>
685 <author email="person">person</author>
686 <date>1970-01-18T08:40:00+00:00</date>
686 <date>1970-01-18T08:40:00+00:00</date>
687 <msg xml:space="preserve">new head</msg>
687 <msg xml:space="preserve">new head</msg>
688 <paths>
688 <paths>
689 <path action="A">d</path>
689 <path action="A">d</path>
690 </paths>
690 </paths>
691 </logentry>
691 </logentry>
692 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
692 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
693 <branch>foo</branch>
693 <branch>foo</branch>
694 <author email="person">person</author>
694 <author email="person">person</author>
695 <date>1970-01-17T04:53:20+00:00</date>
695 <date>1970-01-17T04:53:20+00:00</date>
696 <msg xml:space="preserve">new branch</msg>
696 <msg xml:space="preserve">new branch</msg>
697 <paths>
697 <paths>
698 </paths>
698 </paths>
699 </logentry>
699 </logentry>
700 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
700 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
701 <author email="person">person</author>
701 <author email="person">person</author>
702 <date>1970-01-16T01:06:40+00:00</date>
702 <date>1970-01-16T01:06:40+00:00</date>
703 <msg xml:space="preserve">no user, no domain</msg>
703 <msg xml:space="preserve">no user, no domain</msg>
704 <paths>
704 <paths>
705 <path action="M">c</path>
705 <path action="M">c</path>
706 </paths>
706 </paths>
707 </logentry>
707 </logentry>
708 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
708 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
709 <author email="other@place">other</author>
709 <author email="other@place">other</author>
710 <date>1970-01-14T21:20:00+00:00</date>
710 <date>1970-01-14T21:20:00+00:00</date>
711 <msg xml:space="preserve">no person</msg>
711 <msg xml:space="preserve">no person</msg>
712 <paths>
712 <paths>
713 <path action="A">c</path>
713 <path action="A">c</path>
714 </paths>
714 </paths>
715 </logentry>
715 </logentry>
716 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
716 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
717 <author email="other@place">A. N. Other</author>
717 <author email="other@place">A. N. Other</author>
718 <date>1970-01-13T17:33:20+00:00</date>
718 <date>1970-01-13T17:33:20+00:00</date>
719 <msg xml:space="preserve">other 1
719 <msg xml:space="preserve">other 1
720 other 2
720 other 2
721
721
722 other 3</msg>
722 other 3</msg>
723 <paths>
723 <paths>
724 <path action="A">b</path>
724 <path action="A">b</path>
725 </paths>
725 </paths>
726 </logentry>
726 </logentry>
727 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
727 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
728 <author email="user@hostname">User Name</author>
728 <author email="user@hostname">User Name</author>
729 <date>1970-01-12T13:46:40+00:00</date>
729 <date>1970-01-12T13:46:40+00:00</date>
730 <msg xml:space="preserve">line 1
730 <msg xml:space="preserve">line 1
731 line 2</msg>
731 line 2</msg>
732 <paths>
732 <paths>
733 <path action="A">a</path>
733 <path action="A">a</path>
734 </paths>
734 </paths>
735 </logentry>
735 </logentry>
736 </log>
736 </log>
737
737
738 $ hg log --debug --style xml
738 $ hg log --debug --style xml
739 <?xml version="1.0"?>
739 <?xml version="1.0"?>
740 <log>
740 <log>
741 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
741 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
742 <tag>tip</tag>
742 <tag>tip</tag>
743 <parent revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453" />
743 <parent revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453" />
744 <parent revision="-1" node="0000000000000000000000000000000000000000" />
744 <parent revision="-1" node="0000000000000000000000000000000000000000" />
745 <author email="test">test</author>
745 <author email="test">test</author>
746 <date>2020-01-01T10:01:00+00:00</date>
746 <date>2020-01-01T10:01:00+00:00</date>
747 <msg xml:space="preserve">third</msg>
747 <msg xml:space="preserve">third</msg>
748 <paths>
748 <paths>
749 <path action="A">fourth</path>
749 <path action="A">fourth</path>
750 <path action="A">third</path>
750 <path action="A">third</path>
751 <path action="R">second</path>
751 <path action="R">second</path>
752 </paths>
752 </paths>
753 <copies>
753 <copies>
754 <copy source="second">fourth</copy>
754 <copy source="second">fourth</copy>
755 </copies>
755 </copies>
756 <extra key="branch">default</extra>
756 <extra key="branch">default</extra>
757 </logentry>
757 </logentry>
758 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
758 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
759 <parent revision="-1" node="0000000000000000000000000000000000000000" />
759 <parent revision="-1" node="0000000000000000000000000000000000000000" />
760 <parent revision="-1" node="0000000000000000000000000000000000000000" />
760 <parent revision="-1" node="0000000000000000000000000000000000000000" />
761 <author email="user@hostname">User Name</author>
761 <author email="user@hostname">User Name</author>
762 <date>1970-01-12T13:46:40+00:00</date>
762 <date>1970-01-12T13:46:40+00:00</date>
763 <msg xml:space="preserve">second</msg>
763 <msg xml:space="preserve">second</msg>
764 <paths>
764 <paths>
765 <path action="A">second</path>
765 <path action="A">second</path>
766 </paths>
766 </paths>
767 <extra key="branch">default</extra>
767 <extra key="branch">default</extra>
768 </logentry>
768 </logentry>
769 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
769 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
770 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
770 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
771 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
771 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
772 <author email="person">person</author>
772 <author email="person">person</author>
773 <date>1970-01-18T08:40:01+00:00</date>
773 <date>1970-01-18T08:40:01+00:00</date>
774 <msg xml:space="preserve">merge</msg>
774 <msg xml:space="preserve">merge</msg>
775 <paths>
775 <paths>
776 </paths>
776 </paths>
777 <extra key="branch">default</extra>
777 <extra key="branch">default</extra>
778 </logentry>
778 </logentry>
779 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
779 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
780 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
780 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
781 <parent revision="-1" node="0000000000000000000000000000000000000000" />
781 <parent revision="-1" node="0000000000000000000000000000000000000000" />
782 <author email="person">person</author>
782 <author email="person">person</author>
783 <date>1970-01-18T08:40:00+00:00</date>
783 <date>1970-01-18T08:40:00+00:00</date>
784 <msg xml:space="preserve">new head</msg>
784 <msg xml:space="preserve">new head</msg>
785 <paths>
785 <paths>
786 <path action="A">d</path>
786 <path action="A">d</path>
787 </paths>
787 </paths>
788 <extra key="branch">default</extra>
788 <extra key="branch">default</extra>
789 </logentry>
789 </logentry>
790 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
790 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
791 <branch>foo</branch>
791 <branch>foo</branch>
792 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
792 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
793 <parent revision="-1" node="0000000000000000000000000000000000000000" />
793 <parent revision="-1" node="0000000000000000000000000000000000000000" />
794 <author email="person">person</author>
794 <author email="person">person</author>
795 <date>1970-01-17T04:53:20+00:00</date>
795 <date>1970-01-17T04:53:20+00:00</date>
796 <msg xml:space="preserve">new branch</msg>
796 <msg xml:space="preserve">new branch</msg>
797 <paths>
797 <paths>
798 </paths>
798 </paths>
799 <extra key="branch">foo</extra>
799 <extra key="branch">foo</extra>
800 </logentry>
800 </logentry>
801 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
801 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
802 <parent revision="2" node="97054abb4ab824450e9164180baf491ae0078465" />
802 <parent revision="2" node="97054abb4ab824450e9164180baf491ae0078465" />
803 <parent revision="-1" node="0000000000000000000000000000000000000000" />
803 <parent revision="-1" node="0000000000000000000000000000000000000000" />
804 <author email="person">person</author>
804 <author email="person">person</author>
805 <date>1970-01-16T01:06:40+00:00</date>
805 <date>1970-01-16T01:06:40+00:00</date>
806 <msg xml:space="preserve">no user, no domain</msg>
806 <msg xml:space="preserve">no user, no domain</msg>
807 <paths>
807 <paths>
808 <path action="M">c</path>
808 <path action="M">c</path>
809 </paths>
809 </paths>
810 <extra key="branch">default</extra>
810 <extra key="branch">default</extra>
811 </logentry>
811 </logentry>
812 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
812 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
813 <parent revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965" />
813 <parent revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965" />
814 <parent revision="-1" node="0000000000000000000000000000000000000000" />
814 <parent revision="-1" node="0000000000000000000000000000000000000000" />
815 <author email="other@place">other</author>
815 <author email="other@place">other</author>
816 <date>1970-01-14T21:20:00+00:00</date>
816 <date>1970-01-14T21:20:00+00:00</date>
817 <msg xml:space="preserve">no person</msg>
817 <msg xml:space="preserve">no person</msg>
818 <paths>
818 <paths>
819 <path action="A">c</path>
819 <path action="A">c</path>
820 </paths>
820 </paths>
821 <extra key="branch">default</extra>
821 <extra key="branch">default</extra>
822 </logentry>
822 </logentry>
823 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
823 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
824 <parent revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f" />
824 <parent revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f" />
825 <parent revision="-1" node="0000000000000000000000000000000000000000" />
825 <parent revision="-1" node="0000000000000000000000000000000000000000" />
826 <author email="other@place">A. N. Other</author>
826 <author email="other@place">A. N. Other</author>
827 <date>1970-01-13T17:33:20+00:00</date>
827 <date>1970-01-13T17:33:20+00:00</date>
828 <msg xml:space="preserve">other 1
828 <msg xml:space="preserve">other 1
829 other 2
829 other 2
830
830
831 other 3</msg>
831 other 3</msg>
832 <paths>
832 <paths>
833 <path action="A">b</path>
833 <path action="A">b</path>
834 </paths>
834 </paths>
835 <extra key="branch">default</extra>
835 <extra key="branch">default</extra>
836 </logentry>
836 </logentry>
837 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
837 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
838 <parent revision="-1" node="0000000000000000000000000000000000000000" />
838 <parent revision="-1" node="0000000000000000000000000000000000000000" />
839 <parent revision="-1" node="0000000000000000000000000000000000000000" />
839 <parent revision="-1" node="0000000000000000000000000000000000000000" />
840 <author email="user@hostname">User Name</author>
840 <author email="user@hostname">User Name</author>
841 <date>1970-01-12T13:46:40+00:00</date>
841 <date>1970-01-12T13:46:40+00:00</date>
842 <msg xml:space="preserve">line 1
842 <msg xml:space="preserve">line 1
843 line 2</msg>
843 line 2</msg>
844 <paths>
844 <paths>
845 <path action="A">a</path>
845 <path action="A">a</path>
846 </paths>
846 </paths>
847 <extra key="branch">default</extra>
847 <extra key="branch">default</extra>
848 </logentry>
848 </logentry>
849 </log>
849 </log>
850
850
851
851
852 Test JSON style:
852 Test JSON style:
853
853
854 $ hg log -k nosuch -Tjson
854 $ hg log -k nosuch -Tjson
855 []
855 []
856
856
857 $ hg log -qr . -Tjson
857 $ hg log -qr . -Tjson
858 [
858 [
859 {
859 {
860 "rev": 8,
860 "rev": 8,
861 "node": "95c24699272ef57d062b8bccc32c878bf841784a"
861 "node": "95c24699272ef57d062b8bccc32c878bf841784a"
862 }
862 }
863 ]
863 ]
864
864
865 $ hg log -vpr . -Tjson --stat
865 $ hg log -vpr . -Tjson --stat
866 [
866 [
867 {
867 {
868 "rev": 8,
868 "rev": 8,
869 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
869 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
870 "branch": "default",
870 "branch": "default",
871 "phase": "draft",
871 "phase": "draft",
872 "user": "test",
872 "user": "test",
873 "date": [1577872860, 0],
873 "date": [1577872860, 0],
874 "desc": "third",
874 "desc": "third",
875 "bookmarks": [],
875 "bookmarks": [],
876 "tags": ["tip"],
876 "tags": ["tip"],
877 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
877 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
878 "files": ["fourth", "second", "third"],
878 "files": ["fourth", "second", "third"],
879 "diffstat": " fourth | 1 +\n second | 1 -\n third | 1 +\n 3 files changed, 2 insertions(+), 1 deletions(-)\n",
879 "diffstat": " fourth | 1 +\n second | 1 -\n third | 1 +\n 3 files changed, 2 insertions(+), 1 deletions(-)\n",
880 "diff": "diff -r 29114dbae42b -r 95c24699272e fourth\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/fourth\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+second\ndiff -r 29114dbae42b -r 95c24699272e second\n--- a/second\tMon Jan 12 13:46:40 1970 +0000\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,1 +0,0 @@\n-second\ndiff -r 29114dbae42b -r 95c24699272e third\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/third\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+third\n"
880 "diff": "diff -r 29114dbae42b -r 95c24699272e fourth\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/fourth\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+second\ndiff -r 29114dbae42b -r 95c24699272e second\n--- a/second\tMon Jan 12 13:46:40 1970 +0000\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,1 +0,0 @@\n-second\ndiff -r 29114dbae42b -r 95c24699272e third\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/third\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+third\n"
881 }
881 }
882 ]
882 ]
883
883
884 honor --git but not format-breaking diffopts
884 honor --git but not format-breaking diffopts
885 $ hg --config diff.noprefix=True log --git -vpr . -Tjson
885 $ hg --config diff.noprefix=True log --git -vpr . -Tjson
886 [
886 [
887 {
887 {
888 "rev": 8,
888 "rev": 8,
889 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
889 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
890 "branch": "default",
890 "branch": "default",
891 "phase": "draft",
891 "phase": "draft",
892 "user": "test",
892 "user": "test",
893 "date": [1577872860, 0],
893 "date": [1577872860, 0],
894 "desc": "third",
894 "desc": "third",
895 "bookmarks": [],
895 "bookmarks": [],
896 "tags": ["tip"],
896 "tags": ["tip"],
897 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
897 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
898 "files": ["fourth", "second", "third"],
898 "files": ["fourth", "second", "third"],
899 "diff": "diff --git a/second b/fourth\nrename from second\nrename to fourth\ndiff --git a/third b/third\nnew file mode 100644\n--- /dev/null\n+++ b/third\n@@ -0,0 +1,1 @@\n+third\n"
899 "diff": "diff --git a/second b/fourth\nrename from second\nrename to fourth\ndiff --git a/third b/third\nnew file mode 100644\n--- /dev/null\n+++ b/third\n@@ -0,0 +1,1 @@\n+third\n"
900 }
900 }
901 ]
901 ]
902
902
903 $ hg log -T json
903 $ hg log -T json
904 [
904 [
905 {
905 {
906 "rev": 8,
906 "rev": 8,
907 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
907 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
908 "branch": "default",
908 "branch": "default",
909 "phase": "draft",
909 "phase": "draft",
910 "user": "test",
910 "user": "test",
911 "date": [1577872860, 0],
911 "date": [1577872860, 0],
912 "desc": "third",
912 "desc": "third",
913 "bookmarks": [],
913 "bookmarks": [],
914 "tags": ["tip"],
914 "tags": ["tip"],
915 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"]
915 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"]
916 },
916 },
917 {
917 {
918 "rev": 7,
918 "rev": 7,
919 "node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
919 "node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
920 "branch": "default",
920 "branch": "default",
921 "phase": "draft",
921 "phase": "draft",
922 "user": "User Name <user@hostname>",
922 "user": "User Name <user@hostname>",
923 "date": [1000000, 0],
923 "date": [1000000, 0],
924 "desc": "second",
924 "desc": "second",
925 "bookmarks": [],
925 "bookmarks": [],
926 "tags": [],
926 "tags": [],
927 "parents": ["0000000000000000000000000000000000000000"]
927 "parents": ["0000000000000000000000000000000000000000"]
928 },
928 },
929 {
929 {
930 "rev": 6,
930 "rev": 6,
931 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
931 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
932 "branch": "default",
932 "branch": "default",
933 "phase": "draft",
933 "phase": "draft",
934 "user": "person",
934 "user": "person",
935 "date": [1500001, 0],
935 "date": [1500001, 0],
936 "desc": "merge",
936 "desc": "merge",
937 "bookmarks": [],
937 "bookmarks": [],
938 "tags": [],
938 "tags": [],
939 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"]
939 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"]
940 },
940 },
941 {
941 {
942 "rev": 5,
942 "rev": 5,
943 "node": "13207e5a10d9fd28ec424934298e176197f2c67f",
943 "node": "13207e5a10d9fd28ec424934298e176197f2c67f",
944 "branch": "default",
944 "branch": "default",
945 "phase": "draft",
945 "phase": "draft",
946 "user": "person",
946 "user": "person",
947 "date": [1500000, 0],
947 "date": [1500000, 0],
948 "desc": "new head",
948 "desc": "new head",
949 "bookmarks": [],
949 "bookmarks": [],
950 "tags": [],
950 "tags": [],
951 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
951 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
952 },
952 },
953 {
953 {
954 "rev": 4,
954 "rev": 4,
955 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
955 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
956 "branch": "foo",
956 "branch": "foo",
957 "phase": "draft",
957 "phase": "draft",
958 "user": "person",
958 "user": "person",
959 "date": [1400000, 0],
959 "date": [1400000, 0],
960 "desc": "new branch",
960 "desc": "new branch",
961 "bookmarks": [],
961 "bookmarks": [],
962 "tags": [],
962 "tags": [],
963 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
963 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
964 },
964 },
965 {
965 {
966 "rev": 3,
966 "rev": 3,
967 "node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
967 "node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
968 "branch": "default",
968 "branch": "default",
969 "phase": "draft",
969 "phase": "draft",
970 "user": "person",
970 "user": "person",
971 "date": [1300000, 0],
971 "date": [1300000, 0],
972 "desc": "no user, no domain",
972 "desc": "no user, no domain",
973 "bookmarks": [],
973 "bookmarks": [],
974 "tags": [],
974 "tags": [],
975 "parents": ["97054abb4ab824450e9164180baf491ae0078465"]
975 "parents": ["97054abb4ab824450e9164180baf491ae0078465"]
976 },
976 },
977 {
977 {
978 "rev": 2,
978 "rev": 2,
979 "node": "97054abb4ab824450e9164180baf491ae0078465",
979 "node": "97054abb4ab824450e9164180baf491ae0078465",
980 "branch": "default",
980 "branch": "default",
981 "phase": "draft",
981 "phase": "draft",
982 "user": "other@place",
982 "user": "other@place",
983 "date": [1200000, 0],
983 "date": [1200000, 0],
984 "desc": "no person",
984 "desc": "no person",
985 "bookmarks": [],
985 "bookmarks": [],
986 "tags": [],
986 "tags": [],
987 "parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"]
987 "parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"]
988 },
988 },
989 {
989 {
990 "rev": 1,
990 "rev": 1,
991 "node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
991 "node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
992 "branch": "default",
992 "branch": "default",
993 "phase": "draft",
993 "phase": "draft",
994 "user": "A. N. Other <other@place>",
994 "user": "A. N. Other <other@place>",
995 "date": [1100000, 0],
995 "date": [1100000, 0],
996 "desc": "other 1\nother 2\n\nother 3",
996 "desc": "other 1\nother 2\n\nother 3",
997 "bookmarks": [],
997 "bookmarks": [],
998 "tags": [],
998 "tags": [],
999 "parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"]
999 "parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"]
1000 },
1000 },
1001 {
1001 {
1002 "rev": 0,
1002 "rev": 0,
1003 "node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
1003 "node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
1004 "branch": "default",
1004 "branch": "default",
1005 "phase": "draft",
1005 "phase": "draft",
1006 "user": "User Name <user@hostname>",
1006 "user": "User Name <user@hostname>",
1007 "date": [1000000, 0],
1007 "date": [1000000, 0],
1008 "desc": "line 1\nline 2",
1008 "desc": "line 1\nline 2",
1009 "bookmarks": [],
1009 "bookmarks": [],
1010 "tags": [],
1010 "tags": [],
1011 "parents": ["0000000000000000000000000000000000000000"]
1011 "parents": ["0000000000000000000000000000000000000000"]
1012 }
1012 }
1013 ]
1013 ]
1014
1014
1015 $ hg heads -v -Tjson
1015 $ hg heads -v -Tjson
1016 [
1016 [
1017 {
1017 {
1018 "rev": 8,
1018 "rev": 8,
1019 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
1019 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
1020 "branch": "default",
1020 "branch": "default",
1021 "phase": "draft",
1021 "phase": "draft",
1022 "user": "test",
1022 "user": "test",
1023 "date": [1577872860, 0],
1023 "date": [1577872860, 0],
1024 "desc": "third",
1024 "desc": "third",
1025 "bookmarks": [],
1025 "bookmarks": [],
1026 "tags": ["tip"],
1026 "tags": ["tip"],
1027 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
1027 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
1028 "files": ["fourth", "second", "third"]
1028 "files": ["fourth", "second", "third"]
1029 },
1029 },
1030 {
1030 {
1031 "rev": 6,
1031 "rev": 6,
1032 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
1032 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
1033 "branch": "default",
1033 "branch": "default",
1034 "phase": "draft",
1034 "phase": "draft",
1035 "user": "person",
1035 "user": "person",
1036 "date": [1500001, 0],
1036 "date": [1500001, 0],
1037 "desc": "merge",
1037 "desc": "merge",
1038 "bookmarks": [],
1038 "bookmarks": [],
1039 "tags": [],
1039 "tags": [],
1040 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
1040 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
1041 "files": []
1041 "files": []
1042 },
1042 },
1043 {
1043 {
1044 "rev": 4,
1044 "rev": 4,
1045 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
1045 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
1046 "branch": "foo",
1046 "branch": "foo",
1047 "phase": "draft",
1047 "phase": "draft",
1048 "user": "person",
1048 "user": "person",
1049 "date": [1400000, 0],
1049 "date": [1400000, 0],
1050 "desc": "new branch",
1050 "desc": "new branch",
1051 "bookmarks": [],
1051 "bookmarks": [],
1052 "tags": [],
1052 "tags": [],
1053 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1053 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1054 "files": []
1054 "files": []
1055 }
1055 }
1056 ]
1056 ]
1057
1057
1058 $ hg log --debug -Tjson
1058 $ hg log --debug -Tjson
1059 [
1059 [
1060 {
1060 {
1061 "rev": 8,
1061 "rev": 8,
1062 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
1062 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
1063 "branch": "default",
1063 "branch": "default",
1064 "phase": "draft",
1064 "phase": "draft",
1065 "user": "test",
1065 "user": "test",
1066 "date": [1577872860, 0],
1066 "date": [1577872860, 0],
1067 "desc": "third",
1067 "desc": "third",
1068 "bookmarks": [],
1068 "bookmarks": [],
1069 "tags": ["tip"],
1069 "tags": ["tip"],
1070 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
1070 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
1071 "manifest": "94961b75a2da554b4df6fb599e5bfc7d48de0c64",
1071 "manifest": "94961b75a2da554b4df6fb599e5bfc7d48de0c64",
1072 "extra": {"branch": "default"},
1072 "extra": {"branch": "default"},
1073 "modified": [],
1073 "modified": [],
1074 "added": ["fourth", "third"],
1074 "added": ["fourth", "third"],
1075 "removed": ["second"]
1075 "removed": ["second"]
1076 },
1076 },
1077 {
1077 {
1078 "rev": 7,
1078 "rev": 7,
1079 "node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
1079 "node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
1080 "branch": "default",
1080 "branch": "default",
1081 "phase": "draft",
1081 "phase": "draft",
1082 "user": "User Name <user@hostname>",
1082 "user": "User Name <user@hostname>",
1083 "date": [1000000, 0],
1083 "date": [1000000, 0],
1084 "desc": "second",
1084 "desc": "second",
1085 "bookmarks": [],
1085 "bookmarks": [],
1086 "tags": [],
1086 "tags": [],
1087 "parents": ["0000000000000000000000000000000000000000"],
1087 "parents": ["0000000000000000000000000000000000000000"],
1088 "manifest": "f2dbc354b94e5ec0b4f10680ee0cee816101d0bf",
1088 "manifest": "f2dbc354b94e5ec0b4f10680ee0cee816101d0bf",
1089 "extra": {"branch": "default"},
1089 "extra": {"branch": "default"},
1090 "modified": [],
1090 "modified": [],
1091 "added": ["second"],
1091 "added": ["second"],
1092 "removed": []
1092 "removed": []
1093 },
1093 },
1094 {
1094 {
1095 "rev": 6,
1095 "rev": 6,
1096 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
1096 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
1097 "branch": "default",
1097 "branch": "default",
1098 "phase": "draft",
1098 "phase": "draft",
1099 "user": "person",
1099 "user": "person",
1100 "date": [1500001, 0],
1100 "date": [1500001, 0],
1101 "desc": "merge",
1101 "desc": "merge",
1102 "bookmarks": [],
1102 "bookmarks": [],
1103 "tags": [],
1103 "tags": [],
1104 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
1104 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
1105 "manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
1105 "manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
1106 "extra": {"branch": "default"},
1106 "extra": {"branch": "default"},
1107 "modified": [],
1107 "modified": [],
1108 "added": [],
1108 "added": [],
1109 "removed": []
1109 "removed": []
1110 },
1110 },
1111 {
1111 {
1112 "rev": 5,
1112 "rev": 5,
1113 "node": "13207e5a10d9fd28ec424934298e176197f2c67f",
1113 "node": "13207e5a10d9fd28ec424934298e176197f2c67f",
1114 "branch": "default",
1114 "branch": "default",
1115 "phase": "draft",
1115 "phase": "draft",
1116 "user": "person",
1116 "user": "person",
1117 "date": [1500000, 0],
1117 "date": [1500000, 0],
1118 "desc": "new head",
1118 "desc": "new head",
1119 "bookmarks": [],
1119 "bookmarks": [],
1120 "tags": [],
1120 "tags": [],
1121 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1121 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1122 "manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
1122 "manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
1123 "extra": {"branch": "default"},
1123 "extra": {"branch": "default"},
1124 "modified": [],
1124 "modified": [],
1125 "added": ["d"],
1125 "added": ["d"],
1126 "removed": []
1126 "removed": []
1127 },
1127 },
1128 {
1128 {
1129 "rev": 4,
1129 "rev": 4,
1130 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
1130 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
1131 "branch": "foo",
1131 "branch": "foo",
1132 "phase": "draft",
1132 "phase": "draft",
1133 "user": "person",
1133 "user": "person",
1134 "date": [1400000, 0],
1134 "date": [1400000, 0],
1135 "desc": "new branch",
1135 "desc": "new branch",
1136 "bookmarks": [],
1136 "bookmarks": [],
1137 "tags": [],
1137 "tags": [],
1138 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1138 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1139 "manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
1139 "manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
1140 "extra": {"branch": "foo"},
1140 "extra": {"branch": "foo"},
1141 "modified": [],
1141 "modified": [],
1142 "added": [],
1142 "added": [],
1143 "removed": []
1143 "removed": []
1144 },
1144 },
1145 {
1145 {
1146 "rev": 3,
1146 "rev": 3,
1147 "node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
1147 "node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
1148 "branch": "default",
1148 "branch": "default",
1149 "phase": "draft",
1149 "phase": "draft",
1150 "user": "person",
1150 "user": "person",
1151 "date": [1300000, 0],
1151 "date": [1300000, 0],
1152 "desc": "no user, no domain",
1152 "desc": "no user, no domain",
1153 "bookmarks": [],
1153 "bookmarks": [],
1154 "tags": [],
1154 "tags": [],
1155 "parents": ["97054abb4ab824450e9164180baf491ae0078465"],
1155 "parents": ["97054abb4ab824450e9164180baf491ae0078465"],
1156 "manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
1156 "manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
1157 "extra": {"branch": "default"},
1157 "extra": {"branch": "default"},
1158 "modified": ["c"],
1158 "modified": ["c"],
1159 "added": [],
1159 "added": [],
1160 "removed": []
1160 "removed": []
1161 },
1161 },
1162 {
1162 {
1163 "rev": 2,
1163 "rev": 2,
1164 "node": "97054abb4ab824450e9164180baf491ae0078465",
1164 "node": "97054abb4ab824450e9164180baf491ae0078465",
1165 "branch": "default",
1165 "branch": "default",
1166 "phase": "draft",
1166 "phase": "draft",
1167 "user": "other@place",
1167 "user": "other@place",
1168 "date": [1200000, 0],
1168 "date": [1200000, 0],
1169 "desc": "no person",
1169 "desc": "no person",
1170 "bookmarks": [],
1170 "bookmarks": [],
1171 "tags": [],
1171 "tags": [],
1172 "parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"],
1172 "parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"],
1173 "manifest": "6e0e82995c35d0d57a52aca8da4e56139e06b4b1",
1173 "manifest": "6e0e82995c35d0d57a52aca8da4e56139e06b4b1",
1174 "extra": {"branch": "default"},
1174 "extra": {"branch": "default"},
1175 "modified": [],
1175 "modified": [],
1176 "added": ["c"],
1176 "added": ["c"],
1177 "removed": []
1177 "removed": []
1178 },
1178 },
1179 {
1179 {
1180 "rev": 1,
1180 "rev": 1,
1181 "node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
1181 "node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
1182 "branch": "default",
1182 "branch": "default",
1183 "phase": "draft",
1183 "phase": "draft",
1184 "user": "A. N. Other <other@place>",
1184 "user": "A. N. Other <other@place>",
1185 "date": [1100000, 0],
1185 "date": [1100000, 0],
1186 "desc": "other 1\nother 2\n\nother 3",
1186 "desc": "other 1\nother 2\n\nother 3",
1187 "bookmarks": [],
1187 "bookmarks": [],
1188 "tags": [],
1188 "tags": [],
1189 "parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"],
1189 "parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"],
1190 "manifest": "4e8d705b1e53e3f9375e0e60dc7b525d8211fe55",
1190 "manifest": "4e8d705b1e53e3f9375e0e60dc7b525d8211fe55",
1191 "extra": {"branch": "default"},
1191 "extra": {"branch": "default"},
1192 "modified": [],
1192 "modified": [],
1193 "added": ["b"],
1193 "added": ["b"],
1194 "removed": []
1194 "removed": []
1195 },
1195 },
1196 {
1196 {
1197 "rev": 0,
1197 "rev": 0,
1198 "node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
1198 "node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
1199 "branch": "default",
1199 "branch": "default",
1200 "phase": "draft",
1200 "phase": "draft",
1201 "user": "User Name <user@hostname>",
1201 "user": "User Name <user@hostname>",
1202 "date": [1000000, 0],
1202 "date": [1000000, 0],
1203 "desc": "line 1\nline 2",
1203 "desc": "line 1\nline 2",
1204 "bookmarks": [],
1204 "bookmarks": [],
1205 "tags": [],
1205 "tags": [],
1206 "parents": ["0000000000000000000000000000000000000000"],
1206 "parents": ["0000000000000000000000000000000000000000"],
1207 "manifest": "a0c8bcbbb45c63b90b70ad007bf38961f64f2af0",
1207 "manifest": "a0c8bcbbb45c63b90b70ad007bf38961f64f2af0",
1208 "extra": {"branch": "default"},
1208 "extra": {"branch": "default"},
1209 "modified": [],
1209 "modified": [],
1210 "added": ["a"],
1210 "added": ["a"],
1211 "removed": []
1211 "removed": []
1212 }
1212 }
1213 ]
1213 ]
1214
1214
1215 Error if style not readable:
1215 Error if style not readable:
1216
1216
1217 #if unix-permissions no-root
1217 #if unix-permissions no-root
1218 $ touch q
1218 $ touch q
1219 $ chmod 0 q
1219 $ chmod 0 q
1220 $ hg log --style ./q
1220 $ hg log --style ./q
1221 abort: Permission denied: ./q
1221 abort: Permission denied: ./q
1222 [255]
1222 [255]
1223 #endif
1223 #endif
1224
1224
1225 Error if no style:
1225 Error if no style:
1226
1226
1227 $ hg log --style notexist
1227 $ hg log --style notexist
1228 abort: style 'notexist' not found
1228 abort: style 'notexist' not found
1229 (available styles: bisect, changelog, compact, default, phases, show, status, xml)
1229 (available styles: bisect, changelog, compact, default, phases, show, status, xml)
1230 [255]
1230 [255]
1231
1231
1232 $ hg log -T list
1232 $ hg log -T list
1233 available styles: bisect, changelog, compact, default, phases, show, status, xml
1233 available styles: bisect, changelog, compact, default, phases, show, status, xml
1234 abort: specify a template
1234 abort: specify a template
1235 [255]
1235 [255]
1236
1236
1237 Error if style missing key:
1237 Error if style missing key:
1238
1238
1239 $ echo 'q = q' > t
1239 $ echo 'q = q' > t
1240 $ hg log --style ./t
1240 $ hg log --style ./t
1241 abort: "changeset" not in template map
1241 abort: "changeset" not in template map
1242 [255]
1242 [255]
1243
1243
1244 Error if style missing value:
1244 Error if style missing value:
1245
1245
1246 $ echo 'changeset =' > t
1246 $ echo 'changeset =' > t
1247 $ hg log --style t
1247 $ hg log --style t
1248 hg: parse error at t:1: missing value
1248 hg: parse error at t:1: missing value
1249 [255]
1249 [255]
1250
1250
1251 Error if include fails:
1251 Error if include fails:
1252
1252
1253 $ echo 'changeset = q' >> t
1253 $ echo 'changeset = q' >> t
1254 #if unix-permissions no-root
1254 #if unix-permissions no-root
1255 $ hg log --style ./t
1255 $ hg log --style ./t
1256 abort: template file ./q: Permission denied
1256 abort: template file ./q: Permission denied
1257 [255]
1257 [255]
1258 $ rm -f q
1258 $ rm -f q
1259 #endif
1259 #endif
1260
1260
1261 Include works:
1261 Include works:
1262
1262
1263 $ echo '{rev}' > q
1263 $ echo '{rev}' > q
1264 $ hg log --style ./t
1264 $ hg log --style ./t
1265 8
1265 8
1266 7
1266 7
1267 6
1267 6
1268 5
1268 5
1269 4
1269 4
1270 3
1270 3
1271 2
1271 2
1272 1
1272 1
1273 0
1273 0
1274
1274
1275 Check that recursive reference does not fall into RuntimeError (issue4758):
1275 Check that recursive reference does not fall into RuntimeError (issue4758):
1276
1276
1277 common mistake:
1277 common mistake:
1278
1278
1279 $ cat << EOF > issue4758
1279 $ cat << EOF > issue4758
1280 > changeset = '{changeset}\n'
1280 > changeset = '{changeset}\n'
1281 > EOF
1281 > EOF
1282 $ hg log --style ./issue4758
1282 $ hg log --style ./issue4758
1283 abort: recursive reference 'changeset' in template
1283 abort: recursive reference 'changeset' in template
1284 [255]
1284 [255]
1285
1285
1286 circular reference:
1286 circular reference:
1287
1287
1288 $ cat << EOF > issue4758
1288 $ cat << EOF > issue4758
1289 > changeset = '{foo}'
1289 > changeset = '{foo}'
1290 > foo = '{changeset}'
1290 > foo = '{changeset}'
1291 > EOF
1291 > EOF
1292 $ hg log --style ./issue4758
1292 $ hg log --style ./issue4758
1293 abort: recursive reference 'foo' in template
1293 abort: recursive reference 'foo' in template
1294 [255]
1294 [255]
1295
1295
1296 buildmap() -> gettemplate(), where no thunk was made:
1296 buildmap() -> gettemplate(), where no thunk was made:
1297
1297
1298 $ cat << EOF > issue4758
1298 $ cat << EOF > issue4758
1299 > changeset = '{files % changeset}\n'
1299 > changeset = '{files % changeset}\n'
1300 > EOF
1300 > EOF
1301 $ hg log --style ./issue4758
1301 $ hg log --style ./issue4758
1302 abort: recursive reference 'changeset' in template
1302 abort: recursive reference 'changeset' in template
1303 [255]
1303 [255]
1304
1304
1305 not a recursion if a keyword of the same name exists:
1305 not a recursion if a keyword of the same name exists:
1306
1306
1307 $ cat << EOF > issue4758
1307 $ cat << EOF > issue4758
1308 > changeset = '{tags % rev}'
1308 > changeset = '{tags % rev}'
1309 > rev = '{rev} {tag}\n'
1309 > rev = '{rev} {tag}\n'
1310 > EOF
1310 > EOF
1311 $ hg log --style ./issue4758 -r tip
1311 $ hg log --style ./issue4758 -r tip
1312 8 tip
1312 8 tip
1313
1313
1314 Check that {phase} works correctly on parents:
1314 Check that {phase} works correctly on parents:
1315
1315
1316 $ cat << EOF > parentphase
1316 $ cat << EOF > parentphase
1317 > changeset_debug = '{rev} ({phase}):{parents}\n'
1317 > changeset_debug = '{rev} ({phase}):{parents}\n'
1318 > parent = ' {rev} ({phase})'
1318 > parent = ' {rev} ({phase})'
1319 > EOF
1319 > EOF
1320 $ hg phase -r 5 --public
1320 $ hg phase -r 5 --public
1321 $ hg phase -r 7 --secret --force
1321 $ hg phase -r 7 --secret --force
1322 $ hg log --debug -G --style ./parentphase
1322 $ hg log --debug -G --style ./parentphase
1323 @ 8 (secret): 7 (secret) -1 (public)
1323 @ 8 (secret): 7 (secret) -1 (public)
1324 |
1324 |
1325 o 7 (secret): -1 (public) -1 (public)
1325 o 7 (secret): -1 (public) -1 (public)
1326
1326
1327 o 6 (draft): 5 (public) 4 (draft)
1327 o 6 (draft): 5 (public) 4 (draft)
1328 |\
1328 |\
1329 | o 5 (public): 3 (public) -1 (public)
1329 | o 5 (public): 3 (public) -1 (public)
1330 | |
1330 | |
1331 o | 4 (draft): 3 (public) -1 (public)
1331 o | 4 (draft): 3 (public) -1 (public)
1332 |/
1332 |/
1333 o 3 (public): 2 (public) -1 (public)
1333 o 3 (public): 2 (public) -1 (public)
1334 |
1334 |
1335 o 2 (public): 1 (public) -1 (public)
1335 o 2 (public): 1 (public) -1 (public)
1336 |
1336 |
1337 o 1 (public): 0 (public) -1 (public)
1337 o 1 (public): 0 (public) -1 (public)
1338 |
1338 |
1339 o 0 (public): -1 (public) -1 (public)
1339 o 0 (public): -1 (public) -1 (public)
1340
1340
1341
1341
1342 Missing non-standard names give no error (backward compatibility):
1342 Missing non-standard names give no error (backward compatibility):
1343
1343
1344 $ echo "changeset = '{c}'" > t
1344 $ echo "changeset = '{c}'" > t
1345 $ hg log --style ./t
1345 $ hg log --style ./t
1346
1346
1347 Defining non-standard name works:
1347 Defining non-standard name works:
1348
1348
1349 $ cat <<EOF > t
1349 $ cat <<EOF > t
1350 > changeset = '{c}'
1350 > changeset = '{c}'
1351 > c = q
1351 > c = q
1352 > EOF
1352 > EOF
1353 $ hg log --style ./t
1353 $ hg log --style ./t
1354 8
1354 8
1355 7
1355 7
1356 6
1356 6
1357 5
1357 5
1358 4
1358 4
1359 3
1359 3
1360 2
1360 2
1361 1
1361 1
1362 0
1362 0
1363
1363
1364 ui.style works:
1364 ui.style works:
1365
1365
1366 $ echo '[ui]' > .hg/hgrc
1366 $ echo '[ui]' > .hg/hgrc
1367 $ echo 'style = t' >> .hg/hgrc
1367 $ echo 'style = t' >> .hg/hgrc
1368 $ hg log
1368 $ hg log
1369 8
1369 8
1370 7
1370 7
1371 6
1371 6
1372 5
1372 5
1373 4
1373 4
1374 3
1374 3
1375 2
1375 2
1376 1
1376 1
1377 0
1377 0
1378
1378
1379
1379
1380 Issue338:
1380 Issue338:
1381
1381
1382 $ hg log --style=changelog > changelog
1382 $ hg log --style=changelog > changelog
1383
1383
1384 $ cat changelog
1384 $ cat changelog
1385 2020-01-01 test <test>
1385 2020-01-01 test <test>
1386
1386
1387 * fourth, second, third:
1387 * fourth, second, third:
1388 third
1388 third
1389 [95c24699272e] [tip]
1389 [95c24699272e] [tip]
1390
1390
1391 1970-01-12 User Name <user@hostname>
1391 1970-01-12 User Name <user@hostname>
1392
1392
1393 * second:
1393 * second:
1394 second
1394 second
1395 [29114dbae42b]
1395 [29114dbae42b]
1396
1396
1397 1970-01-18 person <person>
1397 1970-01-18 person <person>
1398
1398
1399 * merge
1399 * merge
1400 [d41e714fe50d]
1400 [d41e714fe50d]
1401
1401
1402 * d:
1402 * d:
1403 new head
1403 new head
1404 [13207e5a10d9]
1404 [13207e5a10d9]
1405
1405
1406 1970-01-17 person <person>
1406 1970-01-17 person <person>
1407
1407
1408 * new branch
1408 * new branch
1409 [bbe44766e73d] <foo>
1409 [bbe44766e73d] <foo>
1410
1410
1411 1970-01-16 person <person>
1411 1970-01-16 person <person>
1412
1412
1413 * c:
1413 * c:
1414 no user, no domain
1414 no user, no domain
1415 [10e46f2dcbf4]
1415 [10e46f2dcbf4]
1416
1416
1417 1970-01-14 other <other@place>
1417 1970-01-14 other <other@place>
1418
1418
1419 * c:
1419 * c:
1420 no person
1420 no person
1421 [97054abb4ab8]
1421 [97054abb4ab8]
1422
1422
1423 1970-01-13 A. N. Other <other@place>
1423 1970-01-13 A. N. Other <other@place>
1424
1424
1425 * b:
1425 * b:
1426 other 1 other 2
1426 other 1 other 2
1427
1427
1428 other 3
1428 other 3
1429 [b608e9d1a3f0]
1429 [b608e9d1a3f0]
1430
1430
1431 1970-01-12 User Name <user@hostname>
1431 1970-01-12 User Name <user@hostname>
1432
1432
1433 * a:
1433 * a:
1434 line 1 line 2
1434 line 1 line 2
1435 [1e4e1b8f71e0]
1435 [1e4e1b8f71e0]
1436
1436
1437
1437
1438 Issue2130: xml output for 'hg heads' is malformed
1438 Issue2130: xml output for 'hg heads' is malformed
1439
1439
1440 $ hg heads --style changelog
1440 $ hg heads --style changelog
1441 2020-01-01 test <test>
1441 2020-01-01 test <test>
1442
1442
1443 * fourth, second, third:
1443 * fourth, second, third:
1444 third
1444 third
1445 [95c24699272e] [tip]
1445 [95c24699272e] [tip]
1446
1446
1447 1970-01-18 person <person>
1447 1970-01-18 person <person>
1448
1448
1449 * merge
1449 * merge
1450 [d41e714fe50d]
1450 [d41e714fe50d]
1451
1451
1452 1970-01-17 person <person>
1452 1970-01-17 person <person>
1453
1453
1454 * new branch
1454 * new branch
1455 [bbe44766e73d] <foo>
1455 [bbe44766e73d] <foo>
1456
1456
1457
1457
1458 Keys work:
1458 Keys work:
1459
1459
1460 $ for key in author branch branches date desc file_adds file_dels file_mods \
1460 $ for key in author branch branches date desc file_adds file_dels file_mods \
1461 > file_copies file_copies_switch files \
1461 > file_copies file_copies_switch files \
1462 > manifest node parents rev tags diffstat extras \
1462 > manifest node parents rev tags diffstat extras \
1463 > p1rev p2rev p1node p2node; do
1463 > p1rev p2rev p1node p2node; do
1464 > for mode in '' --verbose --debug; do
1464 > for mode in '' --verbose --debug; do
1465 > hg log $mode --template "$key$mode: {$key}\n"
1465 > hg log $mode --template "$key$mode: {$key}\n"
1466 > done
1466 > done
1467 > done
1467 > done
1468 author: test
1468 author: test
1469 author: User Name <user@hostname>
1469 author: User Name <user@hostname>
1470 author: person
1470 author: person
1471 author: person
1471 author: person
1472 author: person
1472 author: person
1473 author: person
1473 author: person
1474 author: other@place
1474 author: other@place
1475 author: A. N. Other <other@place>
1475 author: A. N. Other <other@place>
1476 author: User Name <user@hostname>
1476 author: User Name <user@hostname>
1477 author--verbose: test
1477 author--verbose: test
1478 author--verbose: User Name <user@hostname>
1478 author--verbose: User Name <user@hostname>
1479 author--verbose: person
1479 author--verbose: person
1480 author--verbose: person
1480 author--verbose: person
1481 author--verbose: person
1481 author--verbose: person
1482 author--verbose: person
1482 author--verbose: person
1483 author--verbose: other@place
1483 author--verbose: other@place
1484 author--verbose: A. N. Other <other@place>
1484 author--verbose: A. N. Other <other@place>
1485 author--verbose: User Name <user@hostname>
1485 author--verbose: User Name <user@hostname>
1486 author--debug: test
1486 author--debug: test
1487 author--debug: User Name <user@hostname>
1487 author--debug: User Name <user@hostname>
1488 author--debug: person
1488 author--debug: person
1489 author--debug: person
1489 author--debug: person
1490 author--debug: person
1490 author--debug: person
1491 author--debug: person
1491 author--debug: person
1492 author--debug: other@place
1492 author--debug: other@place
1493 author--debug: A. N. Other <other@place>
1493 author--debug: A. N. Other <other@place>
1494 author--debug: User Name <user@hostname>
1494 author--debug: User Name <user@hostname>
1495 branch: default
1495 branch: default
1496 branch: default
1496 branch: default
1497 branch: default
1497 branch: default
1498 branch: default
1498 branch: default
1499 branch: foo
1499 branch: foo
1500 branch: default
1500 branch: default
1501 branch: default
1501 branch: default
1502 branch: default
1502 branch: default
1503 branch: default
1503 branch: default
1504 branch--verbose: default
1504 branch--verbose: default
1505 branch--verbose: default
1505 branch--verbose: default
1506 branch--verbose: default
1506 branch--verbose: default
1507 branch--verbose: default
1507 branch--verbose: default
1508 branch--verbose: foo
1508 branch--verbose: foo
1509 branch--verbose: default
1509 branch--verbose: default
1510 branch--verbose: default
1510 branch--verbose: default
1511 branch--verbose: default
1511 branch--verbose: default
1512 branch--verbose: default
1512 branch--verbose: default
1513 branch--debug: default
1513 branch--debug: default
1514 branch--debug: default
1514 branch--debug: default
1515 branch--debug: default
1515 branch--debug: default
1516 branch--debug: default
1516 branch--debug: default
1517 branch--debug: foo
1517 branch--debug: foo
1518 branch--debug: default
1518 branch--debug: default
1519 branch--debug: default
1519 branch--debug: default
1520 branch--debug: default
1520 branch--debug: default
1521 branch--debug: default
1521 branch--debug: default
1522 branches:
1522 branches:
1523 branches:
1523 branches:
1524 branches:
1524 branches:
1525 branches:
1525 branches:
1526 branches: foo
1526 branches: foo
1527 branches:
1527 branches:
1528 branches:
1528 branches:
1529 branches:
1529 branches:
1530 branches:
1530 branches:
1531 branches--verbose:
1531 branches--verbose:
1532 branches--verbose:
1532 branches--verbose:
1533 branches--verbose:
1533 branches--verbose:
1534 branches--verbose:
1534 branches--verbose:
1535 branches--verbose: foo
1535 branches--verbose: foo
1536 branches--verbose:
1536 branches--verbose:
1537 branches--verbose:
1537 branches--verbose:
1538 branches--verbose:
1538 branches--verbose:
1539 branches--verbose:
1539 branches--verbose:
1540 branches--debug:
1540 branches--debug:
1541 branches--debug:
1541 branches--debug:
1542 branches--debug:
1542 branches--debug:
1543 branches--debug:
1543 branches--debug:
1544 branches--debug: foo
1544 branches--debug: foo
1545 branches--debug:
1545 branches--debug:
1546 branches--debug:
1546 branches--debug:
1547 branches--debug:
1547 branches--debug:
1548 branches--debug:
1548 branches--debug:
1549 date: 1577872860.00
1549 date: 1577872860.00
1550 date: 1000000.00
1550 date: 1000000.00
1551 date: 1500001.00
1551 date: 1500001.00
1552 date: 1500000.00
1552 date: 1500000.00
1553 date: 1400000.00
1553 date: 1400000.00
1554 date: 1300000.00
1554 date: 1300000.00
1555 date: 1200000.00
1555 date: 1200000.00
1556 date: 1100000.00
1556 date: 1100000.00
1557 date: 1000000.00
1557 date: 1000000.00
1558 date--verbose: 1577872860.00
1558 date--verbose: 1577872860.00
1559 date--verbose: 1000000.00
1559 date--verbose: 1000000.00
1560 date--verbose: 1500001.00
1560 date--verbose: 1500001.00
1561 date--verbose: 1500000.00
1561 date--verbose: 1500000.00
1562 date--verbose: 1400000.00
1562 date--verbose: 1400000.00
1563 date--verbose: 1300000.00
1563 date--verbose: 1300000.00
1564 date--verbose: 1200000.00
1564 date--verbose: 1200000.00
1565 date--verbose: 1100000.00
1565 date--verbose: 1100000.00
1566 date--verbose: 1000000.00
1566 date--verbose: 1000000.00
1567 date--debug: 1577872860.00
1567 date--debug: 1577872860.00
1568 date--debug: 1000000.00
1568 date--debug: 1000000.00
1569 date--debug: 1500001.00
1569 date--debug: 1500001.00
1570 date--debug: 1500000.00
1570 date--debug: 1500000.00
1571 date--debug: 1400000.00
1571 date--debug: 1400000.00
1572 date--debug: 1300000.00
1572 date--debug: 1300000.00
1573 date--debug: 1200000.00
1573 date--debug: 1200000.00
1574 date--debug: 1100000.00
1574 date--debug: 1100000.00
1575 date--debug: 1000000.00
1575 date--debug: 1000000.00
1576 desc: third
1576 desc: third
1577 desc: second
1577 desc: second
1578 desc: merge
1578 desc: merge
1579 desc: new head
1579 desc: new head
1580 desc: new branch
1580 desc: new branch
1581 desc: no user, no domain
1581 desc: no user, no domain
1582 desc: no person
1582 desc: no person
1583 desc: other 1
1583 desc: other 1
1584 other 2
1584 other 2
1585
1585
1586 other 3
1586 other 3
1587 desc: line 1
1587 desc: line 1
1588 line 2
1588 line 2
1589 desc--verbose: third
1589 desc--verbose: third
1590 desc--verbose: second
1590 desc--verbose: second
1591 desc--verbose: merge
1591 desc--verbose: merge
1592 desc--verbose: new head
1592 desc--verbose: new head
1593 desc--verbose: new branch
1593 desc--verbose: new branch
1594 desc--verbose: no user, no domain
1594 desc--verbose: no user, no domain
1595 desc--verbose: no person
1595 desc--verbose: no person
1596 desc--verbose: other 1
1596 desc--verbose: other 1
1597 other 2
1597 other 2
1598
1598
1599 other 3
1599 other 3
1600 desc--verbose: line 1
1600 desc--verbose: line 1
1601 line 2
1601 line 2
1602 desc--debug: third
1602 desc--debug: third
1603 desc--debug: second
1603 desc--debug: second
1604 desc--debug: merge
1604 desc--debug: merge
1605 desc--debug: new head
1605 desc--debug: new head
1606 desc--debug: new branch
1606 desc--debug: new branch
1607 desc--debug: no user, no domain
1607 desc--debug: no user, no domain
1608 desc--debug: no person
1608 desc--debug: no person
1609 desc--debug: other 1
1609 desc--debug: other 1
1610 other 2
1610 other 2
1611
1611
1612 other 3
1612 other 3
1613 desc--debug: line 1
1613 desc--debug: line 1
1614 line 2
1614 line 2
1615 file_adds: fourth third
1615 file_adds: fourth third
1616 file_adds: second
1616 file_adds: second
1617 file_adds:
1617 file_adds:
1618 file_adds: d
1618 file_adds: d
1619 file_adds:
1619 file_adds:
1620 file_adds:
1620 file_adds:
1621 file_adds: c
1621 file_adds: c
1622 file_adds: b
1622 file_adds: b
1623 file_adds: a
1623 file_adds: a
1624 file_adds--verbose: fourth third
1624 file_adds--verbose: fourth third
1625 file_adds--verbose: second
1625 file_adds--verbose: second
1626 file_adds--verbose:
1626 file_adds--verbose:
1627 file_adds--verbose: d
1627 file_adds--verbose: d
1628 file_adds--verbose:
1628 file_adds--verbose:
1629 file_adds--verbose:
1629 file_adds--verbose:
1630 file_adds--verbose: c
1630 file_adds--verbose: c
1631 file_adds--verbose: b
1631 file_adds--verbose: b
1632 file_adds--verbose: a
1632 file_adds--verbose: a
1633 file_adds--debug: fourth third
1633 file_adds--debug: fourth third
1634 file_adds--debug: second
1634 file_adds--debug: second
1635 file_adds--debug:
1635 file_adds--debug:
1636 file_adds--debug: d
1636 file_adds--debug: d
1637 file_adds--debug:
1637 file_adds--debug:
1638 file_adds--debug:
1638 file_adds--debug:
1639 file_adds--debug: c
1639 file_adds--debug: c
1640 file_adds--debug: b
1640 file_adds--debug: b
1641 file_adds--debug: a
1641 file_adds--debug: a
1642 file_dels: second
1642 file_dels: second
1643 file_dels:
1643 file_dels:
1644 file_dels:
1644 file_dels:
1645 file_dels:
1645 file_dels:
1646 file_dels:
1646 file_dels:
1647 file_dels:
1647 file_dels:
1648 file_dels:
1648 file_dels:
1649 file_dels:
1649 file_dels:
1650 file_dels:
1650 file_dels:
1651 file_dels--verbose: second
1651 file_dels--verbose: second
1652 file_dels--verbose:
1652 file_dels--verbose:
1653 file_dels--verbose:
1653 file_dels--verbose:
1654 file_dels--verbose:
1654 file_dels--verbose:
1655 file_dels--verbose:
1655 file_dels--verbose:
1656 file_dels--verbose:
1656 file_dels--verbose:
1657 file_dels--verbose:
1657 file_dels--verbose:
1658 file_dels--verbose:
1658 file_dels--verbose:
1659 file_dels--verbose:
1659 file_dels--verbose:
1660 file_dels--debug: second
1660 file_dels--debug: second
1661 file_dels--debug:
1661 file_dels--debug:
1662 file_dels--debug:
1662 file_dels--debug:
1663 file_dels--debug:
1663 file_dels--debug:
1664 file_dels--debug:
1664 file_dels--debug:
1665 file_dels--debug:
1665 file_dels--debug:
1666 file_dels--debug:
1666 file_dels--debug:
1667 file_dels--debug:
1667 file_dels--debug:
1668 file_dels--debug:
1668 file_dels--debug:
1669 file_mods:
1669 file_mods:
1670 file_mods:
1670 file_mods:
1671 file_mods:
1671 file_mods:
1672 file_mods:
1672 file_mods:
1673 file_mods:
1673 file_mods:
1674 file_mods: c
1674 file_mods: c
1675 file_mods:
1675 file_mods:
1676 file_mods:
1676 file_mods:
1677 file_mods:
1677 file_mods:
1678 file_mods--verbose:
1678 file_mods--verbose:
1679 file_mods--verbose:
1679 file_mods--verbose:
1680 file_mods--verbose:
1680 file_mods--verbose:
1681 file_mods--verbose:
1681 file_mods--verbose:
1682 file_mods--verbose:
1682 file_mods--verbose:
1683 file_mods--verbose: c
1683 file_mods--verbose: c
1684 file_mods--verbose:
1684 file_mods--verbose:
1685 file_mods--verbose:
1685 file_mods--verbose:
1686 file_mods--verbose:
1686 file_mods--verbose:
1687 file_mods--debug:
1687 file_mods--debug:
1688 file_mods--debug:
1688 file_mods--debug:
1689 file_mods--debug:
1689 file_mods--debug:
1690 file_mods--debug:
1690 file_mods--debug:
1691 file_mods--debug:
1691 file_mods--debug:
1692 file_mods--debug: c
1692 file_mods--debug: c
1693 file_mods--debug:
1693 file_mods--debug:
1694 file_mods--debug:
1694 file_mods--debug:
1695 file_mods--debug:
1695 file_mods--debug:
1696 file_copies: fourth (second)
1696 file_copies: fourth (second)
1697 file_copies:
1697 file_copies:
1698 file_copies:
1698 file_copies:
1699 file_copies:
1699 file_copies:
1700 file_copies:
1700 file_copies:
1701 file_copies:
1701 file_copies:
1702 file_copies:
1702 file_copies:
1703 file_copies:
1703 file_copies:
1704 file_copies:
1704 file_copies:
1705 file_copies--verbose: fourth (second)
1705 file_copies--verbose: fourth (second)
1706 file_copies--verbose:
1706 file_copies--verbose:
1707 file_copies--verbose:
1707 file_copies--verbose:
1708 file_copies--verbose:
1708 file_copies--verbose:
1709 file_copies--verbose:
1709 file_copies--verbose:
1710 file_copies--verbose:
1710 file_copies--verbose:
1711 file_copies--verbose:
1711 file_copies--verbose:
1712 file_copies--verbose:
1712 file_copies--verbose:
1713 file_copies--verbose:
1713 file_copies--verbose:
1714 file_copies--debug: fourth (second)
1714 file_copies--debug: fourth (second)
1715 file_copies--debug:
1715 file_copies--debug:
1716 file_copies--debug:
1716 file_copies--debug:
1717 file_copies--debug:
1717 file_copies--debug:
1718 file_copies--debug:
1718 file_copies--debug:
1719 file_copies--debug:
1719 file_copies--debug:
1720 file_copies--debug:
1720 file_copies--debug:
1721 file_copies--debug:
1721 file_copies--debug:
1722 file_copies--debug:
1722 file_copies--debug:
1723 file_copies_switch:
1723 file_copies_switch:
1724 file_copies_switch:
1724 file_copies_switch:
1725 file_copies_switch:
1725 file_copies_switch:
1726 file_copies_switch:
1726 file_copies_switch:
1727 file_copies_switch:
1727 file_copies_switch:
1728 file_copies_switch:
1728 file_copies_switch:
1729 file_copies_switch:
1729 file_copies_switch:
1730 file_copies_switch:
1730 file_copies_switch:
1731 file_copies_switch:
1731 file_copies_switch:
1732 file_copies_switch--verbose:
1732 file_copies_switch--verbose:
1733 file_copies_switch--verbose:
1733 file_copies_switch--verbose:
1734 file_copies_switch--verbose:
1734 file_copies_switch--verbose:
1735 file_copies_switch--verbose:
1735 file_copies_switch--verbose:
1736 file_copies_switch--verbose:
1736 file_copies_switch--verbose:
1737 file_copies_switch--verbose:
1737 file_copies_switch--verbose:
1738 file_copies_switch--verbose:
1738 file_copies_switch--verbose:
1739 file_copies_switch--verbose:
1739 file_copies_switch--verbose:
1740 file_copies_switch--verbose:
1740 file_copies_switch--verbose:
1741 file_copies_switch--debug:
1741 file_copies_switch--debug:
1742 file_copies_switch--debug:
1742 file_copies_switch--debug:
1743 file_copies_switch--debug:
1743 file_copies_switch--debug:
1744 file_copies_switch--debug:
1744 file_copies_switch--debug:
1745 file_copies_switch--debug:
1745 file_copies_switch--debug:
1746 file_copies_switch--debug:
1746 file_copies_switch--debug:
1747 file_copies_switch--debug:
1747 file_copies_switch--debug:
1748 file_copies_switch--debug:
1748 file_copies_switch--debug:
1749 file_copies_switch--debug:
1749 file_copies_switch--debug:
1750 files: fourth second third
1750 files: fourth second third
1751 files: second
1751 files: second
1752 files:
1752 files:
1753 files: d
1753 files: d
1754 files:
1754 files:
1755 files: c
1755 files: c
1756 files: c
1756 files: c
1757 files: b
1757 files: b
1758 files: a
1758 files: a
1759 files--verbose: fourth second third
1759 files--verbose: fourth second third
1760 files--verbose: second
1760 files--verbose: second
1761 files--verbose:
1761 files--verbose:
1762 files--verbose: d
1762 files--verbose: d
1763 files--verbose:
1763 files--verbose:
1764 files--verbose: c
1764 files--verbose: c
1765 files--verbose: c
1765 files--verbose: c
1766 files--verbose: b
1766 files--verbose: b
1767 files--verbose: a
1767 files--verbose: a
1768 files--debug: fourth second third
1768 files--debug: fourth second third
1769 files--debug: second
1769 files--debug: second
1770 files--debug:
1770 files--debug:
1771 files--debug: d
1771 files--debug: d
1772 files--debug:
1772 files--debug:
1773 files--debug: c
1773 files--debug: c
1774 files--debug: c
1774 files--debug: c
1775 files--debug: b
1775 files--debug: b
1776 files--debug: a
1776 files--debug: a
1777 manifest: 6:94961b75a2da
1777 manifest: 6:94961b75a2da
1778 manifest: 5:f2dbc354b94e
1778 manifest: 5:f2dbc354b94e
1779 manifest: 4:4dc3def4f9b4
1779 manifest: 4:4dc3def4f9b4
1780 manifest: 4:4dc3def4f9b4
1780 manifest: 4:4dc3def4f9b4
1781 manifest: 3:cb5a1327723b
1781 manifest: 3:cb5a1327723b
1782 manifest: 3:cb5a1327723b
1782 manifest: 3:cb5a1327723b
1783 manifest: 2:6e0e82995c35
1783 manifest: 2:6e0e82995c35
1784 manifest: 1:4e8d705b1e53
1784 manifest: 1:4e8d705b1e53
1785 manifest: 0:a0c8bcbbb45c
1785 manifest: 0:a0c8bcbbb45c
1786 manifest--verbose: 6:94961b75a2da
1786 manifest--verbose: 6:94961b75a2da
1787 manifest--verbose: 5:f2dbc354b94e
1787 manifest--verbose: 5:f2dbc354b94e
1788 manifest--verbose: 4:4dc3def4f9b4
1788 manifest--verbose: 4:4dc3def4f9b4
1789 manifest--verbose: 4:4dc3def4f9b4
1789 manifest--verbose: 4:4dc3def4f9b4
1790 manifest--verbose: 3:cb5a1327723b
1790 manifest--verbose: 3:cb5a1327723b
1791 manifest--verbose: 3:cb5a1327723b
1791 manifest--verbose: 3:cb5a1327723b
1792 manifest--verbose: 2:6e0e82995c35
1792 manifest--verbose: 2:6e0e82995c35
1793 manifest--verbose: 1:4e8d705b1e53
1793 manifest--verbose: 1:4e8d705b1e53
1794 manifest--verbose: 0:a0c8bcbbb45c
1794 manifest--verbose: 0:a0c8bcbbb45c
1795 manifest--debug: 6:94961b75a2da554b4df6fb599e5bfc7d48de0c64
1795 manifest--debug: 6:94961b75a2da554b4df6fb599e5bfc7d48de0c64
1796 manifest--debug: 5:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
1796 manifest--debug: 5:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
1797 manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
1797 manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
1798 manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
1798 manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
1799 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
1799 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
1800 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
1800 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
1801 manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
1801 manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
1802 manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
1802 manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
1803 manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
1803 manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
1804 node: 95c24699272ef57d062b8bccc32c878bf841784a
1804 node: 95c24699272ef57d062b8bccc32c878bf841784a
1805 node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1805 node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1806 node: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1806 node: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1807 node: 13207e5a10d9fd28ec424934298e176197f2c67f
1807 node: 13207e5a10d9fd28ec424934298e176197f2c67f
1808 node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1808 node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1809 node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1809 node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1810 node: 97054abb4ab824450e9164180baf491ae0078465
1810 node: 97054abb4ab824450e9164180baf491ae0078465
1811 node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1811 node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1812 node: 1e4e1b8f71e05681d422154f5421e385fec3454f
1812 node: 1e4e1b8f71e05681d422154f5421e385fec3454f
1813 node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
1813 node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
1814 node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1814 node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1815 node--verbose: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1815 node--verbose: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1816 node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
1816 node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
1817 node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1817 node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1818 node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1818 node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1819 node--verbose: 97054abb4ab824450e9164180baf491ae0078465
1819 node--verbose: 97054abb4ab824450e9164180baf491ae0078465
1820 node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1820 node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1821 node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
1821 node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
1822 node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
1822 node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
1823 node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1823 node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1824 node--debug: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1824 node--debug: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1825 node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
1825 node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
1826 node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1826 node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1827 node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1827 node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1828 node--debug: 97054abb4ab824450e9164180baf491ae0078465
1828 node--debug: 97054abb4ab824450e9164180baf491ae0078465
1829 node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1829 node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1830 node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
1830 node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
1831 parents:
1831 parents:
1832 parents: -1:000000000000
1832 parents: -1:000000000000
1833 parents: 5:13207e5a10d9 4:bbe44766e73d
1833 parents: 5:13207e5a10d9 4:bbe44766e73d
1834 parents: 3:10e46f2dcbf4
1834 parents: 3:10e46f2dcbf4
1835 parents:
1835 parents:
1836 parents:
1836 parents:
1837 parents:
1837 parents:
1838 parents:
1838 parents:
1839 parents:
1839 parents:
1840 parents--verbose:
1840 parents--verbose:
1841 parents--verbose: -1:000000000000
1841 parents--verbose: -1:000000000000
1842 parents--verbose: 5:13207e5a10d9 4:bbe44766e73d
1842 parents--verbose: 5:13207e5a10d9 4:bbe44766e73d
1843 parents--verbose: 3:10e46f2dcbf4
1843 parents--verbose: 3:10e46f2dcbf4
1844 parents--verbose:
1844 parents--verbose:
1845 parents--verbose:
1845 parents--verbose:
1846 parents--verbose:
1846 parents--verbose:
1847 parents--verbose:
1847 parents--verbose:
1848 parents--verbose:
1848 parents--verbose:
1849 parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000
1849 parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000
1850 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
1850 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
1851 parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
1851 parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
1852 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
1852 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
1853 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
1853 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
1854 parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000
1854 parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000
1855 parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000
1855 parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000
1856 parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000
1856 parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000
1857 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
1857 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
1858 rev: 8
1858 rev: 8
1859 rev: 7
1859 rev: 7
1860 rev: 6
1860 rev: 6
1861 rev: 5
1861 rev: 5
1862 rev: 4
1862 rev: 4
1863 rev: 3
1863 rev: 3
1864 rev: 2
1864 rev: 2
1865 rev: 1
1865 rev: 1
1866 rev: 0
1866 rev: 0
1867 rev--verbose: 8
1867 rev--verbose: 8
1868 rev--verbose: 7
1868 rev--verbose: 7
1869 rev--verbose: 6
1869 rev--verbose: 6
1870 rev--verbose: 5
1870 rev--verbose: 5
1871 rev--verbose: 4
1871 rev--verbose: 4
1872 rev--verbose: 3
1872 rev--verbose: 3
1873 rev--verbose: 2
1873 rev--verbose: 2
1874 rev--verbose: 1
1874 rev--verbose: 1
1875 rev--verbose: 0
1875 rev--verbose: 0
1876 rev--debug: 8
1876 rev--debug: 8
1877 rev--debug: 7
1877 rev--debug: 7
1878 rev--debug: 6
1878 rev--debug: 6
1879 rev--debug: 5
1879 rev--debug: 5
1880 rev--debug: 4
1880 rev--debug: 4
1881 rev--debug: 3
1881 rev--debug: 3
1882 rev--debug: 2
1882 rev--debug: 2
1883 rev--debug: 1
1883 rev--debug: 1
1884 rev--debug: 0
1884 rev--debug: 0
1885 tags: tip
1885 tags: tip
1886 tags:
1886 tags:
1887 tags:
1887 tags:
1888 tags:
1888 tags:
1889 tags:
1889 tags:
1890 tags:
1890 tags:
1891 tags:
1891 tags:
1892 tags:
1892 tags:
1893 tags:
1893 tags:
1894 tags--verbose: tip
1894 tags--verbose: tip
1895 tags--verbose:
1895 tags--verbose:
1896 tags--verbose:
1896 tags--verbose:
1897 tags--verbose:
1897 tags--verbose:
1898 tags--verbose:
1898 tags--verbose:
1899 tags--verbose:
1899 tags--verbose:
1900 tags--verbose:
1900 tags--verbose:
1901 tags--verbose:
1901 tags--verbose:
1902 tags--verbose:
1902 tags--verbose:
1903 tags--debug: tip
1903 tags--debug: tip
1904 tags--debug:
1904 tags--debug:
1905 tags--debug:
1905 tags--debug:
1906 tags--debug:
1906 tags--debug:
1907 tags--debug:
1907 tags--debug:
1908 tags--debug:
1908 tags--debug:
1909 tags--debug:
1909 tags--debug:
1910 tags--debug:
1910 tags--debug:
1911 tags--debug:
1911 tags--debug:
1912 diffstat: 3: +2/-1
1912 diffstat: 3: +2/-1
1913 diffstat: 1: +1/-0
1913 diffstat: 1: +1/-0
1914 diffstat: 0: +0/-0
1914 diffstat: 0: +0/-0
1915 diffstat: 1: +1/-0
1915 diffstat: 1: +1/-0
1916 diffstat: 0: +0/-0
1916 diffstat: 0: +0/-0
1917 diffstat: 1: +1/-0
1917 diffstat: 1: +1/-0
1918 diffstat: 1: +4/-0
1918 diffstat: 1: +4/-0
1919 diffstat: 1: +2/-0
1919 diffstat: 1: +2/-0
1920 diffstat: 1: +1/-0
1920 diffstat: 1: +1/-0
1921 diffstat--verbose: 3: +2/-1
1921 diffstat--verbose: 3: +2/-1
1922 diffstat--verbose: 1: +1/-0
1922 diffstat--verbose: 1: +1/-0
1923 diffstat--verbose: 0: +0/-0
1923 diffstat--verbose: 0: +0/-0
1924 diffstat--verbose: 1: +1/-0
1924 diffstat--verbose: 1: +1/-0
1925 diffstat--verbose: 0: +0/-0
1925 diffstat--verbose: 0: +0/-0
1926 diffstat--verbose: 1: +1/-0
1926 diffstat--verbose: 1: +1/-0
1927 diffstat--verbose: 1: +4/-0
1927 diffstat--verbose: 1: +4/-0
1928 diffstat--verbose: 1: +2/-0
1928 diffstat--verbose: 1: +2/-0
1929 diffstat--verbose: 1: +1/-0
1929 diffstat--verbose: 1: +1/-0
1930 diffstat--debug: 3: +2/-1
1930 diffstat--debug: 3: +2/-1
1931 diffstat--debug: 1: +1/-0
1931 diffstat--debug: 1: +1/-0
1932 diffstat--debug: 0: +0/-0
1932 diffstat--debug: 0: +0/-0
1933 diffstat--debug: 1: +1/-0
1933 diffstat--debug: 1: +1/-0
1934 diffstat--debug: 0: +0/-0
1934 diffstat--debug: 0: +0/-0
1935 diffstat--debug: 1: +1/-0
1935 diffstat--debug: 1: +1/-0
1936 diffstat--debug: 1: +4/-0
1936 diffstat--debug: 1: +4/-0
1937 diffstat--debug: 1: +2/-0
1937 diffstat--debug: 1: +2/-0
1938 diffstat--debug: 1: +1/-0
1938 diffstat--debug: 1: +1/-0
1939 extras: branch=default
1939 extras: branch=default
1940 extras: branch=default
1940 extras: branch=default
1941 extras: branch=default
1941 extras: branch=default
1942 extras: branch=default
1942 extras: branch=default
1943 extras: branch=foo
1943 extras: branch=foo
1944 extras: branch=default
1944 extras: branch=default
1945 extras: branch=default
1945 extras: branch=default
1946 extras: branch=default
1946 extras: branch=default
1947 extras: branch=default
1947 extras: branch=default
1948 extras--verbose: branch=default
1948 extras--verbose: branch=default
1949 extras--verbose: branch=default
1949 extras--verbose: branch=default
1950 extras--verbose: branch=default
1950 extras--verbose: branch=default
1951 extras--verbose: branch=default
1951 extras--verbose: branch=default
1952 extras--verbose: branch=foo
1952 extras--verbose: branch=foo
1953 extras--verbose: branch=default
1953 extras--verbose: branch=default
1954 extras--verbose: branch=default
1954 extras--verbose: branch=default
1955 extras--verbose: branch=default
1955 extras--verbose: branch=default
1956 extras--verbose: branch=default
1956 extras--verbose: branch=default
1957 extras--debug: branch=default
1957 extras--debug: branch=default
1958 extras--debug: branch=default
1958 extras--debug: branch=default
1959 extras--debug: branch=default
1959 extras--debug: branch=default
1960 extras--debug: branch=default
1960 extras--debug: branch=default
1961 extras--debug: branch=foo
1961 extras--debug: branch=foo
1962 extras--debug: branch=default
1962 extras--debug: branch=default
1963 extras--debug: branch=default
1963 extras--debug: branch=default
1964 extras--debug: branch=default
1964 extras--debug: branch=default
1965 extras--debug: branch=default
1965 extras--debug: branch=default
1966 p1rev: 7
1966 p1rev: 7
1967 p1rev: -1
1967 p1rev: -1
1968 p1rev: 5
1968 p1rev: 5
1969 p1rev: 3
1969 p1rev: 3
1970 p1rev: 3
1970 p1rev: 3
1971 p1rev: 2
1971 p1rev: 2
1972 p1rev: 1
1972 p1rev: 1
1973 p1rev: 0
1973 p1rev: 0
1974 p1rev: -1
1974 p1rev: -1
1975 p1rev--verbose: 7
1975 p1rev--verbose: 7
1976 p1rev--verbose: -1
1976 p1rev--verbose: -1
1977 p1rev--verbose: 5
1977 p1rev--verbose: 5
1978 p1rev--verbose: 3
1978 p1rev--verbose: 3
1979 p1rev--verbose: 3
1979 p1rev--verbose: 3
1980 p1rev--verbose: 2
1980 p1rev--verbose: 2
1981 p1rev--verbose: 1
1981 p1rev--verbose: 1
1982 p1rev--verbose: 0
1982 p1rev--verbose: 0
1983 p1rev--verbose: -1
1983 p1rev--verbose: -1
1984 p1rev--debug: 7
1984 p1rev--debug: 7
1985 p1rev--debug: -1
1985 p1rev--debug: -1
1986 p1rev--debug: 5
1986 p1rev--debug: 5
1987 p1rev--debug: 3
1987 p1rev--debug: 3
1988 p1rev--debug: 3
1988 p1rev--debug: 3
1989 p1rev--debug: 2
1989 p1rev--debug: 2
1990 p1rev--debug: 1
1990 p1rev--debug: 1
1991 p1rev--debug: 0
1991 p1rev--debug: 0
1992 p1rev--debug: -1
1992 p1rev--debug: -1
1993 p2rev: -1
1993 p2rev: -1
1994 p2rev: -1
1994 p2rev: -1
1995 p2rev: 4
1995 p2rev: 4
1996 p2rev: -1
1996 p2rev: -1
1997 p2rev: -1
1997 p2rev: -1
1998 p2rev: -1
1998 p2rev: -1
1999 p2rev: -1
1999 p2rev: -1
2000 p2rev: -1
2000 p2rev: -1
2001 p2rev: -1
2001 p2rev: -1
2002 p2rev--verbose: -1
2002 p2rev--verbose: -1
2003 p2rev--verbose: -1
2003 p2rev--verbose: -1
2004 p2rev--verbose: 4
2004 p2rev--verbose: 4
2005 p2rev--verbose: -1
2005 p2rev--verbose: -1
2006 p2rev--verbose: -1
2006 p2rev--verbose: -1
2007 p2rev--verbose: -1
2007 p2rev--verbose: -1
2008 p2rev--verbose: -1
2008 p2rev--verbose: -1
2009 p2rev--verbose: -1
2009 p2rev--verbose: -1
2010 p2rev--verbose: -1
2010 p2rev--verbose: -1
2011 p2rev--debug: -1
2011 p2rev--debug: -1
2012 p2rev--debug: -1
2012 p2rev--debug: -1
2013 p2rev--debug: 4
2013 p2rev--debug: 4
2014 p2rev--debug: -1
2014 p2rev--debug: -1
2015 p2rev--debug: -1
2015 p2rev--debug: -1
2016 p2rev--debug: -1
2016 p2rev--debug: -1
2017 p2rev--debug: -1
2017 p2rev--debug: -1
2018 p2rev--debug: -1
2018 p2rev--debug: -1
2019 p2rev--debug: -1
2019 p2rev--debug: -1
2020 p1node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
2020 p1node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
2021 p1node: 0000000000000000000000000000000000000000
2021 p1node: 0000000000000000000000000000000000000000
2022 p1node: 13207e5a10d9fd28ec424934298e176197f2c67f
2022 p1node: 13207e5a10d9fd28ec424934298e176197f2c67f
2023 p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2023 p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2024 p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2024 p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2025 p1node: 97054abb4ab824450e9164180baf491ae0078465
2025 p1node: 97054abb4ab824450e9164180baf491ae0078465
2026 p1node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2026 p1node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2027 p1node: 1e4e1b8f71e05681d422154f5421e385fec3454f
2027 p1node: 1e4e1b8f71e05681d422154f5421e385fec3454f
2028 p1node: 0000000000000000000000000000000000000000
2028 p1node: 0000000000000000000000000000000000000000
2029 p1node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
2029 p1node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
2030 p1node--verbose: 0000000000000000000000000000000000000000
2030 p1node--verbose: 0000000000000000000000000000000000000000
2031 p1node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
2031 p1node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
2032 p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2032 p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2033 p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2033 p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2034 p1node--verbose: 97054abb4ab824450e9164180baf491ae0078465
2034 p1node--verbose: 97054abb4ab824450e9164180baf491ae0078465
2035 p1node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2035 p1node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2036 p1node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
2036 p1node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
2037 p1node--verbose: 0000000000000000000000000000000000000000
2037 p1node--verbose: 0000000000000000000000000000000000000000
2038 p1node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
2038 p1node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
2039 p1node--debug: 0000000000000000000000000000000000000000
2039 p1node--debug: 0000000000000000000000000000000000000000
2040 p1node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
2040 p1node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
2041 p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2041 p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2042 p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2042 p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
2043 p1node--debug: 97054abb4ab824450e9164180baf491ae0078465
2043 p1node--debug: 97054abb4ab824450e9164180baf491ae0078465
2044 p1node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2044 p1node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2045 p1node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
2045 p1node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
2046 p1node--debug: 0000000000000000000000000000000000000000
2046 p1node--debug: 0000000000000000000000000000000000000000
2047 p2node: 0000000000000000000000000000000000000000
2047 p2node: 0000000000000000000000000000000000000000
2048 p2node: 0000000000000000000000000000000000000000
2048 p2node: 0000000000000000000000000000000000000000
2049 p2node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
2049 p2node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
2050 p2node: 0000000000000000000000000000000000000000
2050 p2node: 0000000000000000000000000000000000000000
2051 p2node: 0000000000000000000000000000000000000000
2051 p2node: 0000000000000000000000000000000000000000
2052 p2node: 0000000000000000000000000000000000000000
2052 p2node: 0000000000000000000000000000000000000000
2053 p2node: 0000000000000000000000000000000000000000
2053 p2node: 0000000000000000000000000000000000000000
2054 p2node: 0000000000000000000000000000000000000000
2054 p2node: 0000000000000000000000000000000000000000
2055 p2node: 0000000000000000000000000000000000000000
2055 p2node: 0000000000000000000000000000000000000000
2056 p2node--verbose: 0000000000000000000000000000000000000000
2056 p2node--verbose: 0000000000000000000000000000000000000000
2057 p2node--verbose: 0000000000000000000000000000000000000000
2057 p2node--verbose: 0000000000000000000000000000000000000000
2058 p2node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
2058 p2node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
2059 p2node--verbose: 0000000000000000000000000000000000000000
2059 p2node--verbose: 0000000000000000000000000000000000000000
2060 p2node--verbose: 0000000000000000000000000000000000000000
2060 p2node--verbose: 0000000000000000000000000000000000000000
2061 p2node--verbose: 0000000000000000000000000000000000000000
2061 p2node--verbose: 0000000000000000000000000000000000000000
2062 p2node--verbose: 0000000000000000000000000000000000000000
2062 p2node--verbose: 0000000000000000000000000000000000000000
2063 p2node--verbose: 0000000000000000000000000000000000000000
2063 p2node--verbose: 0000000000000000000000000000000000000000
2064 p2node--verbose: 0000000000000000000000000000000000000000
2064 p2node--verbose: 0000000000000000000000000000000000000000
2065 p2node--debug: 0000000000000000000000000000000000000000
2065 p2node--debug: 0000000000000000000000000000000000000000
2066 p2node--debug: 0000000000000000000000000000000000000000
2066 p2node--debug: 0000000000000000000000000000000000000000
2067 p2node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
2067 p2node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
2068 p2node--debug: 0000000000000000000000000000000000000000
2068 p2node--debug: 0000000000000000000000000000000000000000
2069 p2node--debug: 0000000000000000000000000000000000000000
2069 p2node--debug: 0000000000000000000000000000000000000000
2070 p2node--debug: 0000000000000000000000000000000000000000
2070 p2node--debug: 0000000000000000000000000000000000000000
2071 p2node--debug: 0000000000000000000000000000000000000000
2071 p2node--debug: 0000000000000000000000000000000000000000
2072 p2node--debug: 0000000000000000000000000000000000000000
2072 p2node--debug: 0000000000000000000000000000000000000000
2073 p2node--debug: 0000000000000000000000000000000000000000
2073 p2node--debug: 0000000000000000000000000000000000000000
2074
2074
2075 Filters work:
2075 Filters work:
2076
2076
2077 $ hg log --template '{author|domain}\n'
2077 $ hg log --template '{author|domain}\n'
2078
2078
2079 hostname
2079 hostname
2080
2080
2081
2081
2082
2082
2083
2083
2084 place
2084 place
2085 place
2085 place
2086 hostname
2086 hostname
2087
2087
2088 $ hg log --template '{author|person}\n'
2088 $ hg log --template '{author|person}\n'
2089 test
2089 test
2090 User Name
2090 User Name
2091 person
2091 person
2092 person
2092 person
2093 person
2093 person
2094 person
2094 person
2095 other
2095 other
2096 A. N. Other
2096 A. N. Other
2097 User Name
2097 User Name
2098
2098
2099 $ hg log --template '{author|user}\n'
2099 $ hg log --template '{author|user}\n'
2100 test
2100 test
2101 user
2101 user
2102 person
2102 person
2103 person
2103 person
2104 person
2104 person
2105 person
2105 person
2106 other
2106 other
2107 other
2107 other
2108 user
2108 user
2109
2109
2110 $ hg log --template '{date|date}\n'
2110 $ hg log --template '{date|date}\n'
2111 Wed Jan 01 10:01:00 2020 +0000
2111 Wed Jan 01 10:01:00 2020 +0000
2112 Mon Jan 12 13:46:40 1970 +0000
2112 Mon Jan 12 13:46:40 1970 +0000
2113 Sun Jan 18 08:40:01 1970 +0000
2113 Sun Jan 18 08:40:01 1970 +0000
2114 Sun Jan 18 08:40:00 1970 +0000
2114 Sun Jan 18 08:40:00 1970 +0000
2115 Sat Jan 17 04:53:20 1970 +0000
2115 Sat Jan 17 04:53:20 1970 +0000
2116 Fri Jan 16 01:06:40 1970 +0000
2116 Fri Jan 16 01:06:40 1970 +0000
2117 Wed Jan 14 21:20:00 1970 +0000
2117 Wed Jan 14 21:20:00 1970 +0000
2118 Tue Jan 13 17:33:20 1970 +0000
2118 Tue Jan 13 17:33:20 1970 +0000
2119 Mon Jan 12 13:46:40 1970 +0000
2119 Mon Jan 12 13:46:40 1970 +0000
2120
2120
2121 $ hg log --template '{date|isodate}\n'
2121 $ hg log --template '{date|isodate}\n'
2122 2020-01-01 10:01 +0000
2122 2020-01-01 10:01 +0000
2123 1970-01-12 13:46 +0000
2123 1970-01-12 13:46 +0000
2124 1970-01-18 08:40 +0000
2124 1970-01-18 08:40 +0000
2125 1970-01-18 08:40 +0000
2125 1970-01-18 08:40 +0000
2126 1970-01-17 04:53 +0000
2126 1970-01-17 04:53 +0000
2127 1970-01-16 01:06 +0000
2127 1970-01-16 01:06 +0000
2128 1970-01-14 21:20 +0000
2128 1970-01-14 21:20 +0000
2129 1970-01-13 17:33 +0000
2129 1970-01-13 17:33 +0000
2130 1970-01-12 13:46 +0000
2130 1970-01-12 13:46 +0000
2131
2131
2132 $ hg log --template '{date|isodatesec}\n'
2132 $ hg log --template '{date|isodatesec}\n'
2133 2020-01-01 10:01:00 +0000
2133 2020-01-01 10:01:00 +0000
2134 1970-01-12 13:46:40 +0000
2134 1970-01-12 13:46:40 +0000
2135 1970-01-18 08:40:01 +0000
2135 1970-01-18 08:40:01 +0000
2136 1970-01-18 08:40:00 +0000
2136 1970-01-18 08:40:00 +0000
2137 1970-01-17 04:53:20 +0000
2137 1970-01-17 04:53:20 +0000
2138 1970-01-16 01:06:40 +0000
2138 1970-01-16 01:06:40 +0000
2139 1970-01-14 21:20:00 +0000
2139 1970-01-14 21:20:00 +0000
2140 1970-01-13 17:33:20 +0000
2140 1970-01-13 17:33:20 +0000
2141 1970-01-12 13:46:40 +0000
2141 1970-01-12 13:46:40 +0000
2142
2142
2143 $ hg log --template '{date|rfc822date}\n'
2143 $ hg log --template '{date|rfc822date}\n'
2144 Wed, 01 Jan 2020 10:01:00 +0000
2144 Wed, 01 Jan 2020 10:01:00 +0000
2145 Mon, 12 Jan 1970 13:46:40 +0000
2145 Mon, 12 Jan 1970 13:46:40 +0000
2146 Sun, 18 Jan 1970 08:40:01 +0000
2146 Sun, 18 Jan 1970 08:40:01 +0000
2147 Sun, 18 Jan 1970 08:40:00 +0000
2147 Sun, 18 Jan 1970 08:40:00 +0000
2148 Sat, 17 Jan 1970 04:53:20 +0000
2148 Sat, 17 Jan 1970 04:53:20 +0000
2149 Fri, 16 Jan 1970 01:06:40 +0000
2149 Fri, 16 Jan 1970 01:06:40 +0000
2150 Wed, 14 Jan 1970 21:20:00 +0000
2150 Wed, 14 Jan 1970 21:20:00 +0000
2151 Tue, 13 Jan 1970 17:33:20 +0000
2151 Tue, 13 Jan 1970 17:33:20 +0000
2152 Mon, 12 Jan 1970 13:46:40 +0000
2152 Mon, 12 Jan 1970 13:46:40 +0000
2153
2153
2154 $ hg log --template '{desc|firstline}\n'
2154 $ hg log --template '{desc|firstline}\n'
2155 third
2155 third
2156 second
2156 second
2157 merge
2157 merge
2158 new head
2158 new head
2159 new branch
2159 new branch
2160 no user, no domain
2160 no user, no domain
2161 no person
2161 no person
2162 other 1
2162 other 1
2163 line 1
2163 line 1
2164
2164
2165 $ hg log --template '{node|short}\n'
2165 $ hg log --template '{node|short}\n'
2166 95c24699272e
2166 95c24699272e
2167 29114dbae42b
2167 29114dbae42b
2168 d41e714fe50d
2168 d41e714fe50d
2169 13207e5a10d9
2169 13207e5a10d9
2170 bbe44766e73d
2170 bbe44766e73d
2171 10e46f2dcbf4
2171 10e46f2dcbf4
2172 97054abb4ab8
2172 97054abb4ab8
2173 b608e9d1a3f0
2173 b608e9d1a3f0
2174 1e4e1b8f71e0
2174 1e4e1b8f71e0
2175
2175
2176 $ hg log --template '<changeset author="{author|xmlescape}"/>\n'
2176 $ hg log --template '<changeset author="{author|xmlescape}"/>\n'
2177 <changeset author="test"/>
2177 <changeset author="test"/>
2178 <changeset author="User Name &lt;user@hostname&gt;"/>
2178 <changeset author="User Name &lt;user@hostname&gt;"/>
2179 <changeset author="person"/>
2179 <changeset author="person"/>
2180 <changeset author="person"/>
2180 <changeset author="person"/>
2181 <changeset author="person"/>
2181 <changeset author="person"/>
2182 <changeset author="person"/>
2182 <changeset author="person"/>
2183 <changeset author="other@place"/>
2183 <changeset author="other@place"/>
2184 <changeset author="A. N. Other &lt;other@place&gt;"/>
2184 <changeset author="A. N. Other &lt;other@place&gt;"/>
2185 <changeset author="User Name &lt;user@hostname&gt;"/>
2185 <changeset author="User Name &lt;user@hostname&gt;"/>
2186
2186
2187 $ hg log --template '{rev}: {children}\n'
2187 $ hg log --template '{rev}: {children}\n'
2188 8:
2188 8:
2189 7: 8:95c24699272e
2189 7: 8:95c24699272e
2190 6:
2190 6:
2191 5: 6:d41e714fe50d
2191 5: 6:d41e714fe50d
2192 4: 6:d41e714fe50d
2192 4: 6:d41e714fe50d
2193 3: 4:bbe44766e73d 5:13207e5a10d9
2193 3: 4:bbe44766e73d 5:13207e5a10d9
2194 2: 3:10e46f2dcbf4
2194 2: 3:10e46f2dcbf4
2195 1: 2:97054abb4ab8
2195 1: 2:97054abb4ab8
2196 0: 1:b608e9d1a3f0
2196 0: 1:b608e9d1a3f0
2197
2197
2198 Formatnode filter works:
2198 Formatnode filter works:
2199
2199
2200 $ hg -q log -r 0 --template '{node|formatnode}\n'
2200 $ hg -q log -r 0 --template '{node|formatnode}\n'
2201 1e4e1b8f71e0
2201 1e4e1b8f71e0
2202
2202
2203 $ hg log -r 0 --template '{node|formatnode}\n'
2203 $ hg log -r 0 --template '{node|formatnode}\n'
2204 1e4e1b8f71e0
2204 1e4e1b8f71e0
2205
2205
2206 $ hg -v log -r 0 --template '{node|formatnode}\n'
2206 $ hg -v log -r 0 --template '{node|formatnode}\n'
2207 1e4e1b8f71e0
2207 1e4e1b8f71e0
2208
2208
2209 $ hg --debug log -r 0 --template '{node|formatnode}\n'
2209 $ hg --debug log -r 0 --template '{node|formatnode}\n'
2210 1e4e1b8f71e05681d422154f5421e385fec3454f
2210 1e4e1b8f71e05681d422154f5421e385fec3454f
2211
2211
2212 Age filter:
2212 Age filter:
2213
2213
2214 $ hg init unstable-hash
2214 $ hg init unstable-hash
2215 $ cd unstable-hash
2215 $ cd unstable-hash
2216 $ hg log --template '{date|age}\n' > /dev/null || exit 1
2216 $ hg log --template '{date|age}\n' > /dev/null || exit 1
2217
2217
2218 >>> from __future__ import absolute_import
2218 >>> from __future__ import absolute_import
2219 >>> import datetime
2219 >>> import datetime
2220 >>> fp = open('a', 'wb')
2220 >>> fp = open('a', 'wb')
2221 >>> n = datetime.datetime.now() + datetime.timedelta(366 * 7)
2221 >>> n = datetime.datetime.now() + datetime.timedelta(366 * 7)
2222 >>> fp.write(b'%d-%d-%d 00:00' % (n.year, n.month, n.day)) and None
2222 >>> fp.write(b'%d-%d-%d 00:00' % (n.year, n.month, n.day)) and None
2223 >>> fp.close()
2223 >>> fp.close()
2224 $ hg add a
2224 $ hg add a
2225 $ hg commit -m future -d "`cat a`"
2225 $ hg commit -m future -d "`cat a`"
2226
2226
2227 $ hg log -l1 --template '{date|age}\n'
2227 $ hg log -l1 --template '{date|age}\n'
2228 7 years from now
2228 7 years from now
2229
2229
2230 $ cd ..
2230 $ cd ..
2231 $ rm -rf unstable-hash
2231 $ rm -rf unstable-hash
2232
2232
2233 Filename filters:
2233 Filename filters:
2234
2234
2235 $ hg debugtemplate '{"foo/bar"|basename}|{"foo/"|basename}|{"foo"|basename}|\n'
2235 $ hg debugtemplate '{"foo/bar"|basename}|{"foo/"|basename}|{"foo"|basename}|\n'
2236 bar||foo|
2236 bar||foo|
2237 $ hg debugtemplate '{"foo/bar"|dirname}|{"foo/"|dirname}|{"foo"|dirname}|\n'
2237 $ hg debugtemplate '{"foo/bar"|dirname}|{"foo/"|dirname}|{"foo"|dirname}|\n'
2238 foo|foo||
2238 foo|foo||
2239 $ hg debugtemplate '{"foo/bar"|stripdir}|{"foo/"|stripdir}|{"foo"|stripdir}|\n'
2239 $ hg debugtemplate '{"foo/bar"|stripdir}|{"foo/"|stripdir}|{"foo"|stripdir}|\n'
2240 foo|foo|foo|
2240 foo|foo|foo|
2241
2241
2242 Add a dummy commit to make up for the instability of the above:
2242 Add a dummy commit to make up for the instability of the above:
2243
2243
2244 $ echo a > a
2244 $ echo a > a
2245 $ hg add a
2245 $ hg add a
2246 $ hg ci -m future
2246 $ hg ci -m future
2247
2247
2248 Count filter:
2248 Count filter:
2249
2249
2250 $ hg log -l1 --template '{node|count} {node|short|count}\n'
2250 $ hg log -l1 --template '{node|count} {node|short|count}\n'
2251 40 12
2251 40 12
2252
2252
2253 $ hg log -l1 --template '{revset("null^")|count} {revset(".")|count} {revset("0::3")|count}\n'
2253 $ hg log -l1 --template '{revset("null^")|count} {revset(".")|count} {revset("0::3")|count}\n'
2254 0 1 4
2254 0 1 4
2255
2255
2256 $ hg log -G --template '{rev}: children: {children|count}, \
2256 $ hg log -G --template '{rev}: children: {children|count}, \
2257 > tags: {tags|count}, file_adds: {file_adds|count}, \
2257 > tags: {tags|count}, file_adds: {file_adds|count}, \
2258 > ancestors: {revset("ancestors(%s)", rev)|count}'
2258 > ancestors: {revset("ancestors(%s)", rev)|count}'
2259 @ 9: children: 0, tags: 1, file_adds: 1, ancestors: 3
2259 @ 9: children: 0, tags: 1, file_adds: 1, ancestors: 3
2260 |
2260 |
2261 o 8: children: 1, tags: 0, file_adds: 2, ancestors: 2
2261 o 8: children: 1, tags: 0, file_adds: 2, ancestors: 2
2262 |
2262 |
2263 o 7: children: 1, tags: 0, file_adds: 1, ancestors: 1
2263 o 7: children: 1, tags: 0, file_adds: 1, ancestors: 1
2264
2264
2265 o 6: children: 0, tags: 0, file_adds: 0, ancestors: 7
2265 o 6: children: 0, tags: 0, file_adds: 0, ancestors: 7
2266 |\
2266 |\
2267 | o 5: children: 1, tags: 0, file_adds: 1, ancestors: 5
2267 | o 5: children: 1, tags: 0, file_adds: 1, ancestors: 5
2268 | |
2268 | |
2269 o | 4: children: 1, tags: 0, file_adds: 0, ancestors: 5
2269 o | 4: children: 1, tags: 0, file_adds: 0, ancestors: 5
2270 |/
2270 |/
2271 o 3: children: 2, tags: 0, file_adds: 0, ancestors: 4
2271 o 3: children: 2, tags: 0, file_adds: 0, ancestors: 4
2272 |
2272 |
2273 o 2: children: 1, tags: 0, file_adds: 1, ancestors: 3
2273 o 2: children: 1, tags: 0, file_adds: 1, ancestors: 3
2274 |
2274 |
2275 o 1: children: 1, tags: 0, file_adds: 1, ancestors: 2
2275 o 1: children: 1, tags: 0, file_adds: 1, ancestors: 2
2276 |
2276 |
2277 o 0: children: 1, tags: 0, file_adds: 1, ancestors: 1
2277 o 0: children: 1, tags: 0, file_adds: 1, ancestors: 1
2278
2278
2279
2279
2280 $ hg log -l1 -T '{termwidth|count}\n'
2281 hg: parse error: not countable
2282 (template filter 'count' is not compatible with keyword 'termwidth')
2283 [255]
2284
2280 Upper/lower filters:
2285 Upper/lower filters:
2281
2286
2282 $ hg log -r0 --template '{branch|upper}\n'
2287 $ hg log -r0 --template '{branch|upper}\n'
2283 DEFAULT
2288 DEFAULT
2284 $ hg log -r0 --template '{author|lower}\n'
2289 $ hg log -r0 --template '{author|lower}\n'
2285 user name <user@hostname>
2290 user name <user@hostname>
2286 $ hg log -r0 --template '{date|upper}\n'
2291 $ hg log -r0 --template '{date|upper}\n'
2287 1000000.00
2292 1000000.00
2288
2293
2289 Add a commit that does all possible modifications at once
2294 Add a commit that does all possible modifications at once
2290
2295
2291 $ echo modify >> third
2296 $ echo modify >> third
2292 $ touch b
2297 $ touch b
2293 $ hg add b
2298 $ hg add b
2294 $ hg mv fourth fifth
2299 $ hg mv fourth fifth
2295 $ hg rm a
2300 $ hg rm a
2296 $ hg ci -m "Modify, add, remove, rename"
2301 $ hg ci -m "Modify, add, remove, rename"
2297
2302
2298 Check the status template
2303 Check the status template
2299
2304
2300 $ cat <<EOF >> $HGRCPATH
2305 $ cat <<EOF >> $HGRCPATH
2301 > [extensions]
2306 > [extensions]
2302 > color=
2307 > color=
2303 > EOF
2308 > EOF
2304
2309
2305 $ hg log -T status -r 10
2310 $ hg log -T status -r 10
2306 changeset: 10:0f9759ec227a
2311 changeset: 10:0f9759ec227a
2307 tag: tip
2312 tag: tip
2308 user: test
2313 user: test
2309 date: Thu Jan 01 00:00:00 1970 +0000
2314 date: Thu Jan 01 00:00:00 1970 +0000
2310 summary: Modify, add, remove, rename
2315 summary: Modify, add, remove, rename
2311 files:
2316 files:
2312 M third
2317 M third
2313 A b
2318 A b
2314 A fifth
2319 A fifth
2315 R a
2320 R a
2316 R fourth
2321 R fourth
2317
2322
2318 $ hg log -T status -C -r 10
2323 $ hg log -T status -C -r 10
2319 changeset: 10:0f9759ec227a
2324 changeset: 10:0f9759ec227a
2320 tag: tip
2325 tag: tip
2321 user: test
2326 user: test
2322 date: Thu Jan 01 00:00:00 1970 +0000
2327 date: Thu Jan 01 00:00:00 1970 +0000
2323 summary: Modify, add, remove, rename
2328 summary: Modify, add, remove, rename
2324 files:
2329 files:
2325 M third
2330 M third
2326 A b
2331 A b
2327 A fifth
2332 A fifth
2328 fourth
2333 fourth
2329 R a
2334 R a
2330 R fourth
2335 R fourth
2331
2336
2332 $ hg log -T status -C -r 10 -v
2337 $ hg log -T status -C -r 10 -v
2333 changeset: 10:0f9759ec227a
2338 changeset: 10:0f9759ec227a
2334 tag: tip
2339 tag: tip
2335 user: test
2340 user: test
2336 date: Thu Jan 01 00:00:00 1970 +0000
2341 date: Thu Jan 01 00:00:00 1970 +0000
2337 description:
2342 description:
2338 Modify, add, remove, rename
2343 Modify, add, remove, rename
2339
2344
2340 files:
2345 files:
2341 M third
2346 M third
2342 A b
2347 A b
2343 A fifth
2348 A fifth
2344 fourth
2349 fourth
2345 R a
2350 R a
2346 R fourth
2351 R fourth
2347
2352
2348 $ hg log -T status -C -r 10 --debug
2353 $ hg log -T status -C -r 10 --debug
2349 changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c
2354 changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c
2350 tag: tip
2355 tag: tip
2351 phase: secret
2356 phase: secret
2352 parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066
2357 parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066
2353 parent: -1:0000000000000000000000000000000000000000
2358 parent: -1:0000000000000000000000000000000000000000
2354 manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567
2359 manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567
2355 user: test
2360 user: test
2356 date: Thu Jan 01 00:00:00 1970 +0000
2361 date: Thu Jan 01 00:00:00 1970 +0000
2357 extra: branch=default
2362 extra: branch=default
2358 description:
2363 description:
2359 Modify, add, remove, rename
2364 Modify, add, remove, rename
2360
2365
2361 files:
2366 files:
2362 M third
2367 M third
2363 A b
2368 A b
2364 A fifth
2369 A fifth
2365 fourth
2370 fourth
2366 R a
2371 R a
2367 R fourth
2372 R fourth
2368
2373
2369 $ hg log -T status -C -r 10 --quiet
2374 $ hg log -T status -C -r 10 --quiet
2370 10:0f9759ec227a
2375 10:0f9759ec227a
2371 $ hg --color=debug log -T status -r 10
2376 $ hg --color=debug log -T status -r 10
2372 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2377 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2373 [log.tag|tag: tip]
2378 [log.tag|tag: tip]
2374 [log.user|user: test]
2379 [log.user|user: test]
2375 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2380 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2376 [log.summary|summary: Modify, add, remove, rename]
2381 [log.summary|summary: Modify, add, remove, rename]
2377 [ui.note log.files|files:]
2382 [ui.note log.files|files:]
2378 [status.modified|M third]
2383 [status.modified|M third]
2379 [status.added|A b]
2384 [status.added|A b]
2380 [status.added|A fifth]
2385 [status.added|A fifth]
2381 [status.removed|R a]
2386 [status.removed|R a]
2382 [status.removed|R fourth]
2387 [status.removed|R fourth]
2383
2388
2384 $ hg --color=debug log -T status -C -r 10
2389 $ hg --color=debug log -T status -C -r 10
2385 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2390 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2386 [log.tag|tag: tip]
2391 [log.tag|tag: tip]
2387 [log.user|user: test]
2392 [log.user|user: test]
2388 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2393 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2389 [log.summary|summary: Modify, add, remove, rename]
2394 [log.summary|summary: Modify, add, remove, rename]
2390 [ui.note log.files|files:]
2395 [ui.note log.files|files:]
2391 [status.modified|M third]
2396 [status.modified|M third]
2392 [status.added|A b]
2397 [status.added|A b]
2393 [status.added|A fifth]
2398 [status.added|A fifth]
2394 [status.copied| fourth]
2399 [status.copied| fourth]
2395 [status.removed|R a]
2400 [status.removed|R a]
2396 [status.removed|R fourth]
2401 [status.removed|R fourth]
2397
2402
2398 $ hg --color=debug log -T status -C -r 10 -v
2403 $ hg --color=debug log -T status -C -r 10 -v
2399 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2404 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2400 [log.tag|tag: tip]
2405 [log.tag|tag: tip]
2401 [log.user|user: test]
2406 [log.user|user: test]
2402 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2407 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2403 [ui.note log.description|description:]
2408 [ui.note log.description|description:]
2404 [ui.note log.description|Modify, add, remove, rename]
2409 [ui.note log.description|Modify, add, remove, rename]
2405
2410
2406 [ui.note log.files|files:]
2411 [ui.note log.files|files:]
2407 [status.modified|M third]
2412 [status.modified|M third]
2408 [status.added|A b]
2413 [status.added|A b]
2409 [status.added|A fifth]
2414 [status.added|A fifth]
2410 [status.copied| fourth]
2415 [status.copied| fourth]
2411 [status.removed|R a]
2416 [status.removed|R a]
2412 [status.removed|R fourth]
2417 [status.removed|R fourth]
2413
2418
2414 $ hg --color=debug log -T status -C -r 10 --debug
2419 $ hg --color=debug log -T status -C -r 10 --debug
2415 [log.changeset changeset.secret|changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c]
2420 [log.changeset changeset.secret|changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c]
2416 [log.tag|tag: tip]
2421 [log.tag|tag: tip]
2417 [log.phase|phase: secret]
2422 [log.phase|phase: secret]
2418 [log.parent changeset.secret|parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066]
2423 [log.parent changeset.secret|parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066]
2419 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2424 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2420 [ui.debug log.manifest|manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567]
2425 [ui.debug log.manifest|manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567]
2421 [log.user|user: test]
2426 [log.user|user: test]
2422 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2427 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2423 [ui.debug log.extra|extra: branch=default]
2428 [ui.debug log.extra|extra: branch=default]
2424 [ui.note log.description|description:]
2429 [ui.note log.description|description:]
2425 [ui.note log.description|Modify, add, remove, rename]
2430 [ui.note log.description|Modify, add, remove, rename]
2426
2431
2427 [ui.note log.files|files:]
2432 [ui.note log.files|files:]
2428 [status.modified|M third]
2433 [status.modified|M third]
2429 [status.added|A b]
2434 [status.added|A b]
2430 [status.added|A fifth]
2435 [status.added|A fifth]
2431 [status.copied| fourth]
2436 [status.copied| fourth]
2432 [status.removed|R a]
2437 [status.removed|R a]
2433 [status.removed|R fourth]
2438 [status.removed|R fourth]
2434
2439
2435 $ hg --color=debug log -T status -C -r 10 --quiet
2440 $ hg --color=debug log -T status -C -r 10 --quiet
2436 [log.node|10:0f9759ec227a]
2441 [log.node|10:0f9759ec227a]
2437
2442
2438 Check the bisect template
2443 Check the bisect template
2439
2444
2440 $ hg bisect -g 1
2445 $ hg bisect -g 1
2441 $ hg bisect -b 3 --noupdate
2446 $ hg bisect -b 3 --noupdate
2442 Testing changeset 2:97054abb4ab8 (2 changesets remaining, ~1 tests)
2447 Testing changeset 2:97054abb4ab8 (2 changesets remaining, ~1 tests)
2443 $ hg log -T bisect -r 0:4
2448 $ hg log -T bisect -r 0:4
2444 changeset: 0:1e4e1b8f71e0
2449 changeset: 0:1e4e1b8f71e0
2445 bisect: good (implicit)
2450 bisect: good (implicit)
2446 user: User Name <user@hostname>
2451 user: User Name <user@hostname>
2447 date: Mon Jan 12 13:46:40 1970 +0000
2452 date: Mon Jan 12 13:46:40 1970 +0000
2448 summary: line 1
2453 summary: line 1
2449
2454
2450 changeset: 1:b608e9d1a3f0
2455 changeset: 1:b608e9d1a3f0
2451 bisect: good
2456 bisect: good
2452 user: A. N. Other <other@place>
2457 user: A. N. Other <other@place>
2453 date: Tue Jan 13 17:33:20 1970 +0000
2458 date: Tue Jan 13 17:33:20 1970 +0000
2454 summary: other 1
2459 summary: other 1
2455
2460
2456 changeset: 2:97054abb4ab8
2461 changeset: 2:97054abb4ab8
2457 bisect: untested
2462 bisect: untested
2458 user: other@place
2463 user: other@place
2459 date: Wed Jan 14 21:20:00 1970 +0000
2464 date: Wed Jan 14 21:20:00 1970 +0000
2460 summary: no person
2465 summary: no person
2461
2466
2462 changeset: 3:10e46f2dcbf4
2467 changeset: 3:10e46f2dcbf4
2463 bisect: bad
2468 bisect: bad
2464 user: person
2469 user: person
2465 date: Fri Jan 16 01:06:40 1970 +0000
2470 date: Fri Jan 16 01:06:40 1970 +0000
2466 summary: no user, no domain
2471 summary: no user, no domain
2467
2472
2468 changeset: 4:bbe44766e73d
2473 changeset: 4:bbe44766e73d
2469 bisect: bad (implicit)
2474 bisect: bad (implicit)
2470 branch: foo
2475 branch: foo
2471 user: person
2476 user: person
2472 date: Sat Jan 17 04:53:20 1970 +0000
2477 date: Sat Jan 17 04:53:20 1970 +0000
2473 summary: new branch
2478 summary: new branch
2474
2479
2475 $ hg log --debug -T bisect -r 0:4
2480 $ hg log --debug -T bisect -r 0:4
2476 changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
2481 changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
2477 bisect: good (implicit)
2482 bisect: good (implicit)
2478 phase: public
2483 phase: public
2479 parent: -1:0000000000000000000000000000000000000000
2484 parent: -1:0000000000000000000000000000000000000000
2480 parent: -1:0000000000000000000000000000000000000000
2485 parent: -1:0000000000000000000000000000000000000000
2481 manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
2486 manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
2482 user: User Name <user@hostname>
2487 user: User Name <user@hostname>
2483 date: Mon Jan 12 13:46:40 1970 +0000
2488 date: Mon Jan 12 13:46:40 1970 +0000
2484 files+: a
2489 files+: a
2485 extra: branch=default
2490 extra: branch=default
2486 description:
2491 description:
2487 line 1
2492 line 1
2488 line 2
2493 line 2
2489
2494
2490
2495
2491 changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2496 changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2492 bisect: good
2497 bisect: good
2493 phase: public
2498 phase: public
2494 parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
2499 parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
2495 parent: -1:0000000000000000000000000000000000000000
2500 parent: -1:0000000000000000000000000000000000000000
2496 manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
2501 manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
2497 user: A. N. Other <other@place>
2502 user: A. N. Other <other@place>
2498 date: Tue Jan 13 17:33:20 1970 +0000
2503 date: Tue Jan 13 17:33:20 1970 +0000
2499 files+: b
2504 files+: b
2500 extra: branch=default
2505 extra: branch=default
2501 description:
2506 description:
2502 other 1
2507 other 1
2503 other 2
2508 other 2
2504
2509
2505 other 3
2510 other 3
2506
2511
2507
2512
2508 changeset: 2:97054abb4ab824450e9164180baf491ae0078465
2513 changeset: 2:97054abb4ab824450e9164180baf491ae0078465
2509 bisect: untested
2514 bisect: untested
2510 phase: public
2515 phase: public
2511 parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2516 parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2512 parent: -1:0000000000000000000000000000000000000000
2517 parent: -1:0000000000000000000000000000000000000000
2513 manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
2518 manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
2514 user: other@place
2519 user: other@place
2515 date: Wed Jan 14 21:20:00 1970 +0000
2520 date: Wed Jan 14 21:20:00 1970 +0000
2516 files+: c
2521 files+: c
2517 extra: branch=default
2522 extra: branch=default
2518 description:
2523 description:
2519 no person
2524 no person
2520
2525
2521
2526
2522 changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
2527 changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
2523 bisect: bad
2528 bisect: bad
2524 phase: public
2529 phase: public
2525 parent: 2:97054abb4ab824450e9164180baf491ae0078465
2530 parent: 2:97054abb4ab824450e9164180baf491ae0078465
2526 parent: -1:0000000000000000000000000000000000000000
2531 parent: -1:0000000000000000000000000000000000000000
2527 manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
2532 manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
2528 user: person
2533 user: person
2529 date: Fri Jan 16 01:06:40 1970 +0000
2534 date: Fri Jan 16 01:06:40 1970 +0000
2530 files: c
2535 files: c
2531 extra: branch=default
2536 extra: branch=default
2532 description:
2537 description:
2533 no user, no domain
2538 no user, no domain
2534
2539
2535
2540
2536 changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
2541 changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
2537 bisect: bad (implicit)
2542 bisect: bad (implicit)
2538 branch: foo
2543 branch: foo
2539 phase: draft
2544 phase: draft
2540 parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
2545 parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
2541 parent: -1:0000000000000000000000000000000000000000
2546 parent: -1:0000000000000000000000000000000000000000
2542 manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
2547 manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
2543 user: person
2548 user: person
2544 date: Sat Jan 17 04:53:20 1970 +0000
2549 date: Sat Jan 17 04:53:20 1970 +0000
2545 extra: branch=foo
2550 extra: branch=foo
2546 description:
2551 description:
2547 new branch
2552 new branch
2548
2553
2549
2554
2550 $ hg log -v -T bisect -r 0:4
2555 $ hg log -v -T bisect -r 0:4
2551 changeset: 0:1e4e1b8f71e0
2556 changeset: 0:1e4e1b8f71e0
2552 bisect: good (implicit)
2557 bisect: good (implicit)
2553 user: User Name <user@hostname>
2558 user: User Name <user@hostname>
2554 date: Mon Jan 12 13:46:40 1970 +0000
2559 date: Mon Jan 12 13:46:40 1970 +0000
2555 files: a
2560 files: a
2556 description:
2561 description:
2557 line 1
2562 line 1
2558 line 2
2563 line 2
2559
2564
2560
2565
2561 changeset: 1:b608e9d1a3f0
2566 changeset: 1:b608e9d1a3f0
2562 bisect: good
2567 bisect: good
2563 user: A. N. Other <other@place>
2568 user: A. N. Other <other@place>
2564 date: Tue Jan 13 17:33:20 1970 +0000
2569 date: Tue Jan 13 17:33:20 1970 +0000
2565 files: b
2570 files: b
2566 description:
2571 description:
2567 other 1
2572 other 1
2568 other 2
2573 other 2
2569
2574
2570 other 3
2575 other 3
2571
2576
2572
2577
2573 changeset: 2:97054abb4ab8
2578 changeset: 2:97054abb4ab8
2574 bisect: untested
2579 bisect: untested
2575 user: other@place
2580 user: other@place
2576 date: Wed Jan 14 21:20:00 1970 +0000
2581 date: Wed Jan 14 21:20:00 1970 +0000
2577 files: c
2582 files: c
2578 description:
2583 description:
2579 no person
2584 no person
2580
2585
2581
2586
2582 changeset: 3:10e46f2dcbf4
2587 changeset: 3:10e46f2dcbf4
2583 bisect: bad
2588 bisect: bad
2584 user: person
2589 user: person
2585 date: Fri Jan 16 01:06:40 1970 +0000
2590 date: Fri Jan 16 01:06:40 1970 +0000
2586 files: c
2591 files: c
2587 description:
2592 description:
2588 no user, no domain
2593 no user, no domain
2589
2594
2590
2595
2591 changeset: 4:bbe44766e73d
2596 changeset: 4:bbe44766e73d
2592 bisect: bad (implicit)
2597 bisect: bad (implicit)
2593 branch: foo
2598 branch: foo
2594 user: person
2599 user: person
2595 date: Sat Jan 17 04:53:20 1970 +0000
2600 date: Sat Jan 17 04:53:20 1970 +0000
2596 description:
2601 description:
2597 new branch
2602 new branch
2598
2603
2599
2604
2600 $ hg --color=debug log -T bisect -r 0:4
2605 $ hg --color=debug log -T bisect -r 0:4
2601 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
2606 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
2602 [log.bisect bisect.good|bisect: good (implicit)]
2607 [log.bisect bisect.good|bisect: good (implicit)]
2603 [log.user|user: User Name <user@hostname>]
2608 [log.user|user: User Name <user@hostname>]
2604 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2609 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2605 [log.summary|summary: line 1]
2610 [log.summary|summary: line 1]
2606
2611
2607 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
2612 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
2608 [log.bisect bisect.good|bisect: good]
2613 [log.bisect bisect.good|bisect: good]
2609 [log.user|user: A. N. Other <other@place>]
2614 [log.user|user: A. N. Other <other@place>]
2610 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2615 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2611 [log.summary|summary: other 1]
2616 [log.summary|summary: other 1]
2612
2617
2613 [log.changeset changeset.public|changeset: 2:97054abb4ab8]
2618 [log.changeset changeset.public|changeset: 2:97054abb4ab8]
2614 [log.bisect bisect.untested|bisect: untested]
2619 [log.bisect bisect.untested|bisect: untested]
2615 [log.user|user: other@place]
2620 [log.user|user: other@place]
2616 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2621 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2617 [log.summary|summary: no person]
2622 [log.summary|summary: no person]
2618
2623
2619 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
2624 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
2620 [log.bisect bisect.bad|bisect: bad]
2625 [log.bisect bisect.bad|bisect: bad]
2621 [log.user|user: person]
2626 [log.user|user: person]
2622 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2627 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2623 [log.summary|summary: no user, no domain]
2628 [log.summary|summary: no user, no domain]
2624
2629
2625 [log.changeset changeset.draft|changeset: 4:bbe44766e73d]
2630 [log.changeset changeset.draft|changeset: 4:bbe44766e73d]
2626 [log.bisect bisect.bad|bisect: bad (implicit)]
2631 [log.bisect bisect.bad|bisect: bad (implicit)]
2627 [log.branch|branch: foo]
2632 [log.branch|branch: foo]
2628 [log.user|user: person]
2633 [log.user|user: person]
2629 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2634 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2630 [log.summary|summary: new branch]
2635 [log.summary|summary: new branch]
2631
2636
2632 $ hg --color=debug log --debug -T bisect -r 0:4
2637 $ hg --color=debug log --debug -T bisect -r 0:4
2633 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
2638 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
2634 [log.bisect bisect.good|bisect: good (implicit)]
2639 [log.bisect bisect.good|bisect: good (implicit)]
2635 [log.phase|phase: public]
2640 [log.phase|phase: public]
2636 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2641 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2637 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2642 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2638 [ui.debug log.manifest|manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0]
2643 [ui.debug log.manifest|manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0]
2639 [log.user|user: User Name <user@hostname>]
2644 [log.user|user: User Name <user@hostname>]
2640 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2645 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2641 [ui.debug log.files|files+: a]
2646 [ui.debug log.files|files+: a]
2642 [ui.debug log.extra|extra: branch=default]
2647 [ui.debug log.extra|extra: branch=default]
2643 [ui.note log.description|description:]
2648 [ui.note log.description|description:]
2644 [ui.note log.description|line 1
2649 [ui.note log.description|line 1
2645 line 2]
2650 line 2]
2646
2651
2647
2652
2648 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
2653 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
2649 [log.bisect bisect.good|bisect: good]
2654 [log.bisect bisect.good|bisect: good]
2650 [log.phase|phase: public]
2655 [log.phase|phase: public]
2651 [log.parent changeset.public|parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
2656 [log.parent changeset.public|parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
2652 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2657 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2653 [ui.debug log.manifest|manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55]
2658 [ui.debug log.manifest|manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55]
2654 [log.user|user: A. N. Other <other@place>]
2659 [log.user|user: A. N. Other <other@place>]
2655 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2660 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2656 [ui.debug log.files|files+: b]
2661 [ui.debug log.files|files+: b]
2657 [ui.debug log.extra|extra: branch=default]
2662 [ui.debug log.extra|extra: branch=default]
2658 [ui.note log.description|description:]
2663 [ui.note log.description|description:]
2659 [ui.note log.description|other 1
2664 [ui.note log.description|other 1
2660 other 2
2665 other 2
2661
2666
2662 other 3]
2667 other 3]
2663
2668
2664
2669
2665 [log.changeset changeset.public|changeset: 2:97054abb4ab824450e9164180baf491ae0078465]
2670 [log.changeset changeset.public|changeset: 2:97054abb4ab824450e9164180baf491ae0078465]
2666 [log.bisect bisect.untested|bisect: untested]
2671 [log.bisect bisect.untested|bisect: untested]
2667 [log.phase|phase: public]
2672 [log.phase|phase: public]
2668 [log.parent changeset.public|parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
2673 [log.parent changeset.public|parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
2669 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2674 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2670 [ui.debug log.manifest|manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1]
2675 [ui.debug log.manifest|manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1]
2671 [log.user|user: other@place]
2676 [log.user|user: other@place]
2672 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2677 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2673 [ui.debug log.files|files+: c]
2678 [ui.debug log.files|files+: c]
2674 [ui.debug log.extra|extra: branch=default]
2679 [ui.debug log.extra|extra: branch=default]
2675 [ui.note log.description|description:]
2680 [ui.note log.description|description:]
2676 [ui.note log.description|no person]
2681 [ui.note log.description|no person]
2677
2682
2678
2683
2679 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
2684 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
2680 [log.bisect bisect.bad|bisect: bad]
2685 [log.bisect bisect.bad|bisect: bad]
2681 [log.phase|phase: public]
2686 [log.phase|phase: public]
2682 [log.parent changeset.public|parent: 2:97054abb4ab824450e9164180baf491ae0078465]
2687 [log.parent changeset.public|parent: 2:97054abb4ab824450e9164180baf491ae0078465]
2683 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2688 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2684 [ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
2689 [ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
2685 [log.user|user: person]
2690 [log.user|user: person]
2686 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2691 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2687 [ui.debug log.files|files: c]
2692 [ui.debug log.files|files: c]
2688 [ui.debug log.extra|extra: branch=default]
2693 [ui.debug log.extra|extra: branch=default]
2689 [ui.note log.description|description:]
2694 [ui.note log.description|description:]
2690 [ui.note log.description|no user, no domain]
2695 [ui.note log.description|no user, no domain]
2691
2696
2692
2697
2693 [log.changeset changeset.draft|changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74]
2698 [log.changeset changeset.draft|changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74]
2694 [log.bisect bisect.bad|bisect: bad (implicit)]
2699 [log.bisect bisect.bad|bisect: bad (implicit)]
2695 [log.branch|branch: foo]
2700 [log.branch|branch: foo]
2696 [log.phase|phase: draft]
2701 [log.phase|phase: draft]
2697 [log.parent changeset.public|parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
2702 [log.parent changeset.public|parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
2698 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2703 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2699 [ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
2704 [ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
2700 [log.user|user: person]
2705 [log.user|user: person]
2701 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2706 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2702 [ui.debug log.extra|extra: branch=foo]
2707 [ui.debug log.extra|extra: branch=foo]
2703 [ui.note log.description|description:]
2708 [ui.note log.description|description:]
2704 [ui.note log.description|new branch]
2709 [ui.note log.description|new branch]
2705
2710
2706
2711
2707 $ hg --color=debug log -v -T bisect -r 0:4
2712 $ hg --color=debug log -v -T bisect -r 0:4
2708 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
2713 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
2709 [log.bisect bisect.good|bisect: good (implicit)]
2714 [log.bisect bisect.good|bisect: good (implicit)]
2710 [log.user|user: User Name <user@hostname>]
2715 [log.user|user: User Name <user@hostname>]
2711 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2716 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2712 [ui.note log.files|files: a]
2717 [ui.note log.files|files: a]
2713 [ui.note log.description|description:]
2718 [ui.note log.description|description:]
2714 [ui.note log.description|line 1
2719 [ui.note log.description|line 1
2715 line 2]
2720 line 2]
2716
2721
2717
2722
2718 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
2723 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
2719 [log.bisect bisect.good|bisect: good]
2724 [log.bisect bisect.good|bisect: good]
2720 [log.user|user: A. N. Other <other@place>]
2725 [log.user|user: A. N. Other <other@place>]
2721 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2726 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2722 [ui.note log.files|files: b]
2727 [ui.note log.files|files: b]
2723 [ui.note log.description|description:]
2728 [ui.note log.description|description:]
2724 [ui.note log.description|other 1
2729 [ui.note log.description|other 1
2725 other 2
2730 other 2
2726
2731
2727 other 3]
2732 other 3]
2728
2733
2729
2734
2730 [log.changeset changeset.public|changeset: 2:97054abb4ab8]
2735 [log.changeset changeset.public|changeset: 2:97054abb4ab8]
2731 [log.bisect bisect.untested|bisect: untested]
2736 [log.bisect bisect.untested|bisect: untested]
2732 [log.user|user: other@place]
2737 [log.user|user: other@place]
2733 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2738 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2734 [ui.note log.files|files: c]
2739 [ui.note log.files|files: c]
2735 [ui.note log.description|description:]
2740 [ui.note log.description|description:]
2736 [ui.note log.description|no person]
2741 [ui.note log.description|no person]
2737
2742
2738
2743
2739 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
2744 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
2740 [log.bisect bisect.bad|bisect: bad]
2745 [log.bisect bisect.bad|bisect: bad]
2741 [log.user|user: person]
2746 [log.user|user: person]
2742 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2747 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2743 [ui.note log.files|files: c]
2748 [ui.note log.files|files: c]
2744 [ui.note log.description|description:]
2749 [ui.note log.description|description:]
2745 [ui.note log.description|no user, no domain]
2750 [ui.note log.description|no user, no domain]
2746
2751
2747
2752
2748 [log.changeset changeset.draft|changeset: 4:bbe44766e73d]
2753 [log.changeset changeset.draft|changeset: 4:bbe44766e73d]
2749 [log.bisect bisect.bad|bisect: bad (implicit)]
2754 [log.bisect bisect.bad|bisect: bad (implicit)]
2750 [log.branch|branch: foo]
2755 [log.branch|branch: foo]
2751 [log.user|user: person]
2756 [log.user|user: person]
2752 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2757 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2753 [ui.note log.description|description:]
2758 [ui.note log.description|description:]
2754 [ui.note log.description|new branch]
2759 [ui.note log.description|new branch]
2755
2760
2756
2761
2757 $ hg bisect --reset
2762 $ hg bisect --reset
2758
2763
2759 Error on syntax:
2764 Error on syntax:
2760
2765
2761 $ echo 'x = "f' >> t
2766 $ echo 'x = "f' >> t
2762 $ hg log
2767 $ hg log
2763 hg: parse error at t:3: unmatched quotes
2768 hg: parse error at t:3: unmatched quotes
2764 [255]
2769 [255]
2765
2770
2766 $ hg log -T '{date'
2771 $ hg log -T '{date'
2767 hg: parse error at 1: unterminated template expansion
2772 hg: parse error at 1: unterminated template expansion
2768 ({date
2773 ({date
2769 ^ here)
2774 ^ here)
2770 [255]
2775 [255]
2771 $ hg log -T '{date(}'
2776 $ hg log -T '{date(}'
2772 hg: parse error at 6: not a prefix: end
2777 hg: parse error at 6: not a prefix: end
2773 ({date(}
2778 ({date(}
2774 ^ here)
2779 ^ here)
2775 [255]
2780 [255]
2776 $ hg log -T '{date)}'
2781 $ hg log -T '{date)}'
2777 hg: parse error at 5: invalid token
2782 hg: parse error at 5: invalid token
2778 ({date)}
2783 ({date)}
2779 ^ here)
2784 ^ here)
2780 [255]
2785 [255]
2781 $ hg log -T '{date date}'
2786 $ hg log -T '{date date}'
2782 hg: parse error at 6: invalid token
2787 hg: parse error at 6: invalid token
2783 ({date date}
2788 ({date date}
2784 ^ here)
2789 ^ here)
2785 [255]
2790 [255]
2786
2791
2787 $ hg log -T '{}'
2792 $ hg log -T '{}'
2788 hg: parse error at 1: not a prefix: end
2793 hg: parse error at 1: not a prefix: end
2789 ({}
2794 ({}
2790 ^ here)
2795 ^ here)
2791 [255]
2796 [255]
2792 $ hg debugtemplate -v '{()}'
2797 $ hg debugtemplate -v '{()}'
2793 (template
2798 (template
2794 (group
2799 (group
2795 None))
2800 None))
2796 hg: parse error: missing argument
2801 hg: parse error: missing argument
2797 [255]
2802 [255]
2798
2803
2799 Behind the scenes, this would throw TypeError without intype=bytes
2804 Behind the scenes, this would throw TypeError without intype=bytes
2800
2805
2801 $ hg log -l 3 --template '{date|obfuscate}\n'
2806 $ hg log -l 3 --template '{date|obfuscate}\n'
2802 &#48;&#46;&#48;&#48;
2807 &#48;&#46;&#48;&#48;
2803 &#48;&#46;&#48;&#48;
2808 &#48;&#46;&#48;&#48;
2804 &#49;&#53;&#55;&#55;&#56;&#55;&#50;&#56;&#54;&#48;&#46;&#48;&#48;
2809 &#49;&#53;&#55;&#55;&#56;&#55;&#50;&#56;&#54;&#48;&#46;&#48;&#48;
2805
2810
2806 Behind the scenes, this will throw a ValueError
2811 Behind the scenes, this will throw a ValueError
2807
2812
2808 $ hg log -l 3 --template 'line: {desc|shortdate}\n'
2813 $ hg log -l 3 --template 'line: {desc|shortdate}\n'
2809 hg: parse error: invalid date: 'Modify, add, remove, rename'
2814 hg: parse error: invalid date: 'Modify, add, remove, rename'
2810 (template filter 'shortdate' is not compatible with keyword 'desc')
2815 (template filter 'shortdate' is not compatible with keyword 'desc')
2811 [255]
2816 [255]
2812
2817
2813 Behind the scenes, this would throw AttributeError without intype=bytes
2818 Behind the scenes, this would throw AttributeError without intype=bytes
2814
2819
2815 $ hg log -l 3 --template 'line: {date|escape}\n'
2820 $ hg log -l 3 --template 'line: {date|escape}\n'
2816 line: 0.00
2821 line: 0.00
2817 line: 0.00
2822 line: 0.00
2818 line: 1577872860.00
2823 line: 1577872860.00
2819
2824
2820 $ hg log -l 3 --template 'line: {extras|localdate}\n'
2825 $ hg log -l 3 --template 'line: {extras|localdate}\n'
2821 hg: parse error: localdate expects a date information
2826 hg: parse error: localdate expects a date information
2822 [255]
2827 [255]
2823
2828
2824 Behind the scenes, this will throw ValueError
2829 Behind the scenes, this will throw ValueError
2825
2830
2826 $ hg tip --template '{author|email|date}\n'
2831 $ hg tip --template '{author|email|date}\n'
2827 hg: parse error: date expects a date information
2832 hg: parse error: date expects a date information
2828 [255]
2833 [255]
2829
2834
2830 $ hg tip -T '{author|email|shortdate}\n'
2835 $ hg tip -T '{author|email|shortdate}\n'
2831 hg: parse error: invalid date: 'test'
2836 hg: parse error: invalid date: 'test'
2832 (template filter 'shortdate' is not compatible with keyword 'author')
2837 (template filter 'shortdate' is not compatible with keyword 'author')
2833 [255]
2838 [255]
2834
2839
2835 $ hg tip -T '{get(extras, "branch")|shortdate}\n'
2840 $ hg tip -T '{get(extras, "branch")|shortdate}\n'
2836 hg: parse error: invalid date: 'default'
2841 hg: parse error: invalid date: 'default'
2837 (incompatible use of template filter 'shortdate')
2842 (incompatible use of template filter 'shortdate')
2838 [255]
2843 [255]
2839
2844
2840 Error in nested template:
2845 Error in nested template:
2841
2846
2842 $ hg log -T '{"date'
2847 $ hg log -T '{"date'
2843 hg: parse error at 2: unterminated string
2848 hg: parse error at 2: unterminated string
2844 ({"date
2849 ({"date
2845 ^ here)
2850 ^ here)
2846 [255]
2851 [255]
2847
2852
2848 $ hg log -T '{"foo{date|?}"}'
2853 $ hg log -T '{"foo{date|?}"}'
2849 hg: parse error at 11: syntax error
2854 hg: parse error at 11: syntax error
2850 ({"foo{date|?}"}
2855 ({"foo{date|?}"}
2851 ^ here)
2856 ^ here)
2852 [255]
2857 [255]
2853
2858
2854 Thrown an error if a template function doesn't exist
2859 Thrown an error if a template function doesn't exist
2855
2860
2856 $ hg tip --template '{foo()}\n'
2861 $ hg tip --template '{foo()}\n'
2857 hg: parse error: unknown function 'foo'
2862 hg: parse error: unknown function 'foo'
2858 [255]
2863 [255]
2859
2864
2860 Pass generator object created by template function to filter
2865 Pass generator object created by template function to filter
2861
2866
2862 $ hg log -l 1 --template '{if(author, author)|user}\n'
2867 $ hg log -l 1 --template '{if(author, author)|user}\n'
2863 test
2868 test
2864
2869
2865 Test index keyword:
2870 Test index keyword:
2866
2871
2867 $ hg log -l 2 -T '{index + 10}{files % " {index}:{file}"}\n'
2872 $ hg log -l 2 -T '{index + 10}{files % " {index}:{file}"}\n'
2868 10 0:a 1:b 2:fifth 3:fourth 4:third
2873 10 0:a 1:b 2:fifth 3:fourth 4:third
2869 11 0:a
2874 11 0:a
2870
2875
2871 $ hg branches -T '{index} {branch}\n'
2876 $ hg branches -T '{index} {branch}\n'
2872 0 default
2877 0 default
2873 1 foo
2878 1 foo
2874
2879
2875 Test diff function:
2880 Test diff function:
2876
2881
2877 $ hg diff -c 8
2882 $ hg diff -c 8
2878 diff -r 29114dbae42b -r 95c24699272e fourth
2883 diff -r 29114dbae42b -r 95c24699272e fourth
2879 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2884 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2880 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2885 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2881 @@ -0,0 +1,1 @@
2886 @@ -0,0 +1,1 @@
2882 +second
2887 +second
2883 diff -r 29114dbae42b -r 95c24699272e second
2888 diff -r 29114dbae42b -r 95c24699272e second
2884 --- a/second Mon Jan 12 13:46:40 1970 +0000
2889 --- a/second Mon Jan 12 13:46:40 1970 +0000
2885 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2890 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2886 @@ -1,1 +0,0 @@
2891 @@ -1,1 +0,0 @@
2887 -second
2892 -second
2888 diff -r 29114dbae42b -r 95c24699272e third
2893 diff -r 29114dbae42b -r 95c24699272e third
2889 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2894 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2890 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2895 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2891 @@ -0,0 +1,1 @@
2896 @@ -0,0 +1,1 @@
2892 +third
2897 +third
2893
2898
2894 $ hg log -r 8 -T "{diff()}"
2899 $ hg log -r 8 -T "{diff()}"
2895 diff -r 29114dbae42b -r 95c24699272e fourth
2900 diff -r 29114dbae42b -r 95c24699272e fourth
2896 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2901 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2897 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2902 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2898 @@ -0,0 +1,1 @@
2903 @@ -0,0 +1,1 @@
2899 +second
2904 +second
2900 diff -r 29114dbae42b -r 95c24699272e second
2905 diff -r 29114dbae42b -r 95c24699272e second
2901 --- a/second Mon Jan 12 13:46:40 1970 +0000
2906 --- a/second Mon Jan 12 13:46:40 1970 +0000
2902 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2907 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2903 @@ -1,1 +0,0 @@
2908 @@ -1,1 +0,0 @@
2904 -second
2909 -second
2905 diff -r 29114dbae42b -r 95c24699272e third
2910 diff -r 29114dbae42b -r 95c24699272e third
2906 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2911 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2907 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2912 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2908 @@ -0,0 +1,1 @@
2913 @@ -0,0 +1,1 @@
2909 +third
2914 +third
2910
2915
2911 $ hg log -r 8 -T "{diff('glob:f*')}"
2916 $ hg log -r 8 -T "{diff('glob:f*')}"
2912 diff -r 29114dbae42b -r 95c24699272e fourth
2917 diff -r 29114dbae42b -r 95c24699272e fourth
2913 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2918 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2914 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2919 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2915 @@ -0,0 +1,1 @@
2920 @@ -0,0 +1,1 @@
2916 +second
2921 +second
2917
2922
2918 $ hg log -r 8 -T "{diff('', 'glob:f*')}"
2923 $ hg log -r 8 -T "{diff('', 'glob:f*')}"
2919 diff -r 29114dbae42b -r 95c24699272e second
2924 diff -r 29114dbae42b -r 95c24699272e second
2920 --- a/second Mon Jan 12 13:46:40 1970 +0000
2925 --- a/second Mon Jan 12 13:46:40 1970 +0000
2921 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2926 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2922 @@ -1,1 +0,0 @@
2927 @@ -1,1 +0,0 @@
2923 -second
2928 -second
2924 diff -r 29114dbae42b -r 95c24699272e third
2929 diff -r 29114dbae42b -r 95c24699272e third
2925 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2930 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2926 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2931 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2927 @@ -0,0 +1,1 @@
2932 @@ -0,0 +1,1 @@
2928 +third
2933 +third
2929
2934
2930 $ hg log -r 8 -T "{diff('FOURTH'|lower)}"
2935 $ hg log -r 8 -T "{diff('FOURTH'|lower)}"
2931 diff -r 29114dbae42b -r 95c24699272e fourth
2936 diff -r 29114dbae42b -r 95c24699272e fourth
2932 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2937 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2933 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2938 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2934 @@ -0,0 +1,1 @@
2939 @@ -0,0 +1,1 @@
2935 +second
2940 +second
2936
2941
2937 ui verbosity:
2942 ui verbosity:
2938
2943
2939 $ hg log -l1 -T '{verbosity}\n'
2944 $ hg log -l1 -T '{verbosity}\n'
2940
2945
2941 $ hg log -l1 -T '{verbosity}\n' --debug
2946 $ hg log -l1 -T '{verbosity}\n' --debug
2942 debug
2947 debug
2943 $ hg log -l1 -T '{verbosity}\n' --quiet
2948 $ hg log -l1 -T '{verbosity}\n' --quiet
2944 quiet
2949 quiet
2945 $ hg log -l1 -T '{verbosity}\n' --verbose
2950 $ hg log -l1 -T '{verbosity}\n' --verbose
2946 verbose
2951 verbose
2947
2952
2948 $ cd ..
2953 $ cd ..
2949
2954
2950
2955
2951 latesttag:
2956 latesttag:
2952
2957
2953 $ hg init latesttag
2958 $ hg init latesttag
2954 $ cd latesttag
2959 $ cd latesttag
2955
2960
2956 $ echo a > file
2961 $ echo a > file
2957 $ hg ci -Am a -d '0 0'
2962 $ hg ci -Am a -d '0 0'
2958 adding file
2963 adding file
2959
2964
2960 $ echo b >> file
2965 $ echo b >> file
2961 $ hg ci -m b -d '1 0'
2966 $ hg ci -m b -d '1 0'
2962
2967
2963 $ echo c >> head1
2968 $ echo c >> head1
2964 $ hg ci -Am h1c -d '2 0'
2969 $ hg ci -Am h1c -d '2 0'
2965 adding head1
2970 adding head1
2966
2971
2967 $ hg update -q 1
2972 $ hg update -q 1
2968 $ echo d >> head2
2973 $ echo d >> head2
2969 $ hg ci -Am h2d -d '3 0'
2974 $ hg ci -Am h2d -d '3 0'
2970 adding head2
2975 adding head2
2971 created new head
2976 created new head
2972
2977
2973 $ echo e >> head2
2978 $ echo e >> head2
2974 $ hg ci -m h2e -d '4 0'
2979 $ hg ci -m h2e -d '4 0'
2975
2980
2976 $ hg merge -q
2981 $ hg merge -q
2977 $ hg ci -m merge -d '5 -3600'
2982 $ hg ci -m merge -d '5 -3600'
2978
2983
2979 No tag set:
2984 No tag set:
2980
2985
2981 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
2986 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
2982 @ 5: null+5
2987 @ 5: null+5
2983 |\
2988 |\
2984 | o 4: null+4
2989 | o 4: null+4
2985 | |
2990 | |
2986 | o 3: null+3
2991 | o 3: null+3
2987 | |
2992 | |
2988 o | 2: null+3
2993 o | 2: null+3
2989 |/
2994 |/
2990 o 1: null+2
2995 o 1: null+2
2991 |
2996 |
2992 o 0: null+1
2997 o 0: null+1
2993
2998
2994
2999
2995 One common tag: longest path wins for {latesttagdistance}:
3000 One common tag: longest path wins for {latesttagdistance}:
2996
3001
2997 $ hg tag -r 1 -m t1 -d '6 0' t1
3002 $ hg tag -r 1 -m t1 -d '6 0' t1
2998 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
3003 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
2999 @ 6: t1+4
3004 @ 6: t1+4
3000 |
3005 |
3001 o 5: t1+3
3006 o 5: t1+3
3002 |\
3007 |\
3003 | o 4: t1+2
3008 | o 4: t1+2
3004 | |
3009 | |
3005 | o 3: t1+1
3010 | o 3: t1+1
3006 | |
3011 | |
3007 o | 2: t1+1
3012 o | 2: t1+1
3008 |/
3013 |/
3009 o 1: t1+0
3014 o 1: t1+0
3010 |
3015 |
3011 o 0: null+1
3016 o 0: null+1
3012
3017
3013
3018
3014 One ancestor tag: closest wins:
3019 One ancestor tag: closest wins:
3015
3020
3016 $ hg tag -r 2 -m t2 -d '7 0' t2
3021 $ hg tag -r 2 -m t2 -d '7 0' t2
3017 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
3022 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
3018 @ 7: t2+3
3023 @ 7: t2+3
3019 |
3024 |
3020 o 6: t2+2
3025 o 6: t2+2
3021 |
3026 |
3022 o 5: t2+1
3027 o 5: t2+1
3023 |\
3028 |\
3024 | o 4: t1+2
3029 | o 4: t1+2
3025 | |
3030 | |
3026 | o 3: t1+1
3031 | o 3: t1+1
3027 | |
3032 | |
3028 o | 2: t2+0
3033 o | 2: t2+0
3029 |/
3034 |/
3030 o 1: t1+0
3035 o 1: t1+0
3031 |
3036 |
3032 o 0: null+1
3037 o 0: null+1
3033
3038
3034
3039
3035 Two branch tags: more recent wins if same number of changes:
3040 Two branch tags: more recent wins if same number of changes:
3036
3041
3037 $ hg tag -r 3 -m t3 -d '8 0' t3
3042 $ hg tag -r 3 -m t3 -d '8 0' t3
3038 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
3043 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
3039 @ 8: t3+5
3044 @ 8: t3+5
3040 |
3045 |
3041 o 7: t3+4
3046 o 7: t3+4
3042 |
3047 |
3043 o 6: t3+3
3048 o 6: t3+3
3044 |
3049 |
3045 o 5: t3+2
3050 o 5: t3+2
3046 |\
3051 |\
3047 | o 4: t3+1
3052 | o 4: t3+1
3048 | |
3053 | |
3049 | o 3: t3+0
3054 | o 3: t3+0
3050 | |
3055 | |
3051 o | 2: t2+0
3056 o | 2: t2+0
3052 |/
3057 |/
3053 o 1: t1+0
3058 o 1: t1+0
3054 |
3059 |
3055 o 0: null+1
3060 o 0: null+1
3056
3061
3057
3062
3058 Two branch tags: fewest changes wins:
3063 Two branch tags: fewest changes wins:
3059
3064
3060 $ hg tag -r 4 -m t4 -d '4 0' t4 # older than t2, but should not matter
3065 $ hg tag -r 4 -m t4 -d '4 0' t4 # older than t2, but should not matter
3061 $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
3066 $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
3062 @ 9: t4+5,6
3067 @ 9: t4+5,6
3063 |
3068 |
3064 o 8: t4+4,5
3069 o 8: t4+4,5
3065 |
3070 |
3066 o 7: t4+3,4
3071 o 7: t4+3,4
3067 |
3072 |
3068 o 6: t4+2,3
3073 o 6: t4+2,3
3069 |
3074 |
3070 o 5: t4+1,2
3075 o 5: t4+1,2
3071 |\
3076 |\
3072 | o 4: t4+0,0
3077 | o 4: t4+0,0
3073 | |
3078 | |
3074 | o 3: t3+0,0
3079 | o 3: t3+0,0
3075 | |
3080 | |
3076 o | 2: t2+0,0
3081 o | 2: t2+0,0
3077 |/
3082 |/
3078 o 1: t1+0,0
3083 o 1: t1+0,0
3079 |
3084 |
3080 o 0: null+1,1
3085 o 0: null+1,1
3081
3086
3082
3087
3083 Merged tag overrides:
3088 Merged tag overrides:
3084
3089
3085 $ hg tag -r 5 -m t5 -d '9 0' t5
3090 $ hg tag -r 5 -m t5 -d '9 0' t5
3086 $ hg tag -r 3 -m at3 -d '10 0' at3
3091 $ hg tag -r 3 -m at3 -d '10 0' at3
3087 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
3092 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
3088 @ 11: t5+6
3093 @ 11: t5+6
3089 |
3094 |
3090 o 10: t5+5
3095 o 10: t5+5
3091 |
3096 |
3092 o 9: t5+4
3097 o 9: t5+4
3093 |
3098 |
3094 o 8: t5+3
3099 o 8: t5+3
3095 |
3100 |
3096 o 7: t5+2
3101 o 7: t5+2
3097 |
3102 |
3098 o 6: t5+1
3103 o 6: t5+1
3099 |
3104 |
3100 o 5: t5+0
3105 o 5: t5+0
3101 |\
3106 |\
3102 | o 4: t4+0
3107 | o 4: t4+0
3103 | |
3108 | |
3104 | o 3: at3:t3+0
3109 | o 3: at3:t3+0
3105 | |
3110 | |
3106 o | 2: t2+0
3111 o | 2: t2+0
3107 |/
3112 |/
3108 o 1: t1+0
3113 o 1: t1+0
3109 |
3114 |
3110 o 0: null+1
3115 o 0: null+1
3111
3116
3112
3117
3113 $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
3118 $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
3114 @ 11: t5+6,6
3119 @ 11: t5+6,6
3115 |
3120 |
3116 o 10: t5+5,5
3121 o 10: t5+5,5
3117 |
3122 |
3118 o 9: t5+4,4
3123 o 9: t5+4,4
3119 |
3124 |
3120 o 8: t5+3,3
3125 o 8: t5+3,3
3121 |
3126 |
3122 o 7: t5+2,2
3127 o 7: t5+2,2
3123 |
3128 |
3124 o 6: t5+1,1
3129 o 6: t5+1,1
3125 |
3130 |
3126 o 5: t5+0,0
3131 o 5: t5+0,0
3127 |\
3132 |\
3128 | o 4: t4+0,0
3133 | o 4: t4+0,0
3129 | |
3134 | |
3130 | o 3: at3+0,0 t3+0,0
3135 | o 3: at3+0,0 t3+0,0
3131 | |
3136 | |
3132 o | 2: t2+0,0
3137 o | 2: t2+0,0
3133 |/
3138 |/
3134 o 1: t1+0,0
3139 o 1: t1+0,0
3135 |
3140 |
3136 o 0: null+1,1
3141 o 0: null+1,1
3137
3142
3138
3143
3139 $ hg log -G --template "{rev}: {latesttag('re:^t[13]$') % '{tag}, C: {changes}, D: {distance}'}\n"
3144 $ hg log -G --template "{rev}: {latesttag('re:^t[13]$') % '{tag}, C: {changes}, D: {distance}'}\n"
3140 @ 11: t3, C: 9, D: 8
3145 @ 11: t3, C: 9, D: 8
3141 |
3146 |
3142 o 10: t3, C: 8, D: 7
3147 o 10: t3, C: 8, D: 7
3143 |
3148 |
3144 o 9: t3, C: 7, D: 6
3149 o 9: t3, C: 7, D: 6
3145 |
3150 |
3146 o 8: t3, C: 6, D: 5
3151 o 8: t3, C: 6, D: 5
3147 |
3152 |
3148 o 7: t3, C: 5, D: 4
3153 o 7: t3, C: 5, D: 4
3149 |
3154 |
3150 o 6: t3, C: 4, D: 3
3155 o 6: t3, C: 4, D: 3
3151 |
3156 |
3152 o 5: t3, C: 3, D: 2
3157 o 5: t3, C: 3, D: 2
3153 |\
3158 |\
3154 | o 4: t3, C: 1, D: 1
3159 | o 4: t3, C: 1, D: 1
3155 | |
3160 | |
3156 | o 3: t3, C: 0, D: 0
3161 | o 3: t3, C: 0, D: 0
3157 | |
3162 | |
3158 o | 2: t1, C: 1, D: 1
3163 o | 2: t1, C: 1, D: 1
3159 |/
3164 |/
3160 o 1: t1, C: 0, D: 0
3165 o 1: t1, C: 0, D: 0
3161 |
3166 |
3162 o 0: null, C: 1, D: 1
3167 o 0: null, C: 1, D: 1
3163
3168
3164
3169
3165 $ cd ..
3170 $ cd ..
3166
3171
3167
3172
3168 Style path expansion: issue1948 - ui.style option doesn't work on OSX
3173 Style path expansion: issue1948 - ui.style option doesn't work on OSX
3169 if it is a relative path
3174 if it is a relative path
3170
3175
3171 $ mkdir -p home/styles
3176 $ mkdir -p home/styles
3172
3177
3173 $ cat > home/styles/teststyle <<EOF
3178 $ cat > home/styles/teststyle <<EOF
3174 > changeset = 'test {rev}:{node|short}\n'
3179 > changeset = 'test {rev}:{node|short}\n'
3175 > EOF
3180 > EOF
3176
3181
3177 $ HOME=`pwd`/home; export HOME
3182 $ HOME=`pwd`/home; export HOME
3178
3183
3179 $ cat > latesttag/.hg/hgrc <<EOF
3184 $ cat > latesttag/.hg/hgrc <<EOF
3180 > [ui]
3185 > [ui]
3181 > style = ~/styles/teststyle
3186 > style = ~/styles/teststyle
3182 > EOF
3187 > EOF
3183
3188
3184 $ hg -R latesttag tip
3189 $ hg -R latesttag tip
3185 test 11:97e5943b523a
3190 test 11:97e5943b523a
3186
3191
3187 Test recursive showlist template (issue1989):
3192 Test recursive showlist template (issue1989):
3188
3193
3189 $ cat > style1989 <<EOF
3194 $ cat > style1989 <<EOF
3190 > changeset = '{file_mods}{manifest}{extras}'
3195 > changeset = '{file_mods}{manifest}{extras}'
3191 > file_mod = 'M|{author|person}\n'
3196 > file_mod = 'M|{author|person}\n'
3192 > manifest = '{rev},{author}\n'
3197 > manifest = '{rev},{author}\n'
3193 > extra = '{key}: {author}\n'
3198 > extra = '{key}: {author}\n'
3194 > EOF
3199 > EOF
3195
3200
3196 $ hg -R latesttag log -r tip --style=style1989
3201 $ hg -R latesttag log -r tip --style=style1989
3197 M|test
3202 M|test
3198 11,test
3203 11,test
3199 branch: test
3204 branch: test
3200
3205
3201 Test new-style inline templating:
3206 Test new-style inline templating:
3202
3207
3203 $ hg log -R latesttag -r tip --template 'modified files: {file_mods % " {file}\n"}\n'
3208 $ hg log -R latesttag -r tip --template 'modified files: {file_mods % " {file}\n"}\n'
3204 modified files: .hgtags
3209 modified files: .hgtags
3205
3210
3206
3211
3207 $ hg log -R latesttag -r tip -T '{rev % "a"}\n'
3212 $ hg log -R latesttag -r tip -T '{rev % "a"}\n'
3208 hg: parse error: keyword 'rev' is not iterable
3213 hg: parse error: keyword 'rev' is not iterable
3209 [255]
3214 [255]
3210 $ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "a"}\n'
3215 $ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "a"}\n'
3211 hg: parse error: None is not iterable
3216 hg: parse error: None is not iterable
3212 [255]
3217 [255]
3213
3218
3214 Test new-style inline templating of non-list/dict type:
3219 Test new-style inline templating of non-list/dict type:
3215
3220
3216 $ hg log -R latesttag -r tip -T '{manifest}\n'
3221 $ hg log -R latesttag -r tip -T '{manifest}\n'
3217 11:2bc6e9006ce2
3222 11:2bc6e9006ce2
3218 $ hg log -R latesttag -r tip -T 'string length: {manifest|count}\n'
3223 $ hg log -R latesttag -r tip -T 'string length: {manifest|count}\n'
3219 string length: 15
3224 string length: 15
3220 $ hg log -R latesttag -r tip -T '{manifest % "{rev}:{node}"}\n'
3225 $ hg log -R latesttag -r tip -T '{manifest % "{rev}:{node}"}\n'
3221 11:2bc6e9006ce29882383a22d39fd1f4e66dd3e2fc
3226 11:2bc6e9006ce29882383a22d39fd1f4e66dd3e2fc
3222
3227
3223 $ hg log -R latesttag -r tip -T '{get(extras, "branch") % "{key}: {value}\n"}'
3228 $ hg log -R latesttag -r tip -T '{get(extras, "branch") % "{key}: {value}\n"}'
3224 branch: default
3229 branch: default
3225 $ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "{key}\n"}'
3230 $ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "{key}\n"}'
3226 hg: parse error: None is not iterable
3231 hg: parse error: None is not iterable
3227 [255]
3232 [255]
3228 $ hg log -R latesttag -r tip -T '{min(extras) % "{key}: {value}\n"}'
3233 $ hg log -R latesttag -r tip -T '{min(extras) % "{key}: {value}\n"}'
3229 branch: default
3234 branch: default
3230 $ hg log -R latesttag -l1 -T '{min(revset("0:9")) % "{rev}:{node|short}\n"}'
3235 $ hg log -R latesttag -l1 -T '{min(revset("0:9")) % "{rev}:{node|short}\n"}'
3231 0:ce3cec86e6c2
3236 0:ce3cec86e6c2
3232 $ hg log -R latesttag -l1 -T '{max(revset("0:9")) % "{rev}:{node|short}\n"}'
3237 $ hg log -R latesttag -l1 -T '{max(revset("0:9")) % "{rev}:{node|short}\n"}'
3233 9:fbc7cd862e9c
3238 9:fbc7cd862e9c
3234
3239
3235 Test manifest/get() can be join()-ed as before, though it's silly:
3240 Test manifest/get() can be join()-ed as before, though it's silly:
3236
3241
3237 $ hg log -R latesttag -r tip -T '{join(manifest, "")}\n'
3242 $ hg log -R latesttag -r tip -T '{join(manifest, "")}\n'
3238 11:2bc6e9006ce2
3243 11:2bc6e9006ce2
3239 $ hg log -R latesttag -r tip -T '{join(get(extras, "branch"), "")}\n'
3244 $ hg log -R latesttag -r tip -T '{join(get(extras, "branch"), "")}\n'
3240 default
3245 default
3241
3246
3242 Test min/max of integers
3247 Test min/max of integers
3243
3248
3244 $ hg log -R latesttag -l1 -T '{min(revset("9:10"))}\n'
3249 $ hg log -R latesttag -l1 -T '{min(revset("9:10"))}\n'
3245 9
3250 9
3246 $ hg log -R latesttag -l1 -T '{max(revset("9:10"))}\n'
3251 $ hg log -R latesttag -l1 -T '{max(revset("9:10"))}\n'
3247 10
3252 10
3248
3253
3249 Test min/max of if() result
3254 Test min/max of if() result
3250
3255
3251 $ cd latesttag
3256 $ cd latesttag
3252 $ hg log -l1 -T '{min(if(true, revset("9:10"), ""))}\n'
3257 $ hg log -l1 -T '{min(if(true, revset("9:10"), ""))}\n'
3253 9
3258 9
3254 $ hg log -l1 -T '{max(if(false, "", revset("9:10")))}\n'
3259 $ hg log -l1 -T '{max(if(false, "", revset("9:10")))}\n'
3255 10
3260 10
3256 $ hg log -l1 -T '{min(ifcontains("a", "aa", revset("9:10"), ""))}\n'
3261 $ hg log -l1 -T '{min(ifcontains("a", "aa", revset("9:10"), ""))}\n'
3257 9
3262 9
3258 $ hg log -l1 -T '{max(ifcontains("a", "bb", "", revset("9:10")))}\n'
3263 $ hg log -l1 -T '{max(ifcontains("a", "bb", "", revset("9:10")))}\n'
3259 10
3264 10
3260 $ hg log -l1 -T '{min(ifeq(0, 0, revset("9:10"), ""))}\n'
3265 $ hg log -l1 -T '{min(ifeq(0, 0, revset("9:10"), ""))}\n'
3261 9
3266 9
3262 $ hg log -l1 -T '{max(ifeq(0, 1, "", revset("9:10")))}\n'
3267 $ hg log -l1 -T '{max(ifeq(0, 1, "", revset("9:10")))}\n'
3263 10
3268 10
3264 $ cd ..
3269 $ cd ..
3265
3270
3266 Test laziness of if() then/else clause
3271 Test laziness of if() then/else clause
3267
3272
3268 $ hg debugtemplate '{count(0)}'
3273 $ hg debugtemplate '{count(0)}'
3269 abort: incompatible use of template filter 'count'
3274 hg: parse error: not countable
3275 (incompatible use of template filter 'count')
3270 [255]
3276 [255]
3271 $ hg debugtemplate '{if(true, "", count(0))}'
3277 $ hg debugtemplate '{if(true, "", count(0))}'
3272 $ hg debugtemplate '{if(false, count(0), "")}'
3278 $ hg debugtemplate '{if(false, count(0), "")}'
3273 $ hg debugtemplate '{ifcontains("a", "aa", "", count(0))}'
3279 $ hg debugtemplate '{ifcontains("a", "aa", "", count(0))}'
3274 $ hg debugtemplate '{ifcontains("a", "bb", count(0), "")}'
3280 $ hg debugtemplate '{ifcontains("a", "bb", count(0), "")}'
3275 $ hg debugtemplate '{ifeq(0, 0, "", count(0))}'
3281 $ hg debugtemplate '{ifeq(0, 0, "", count(0))}'
3276 $ hg debugtemplate '{ifeq(0, 1, count(0), "")}'
3282 $ hg debugtemplate '{ifeq(0, 1, count(0), "")}'
3277
3283
3278 Test dot operator precedence:
3284 Test dot operator precedence:
3279
3285
3280 $ hg debugtemplate -R latesttag -r0 -v '{manifest.node|short}\n'
3286 $ hg debugtemplate -R latesttag -r0 -v '{manifest.node|short}\n'
3281 (template
3287 (template
3282 (|
3288 (|
3283 (.
3289 (.
3284 (symbol 'manifest')
3290 (symbol 'manifest')
3285 (symbol 'node'))
3291 (symbol 'node'))
3286 (symbol 'short'))
3292 (symbol 'short'))
3287 (string '\n'))
3293 (string '\n'))
3288 89f4071fec70
3294 89f4071fec70
3289
3295
3290 (the following examples are invalid, but seem natural in parsing POV)
3296 (the following examples are invalid, but seem natural in parsing POV)
3291
3297
3292 $ hg debugtemplate -R latesttag -r0 -v '{foo|bar.baz}\n' 2> /dev/null
3298 $ hg debugtemplate -R latesttag -r0 -v '{foo|bar.baz}\n' 2> /dev/null
3293 (template
3299 (template
3294 (|
3300 (|
3295 (symbol 'foo')
3301 (symbol 'foo')
3296 (.
3302 (.
3297 (symbol 'bar')
3303 (symbol 'bar')
3298 (symbol 'baz')))
3304 (symbol 'baz')))
3299 (string '\n'))
3305 (string '\n'))
3300 [255]
3306 [255]
3301 $ hg debugtemplate -R latesttag -r0 -v '{foo.bar()}\n' 2> /dev/null
3307 $ hg debugtemplate -R latesttag -r0 -v '{foo.bar()}\n' 2> /dev/null
3302 (template
3308 (template
3303 (.
3309 (.
3304 (symbol 'foo')
3310 (symbol 'foo')
3305 (func
3311 (func
3306 (symbol 'bar')
3312 (symbol 'bar')
3307 None))
3313 None))
3308 (string '\n'))
3314 (string '\n'))
3309 [255]
3315 [255]
3310
3316
3311 Test evaluation of dot operator:
3317 Test evaluation of dot operator:
3312
3318
3313 $ hg log -R latesttag -l1 -T '{min(revset("0:9")).node}\n'
3319 $ hg log -R latesttag -l1 -T '{min(revset("0:9")).node}\n'
3314 ce3cec86e6c26bd9bdfc590a6b92abc9680f1796
3320 ce3cec86e6c26bd9bdfc590a6b92abc9680f1796
3315 $ hg log -R latesttag -r0 -T '{extras.branch}\n'
3321 $ hg log -R latesttag -r0 -T '{extras.branch}\n'
3316 default
3322 default
3317
3323
3318 $ hg log -R latesttag -l1 -T '{author.invalid}\n'
3324 $ hg log -R latesttag -l1 -T '{author.invalid}\n'
3319 hg: parse error: keyword 'author' has no member
3325 hg: parse error: keyword 'author' has no member
3320 [255]
3326 [255]
3321 $ hg log -R latesttag -l1 -T '{min("abc").invalid}\n'
3327 $ hg log -R latesttag -l1 -T '{min("abc").invalid}\n'
3322 hg: parse error: 'a' has no member
3328 hg: parse error: 'a' has no member
3323 [255]
3329 [255]
3324
3330
3325 Test the sub function of templating for expansion:
3331 Test the sub function of templating for expansion:
3326
3332
3327 $ hg log -R latesttag -r 10 --template '{sub("[0-9]", "x", "{rev}")}\n'
3333 $ hg log -R latesttag -r 10 --template '{sub("[0-9]", "x", "{rev}")}\n'
3328 xx
3334 xx
3329
3335
3330 $ hg log -R latesttag -r 10 -T '{sub("[", "x", rev)}\n'
3336 $ hg log -R latesttag -r 10 -T '{sub("[", "x", rev)}\n'
3331 hg: parse error: sub got an invalid pattern: [
3337 hg: parse error: sub got an invalid pattern: [
3332 [255]
3338 [255]
3333 $ hg log -R latesttag -r 10 -T '{sub("[0-9]", r"\1", rev)}\n'
3339 $ hg log -R latesttag -r 10 -T '{sub("[0-9]", r"\1", rev)}\n'
3334 hg: parse error: sub got an invalid replacement: \1
3340 hg: parse error: sub got an invalid replacement: \1
3335 [255]
3341 [255]
3336
3342
3337 Test the strip function with chars specified:
3343 Test the strip function with chars specified:
3338
3344
3339 $ hg log -R latesttag --template '{desc}\n'
3345 $ hg log -R latesttag --template '{desc}\n'
3340 at3
3346 at3
3341 t5
3347 t5
3342 t4
3348 t4
3343 t3
3349 t3
3344 t2
3350 t2
3345 t1
3351 t1
3346 merge
3352 merge
3347 h2e
3353 h2e
3348 h2d
3354 h2d
3349 h1c
3355 h1c
3350 b
3356 b
3351 a
3357 a
3352
3358
3353 $ hg log -R latesttag --template '{strip(desc, "te")}\n'
3359 $ hg log -R latesttag --template '{strip(desc, "te")}\n'
3354 at3
3360 at3
3355 5
3361 5
3356 4
3362 4
3357 3
3363 3
3358 2
3364 2
3359 1
3365 1
3360 merg
3366 merg
3361 h2
3367 h2
3362 h2d
3368 h2d
3363 h1c
3369 h1c
3364 b
3370 b
3365 a
3371 a
3366
3372
3367 Test date format:
3373 Test date format:
3368
3374
3369 $ hg log -R latesttag --template 'date: {date(date, "%y %m %d %S %z")}\n'
3375 $ hg log -R latesttag --template 'date: {date(date, "%y %m %d %S %z")}\n'
3370 date: 70 01 01 10 +0000
3376 date: 70 01 01 10 +0000
3371 date: 70 01 01 09 +0000
3377 date: 70 01 01 09 +0000
3372 date: 70 01 01 04 +0000
3378 date: 70 01 01 04 +0000
3373 date: 70 01 01 08 +0000
3379 date: 70 01 01 08 +0000
3374 date: 70 01 01 07 +0000
3380 date: 70 01 01 07 +0000
3375 date: 70 01 01 06 +0000
3381 date: 70 01 01 06 +0000
3376 date: 70 01 01 05 +0100
3382 date: 70 01 01 05 +0100
3377 date: 70 01 01 04 +0000
3383 date: 70 01 01 04 +0000
3378 date: 70 01 01 03 +0000
3384 date: 70 01 01 03 +0000
3379 date: 70 01 01 02 +0000
3385 date: 70 01 01 02 +0000
3380 date: 70 01 01 01 +0000
3386 date: 70 01 01 01 +0000
3381 date: 70 01 01 00 +0000
3387 date: 70 01 01 00 +0000
3382
3388
3383 Test invalid date:
3389 Test invalid date:
3384
3390
3385 $ hg log -R latesttag -T '{date(rev)}\n'
3391 $ hg log -R latesttag -T '{date(rev)}\n'
3386 hg: parse error: date expects a date information
3392 hg: parse error: date expects a date information
3387 [255]
3393 [255]
3388
3394
3389 Test integer literal:
3395 Test integer literal:
3390
3396
3391 $ hg debugtemplate -v '{(0)}\n'
3397 $ hg debugtemplate -v '{(0)}\n'
3392 (template
3398 (template
3393 (group
3399 (group
3394 (integer '0'))
3400 (integer '0'))
3395 (string '\n'))
3401 (string '\n'))
3396 0
3402 0
3397 $ hg debugtemplate -v '{(123)}\n'
3403 $ hg debugtemplate -v '{(123)}\n'
3398 (template
3404 (template
3399 (group
3405 (group
3400 (integer '123'))
3406 (integer '123'))
3401 (string '\n'))
3407 (string '\n'))
3402 123
3408 123
3403 $ hg debugtemplate -v '{(-4)}\n'
3409 $ hg debugtemplate -v '{(-4)}\n'
3404 (template
3410 (template
3405 (group
3411 (group
3406 (negate
3412 (negate
3407 (integer '4')))
3413 (integer '4')))
3408 (string '\n'))
3414 (string '\n'))
3409 -4
3415 -4
3410 $ hg debugtemplate '{(-)}\n'
3416 $ hg debugtemplate '{(-)}\n'
3411 hg: parse error at 3: not a prefix: )
3417 hg: parse error at 3: not a prefix: )
3412 ({(-)}\n
3418 ({(-)}\n
3413 ^ here)
3419 ^ here)
3414 [255]
3420 [255]
3415 $ hg debugtemplate '{(-a)}\n'
3421 $ hg debugtemplate '{(-a)}\n'
3416 hg: parse error: negation needs an integer argument
3422 hg: parse error: negation needs an integer argument
3417 [255]
3423 [255]
3418
3424
3419 top-level integer literal is interpreted as symbol (i.e. variable name):
3425 top-level integer literal is interpreted as symbol (i.e. variable name):
3420
3426
3421 $ hg debugtemplate -D 1=one -v '{1}\n'
3427 $ hg debugtemplate -D 1=one -v '{1}\n'
3422 (template
3428 (template
3423 (integer '1')
3429 (integer '1')
3424 (string '\n'))
3430 (string '\n'))
3425 one
3431 one
3426 $ hg debugtemplate -D 1=one -v '{if("t", "{1}")}\n'
3432 $ hg debugtemplate -D 1=one -v '{if("t", "{1}")}\n'
3427 (template
3433 (template
3428 (func
3434 (func
3429 (symbol 'if')
3435 (symbol 'if')
3430 (list
3436 (list
3431 (string 't')
3437 (string 't')
3432 (template
3438 (template
3433 (integer '1'))))
3439 (integer '1'))))
3434 (string '\n'))
3440 (string '\n'))
3435 one
3441 one
3436 $ hg debugtemplate -D 1=one -v '{1|stringify}\n'
3442 $ hg debugtemplate -D 1=one -v '{1|stringify}\n'
3437 (template
3443 (template
3438 (|
3444 (|
3439 (integer '1')
3445 (integer '1')
3440 (symbol 'stringify'))
3446 (symbol 'stringify'))
3441 (string '\n'))
3447 (string '\n'))
3442 one
3448 one
3443
3449
3444 unless explicit symbol is expected:
3450 unless explicit symbol is expected:
3445
3451
3446 $ hg log -Ra -r0 -T '{desc|1}\n'
3452 $ hg log -Ra -r0 -T '{desc|1}\n'
3447 hg: parse error: expected a symbol, got 'integer'
3453 hg: parse error: expected a symbol, got 'integer'
3448 [255]
3454 [255]
3449 $ hg log -Ra -r0 -T '{1()}\n'
3455 $ hg log -Ra -r0 -T '{1()}\n'
3450 hg: parse error: expected a symbol, got 'integer'
3456 hg: parse error: expected a symbol, got 'integer'
3451 [255]
3457 [255]
3452
3458
3453 Test string literal:
3459 Test string literal:
3454
3460
3455 $ hg debugtemplate -Ra -r0 -v '{"string with no template fragment"}\n'
3461 $ hg debugtemplate -Ra -r0 -v '{"string with no template fragment"}\n'
3456 (template
3462 (template
3457 (string 'string with no template fragment')
3463 (string 'string with no template fragment')
3458 (string '\n'))
3464 (string '\n'))
3459 string with no template fragment
3465 string with no template fragment
3460 $ hg debugtemplate -Ra -r0 -v '{"template: {rev}"}\n'
3466 $ hg debugtemplate -Ra -r0 -v '{"template: {rev}"}\n'
3461 (template
3467 (template
3462 (template
3468 (template
3463 (string 'template: ')
3469 (string 'template: ')
3464 (symbol 'rev'))
3470 (symbol 'rev'))
3465 (string '\n'))
3471 (string '\n'))
3466 template: 0
3472 template: 0
3467 $ hg debugtemplate -Ra -r0 -v '{r"rawstring: {rev}"}\n'
3473 $ hg debugtemplate -Ra -r0 -v '{r"rawstring: {rev}"}\n'
3468 (template
3474 (template
3469 (string 'rawstring: {rev}')
3475 (string 'rawstring: {rev}')
3470 (string '\n'))
3476 (string '\n'))
3471 rawstring: {rev}
3477 rawstring: {rev}
3472 $ hg debugtemplate -Ra -r0 -v '{files % r"rawstring: {file}"}\n'
3478 $ hg debugtemplate -Ra -r0 -v '{files % r"rawstring: {file}"}\n'
3473 (template
3479 (template
3474 (%
3480 (%
3475 (symbol 'files')
3481 (symbol 'files')
3476 (string 'rawstring: {file}'))
3482 (string 'rawstring: {file}'))
3477 (string '\n'))
3483 (string '\n'))
3478 rawstring: {file}
3484 rawstring: {file}
3479
3485
3480 Test string escaping:
3486 Test string escaping:
3481
3487
3482 $ hg log -R latesttag -r 0 --template '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3488 $ hg log -R latesttag -r 0 --template '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3483 >
3489 >
3484 <>\n<[>
3490 <>\n<[>
3485 <>\n<]>
3491 <>\n<]>
3486 <>\n<
3492 <>\n<
3487
3493
3488 $ hg log -R latesttag -r 0 \
3494 $ hg log -R latesttag -r 0 \
3489 > --config ui.logtemplate='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3495 > --config ui.logtemplate='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3490 >
3496 >
3491 <>\n<[>
3497 <>\n<[>
3492 <>\n<]>
3498 <>\n<]>
3493 <>\n<
3499 <>\n<
3494
3500
3495 $ hg log -R latesttag -r 0 -T esc \
3501 $ hg log -R latesttag -r 0 -T esc \
3496 > --config templates.esc='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3502 > --config templates.esc='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3497 >
3503 >
3498 <>\n<[>
3504 <>\n<[>
3499 <>\n<]>
3505 <>\n<]>
3500 <>\n<
3506 <>\n<
3501
3507
3502 $ cat <<'EOF' > esctmpl
3508 $ cat <<'EOF' > esctmpl
3503 > changeset = '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3509 > changeset = '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3504 > EOF
3510 > EOF
3505 $ hg log -R latesttag -r 0 --style ./esctmpl
3511 $ hg log -R latesttag -r 0 --style ./esctmpl
3506 >
3512 >
3507 <>\n<[>
3513 <>\n<[>
3508 <>\n<]>
3514 <>\n<]>
3509 <>\n<
3515 <>\n<
3510
3516
3511 Test string escaping of quotes:
3517 Test string escaping of quotes:
3512
3518
3513 $ hg log -Ra -r0 -T '{"\""}\n'
3519 $ hg log -Ra -r0 -T '{"\""}\n'
3514 "
3520 "
3515 $ hg log -Ra -r0 -T '{"\\\""}\n'
3521 $ hg log -Ra -r0 -T '{"\\\""}\n'
3516 \"
3522 \"
3517 $ hg log -Ra -r0 -T '{r"\""}\n'
3523 $ hg log -Ra -r0 -T '{r"\""}\n'
3518 \"
3524 \"
3519 $ hg log -Ra -r0 -T '{r"\\\""}\n'
3525 $ hg log -Ra -r0 -T '{r"\\\""}\n'
3520 \\\"
3526 \\\"
3521
3527
3522
3528
3523 $ hg log -Ra -r0 -T '{"\""}\n'
3529 $ hg log -Ra -r0 -T '{"\""}\n'
3524 "
3530 "
3525 $ hg log -Ra -r0 -T '{"\\\""}\n'
3531 $ hg log -Ra -r0 -T '{"\\\""}\n'
3526 \"
3532 \"
3527 $ hg log -Ra -r0 -T '{r"\""}\n'
3533 $ hg log -Ra -r0 -T '{r"\""}\n'
3528 \"
3534 \"
3529 $ hg log -Ra -r0 -T '{r"\\\""}\n'
3535 $ hg log -Ra -r0 -T '{r"\\\""}\n'
3530 \\\"
3536 \\\"
3531
3537
3532 Test exception in quoted template. single backslash before quotation mark is
3538 Test exception in quoted template. single backslash before quotation mark is
3533 stripped before parsing:
3539 stripped before parsing:
3534
3540
3535 $ cat <<'EOF' > escquotetmpl
3541 $ cat <<'EOF' > escquotetmpl
3536 > changeset = "\" \\" \\\" \\\\" {files % \"{file}\"}\n"
3542 > changeset = "\" \\" \\\" \\\\" {files % \"{file}\"}\n"
3537 > EOF
3543 > EOF
3538 $ cd latesttag
3544 $ cd latesttag
3539 $ hg log -r 2 --style ../escquotetmpl
3545 $ hg log -r 2 --style ../escquotetmpl
3540 " \" \" \\" head1
3546 " \" \" \\" head1
3541
3547
3542 $ hg log -r 2 -T esc --config templates.esc='"{\"valid\"}\n"'
3548 $ hg log -r 2 -T esc --config templates.esc='"{\"valid\"}\n"'
3543 valid
3549 valid
3544 $ hg log -r 2 -T esc --config templates.esc="'"'{\'"'"'valid\'"'"'}\n'"'"
3550 $ hg log -r 2 -T esc --config templates.esc="'"'{\'"'"'valid\'"'"'}\n'"'"
3545 valid
3551 valid
3546
3552
3547 Test compatibility with 2.9.2-3.4 of escaped quoted strings in nested
3553 Test compatibility with 2.9.2-3.4 of escaped quoted strings in nested
3548 _evalifliteral() templates (issue4733):
3554 _evalifliteral() templates (issue4733):
3549
3555
3550 $ hg log -r 2 -T '{if(rev, "\"{rev}")}\n'
3556 $ hg log -r 2 -T '{if(rev, "\"{rev}")}\n'
3551 "2
3557 "2
3552 $ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\"{rev}\")}")}\n'
3558 $ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\"{rev}\")}")}\n'
3553 "2
3559 "2
3554 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\"{rev}\\\")}\")}")}\n'
3560 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\"{rev}\\\")}\")}")}\n'
3555 "2
3561 "2
3556
3562
3557 $ hg log -r 2 -T '{if(rev, "\\\"")}\n'
3563 $ hg log -r 2 -T '{if(rev, "\\\"")}\n'
3558 \"
3564 \"
3559 $ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\\\\\"\")}")}\n'
3565 $ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\\\\\"\")}")}\n'
3560 \"
3566 \"
3561 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
3567 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
3562 \"
3568 \"
3563
3569
3564 $ hg log -r 2 -T '{if(rev, r"\\\"")}\n'
3570 $ hg log -r 2 -T '{if(rev, r"\\\"")}\n'
3565 \\\"
3571 \\\"
3566 $ hg log -r 2 -T '{if(rev, "{if(rev, r\"\\\\\\\"\")}")}\n'
3572 $ hg log -r 2 -T '{if(rev, "{if(rev, r\"\\\\\\\"\")}")}\n'
3567 \\\"
3573 \\\"
3568 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, r\\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
3574 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, r\\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
3569 \\\"
3575 \\\"
3570
3576
3571 escaped single quotes and errors:
3577 escaped single quotes and errors:
3572
3578
3573 $ hg log -r 2 -T "{if(rev, '{if(rev, \'foo\')}')}"'\n'
3579 $ hg log -r 2 -T "{if(rev, '{if(rev, \'foo\')}')}"'\n'
3574 foo
3580 foo
3575 $ hg log -r 2 -T "{if(rev, '{if(rev, r\'foo\')}')}"'\n'
3581 $ hg log -r 2 -T "{if(rev, '{if(rev, r\'foo\')}')}"'\n'
3576 foo
3582 foo
3577 $ hg log -r 2 -T '{if(rev, "{if(rev, \")}")}\n'
3583 $ hg log -r 2 -T '{if(rev, "{if(rev, \")}")}\n'
3578 hg: parse error at 21: unterminated string
3584 hg: parse error at 21: unterminated string
3579 ({if(rev, "{if(rev, \")}")}\n
3585 ({if(rev, "{if(rev, \")}")}\n
3580 ^ here)
3586 ^ here)
3581 [255]
3587 [255]
3582 $ hg log -r 2 -T '{if(rev, \"\\"")}\n'
3588 $ hg log -r 2 -T '{if(rev, \"\\"")}\n'
3583 hg: parse error: trailing \ in string
3589 hg: parse error: trailing \ in string
3584 [255]
3590 [255]
3585 $ hg log -r 2 -T '{if(rev, r\"\\"")}\n'
3591 $ hg log -r 2 -T '{if(rev, r\"\\"")}\n'
3586 hg: parse error: trailing \ in string
3592 hg: parse error: trailing \ in string
3587 [255]
3593 [255]
3588
3594
3589 $ cd ..
3595 $ cd ..
3590
3596
3591 Test leading backslashes:
3597 Test leading backslashes:
3592
3598
3593 $ cd latesttag
3599 $ cd latesttag
3594 $ hg log -r 2 -T '\{rev} {files % "\{file}"}\n'
3600 $ hg log -r 2 -T '\{rev} {files % "\{file}"}\n'
3595 {rev} {file}
3601 {rev} {file}
3596 $ hg log -r 2 -T '\\{rev} {files % "\\{file}"}\n'
3602 $ hg log -r 2 -T '\\{rev} {files % "\\{file}"}\n'
3597 \2 \head1
3603 \2 \head1
3598 $ hg log -r 2 -T '\\\{rev} {files % "\\\{file}"}\n'
3604 $ hg log -r 2 -T '\\\{rev} {files % "\\\{file}"}\n'
3599 \{rev} \{file}
3605 \{rev} \{file}
3600 $ cd ..
3606 $ cd ..
3601
3607
3602 Test leading backslashes in "if" expression (issue4714):
3608 Test leading backslashes in "if" expression (issue4714):
3603
3609
3604 $ cd latesttag
3610 $ cd latesttag
3605 $ hg log -r 2 -T '{if("1", "\{rev}")} {if("1", r"\{rev}")}\n'
3611 $ hg log -r 2 -T '{if("1", "\{rev}")} {if("1", r"\{rev}")}\n'
3606 {rev} \{rev}
3612 {rev} \{rev}
3607 $ hg log -r 2 -T '{if("1", "\\{rev}")} {if("1", r"\\{rev}")}\n'
3613 $ hg log -r 2 -T '{if("1", "\\{rev}")} {if("1", r"\\{rev}")}\n'
3608 \2 \\{rev}
3614 \2 \\{rev}
3609 $ hg log -r 2 -T '{if("1", "\\\{rev}")} {if("1", r"\\\{rev}")}\n'
3615 $ hg log -r 2 -T '{if("1", "\\\{rev}")} {if("1", r"\\\{rev}")}\n'
3610 \{rev} \\\{rev}
3616 \{rev} \\\{rev}
3611 $ cd ..
3617 $ cd ..
3612
3618
3613 "string-escape"-ed "\x5c\x786e" becomes r"\x6e" (once) or r"n" (twice)
3619 "string-escape"-ed "\x5c\x786e" becomes r"\x6e" (once) or r"n" (twice)
3614
3620
3615 $ hg log -R a -r 0 --template '{if("1", "\x5c\x786e", "NG")}\n'
3621 $ hg log -R a -r 0 --template '{if("1", "\x5c\x786e", "NG")}\n'
3616 \x6e
3622 \x6e
3617 $ hg log -R a -r 0 --template '{if("1", r"\x5c\x786e", "NG")}\n'
3623 $ hg log -R a -r 0 --template '{if("1", r"\x5c\x786e", "NG")}\n'
3618 \x5c\x786e
3624 \x5c\x786e
3619 $ hg log -R a -r 0 --template '{if("", "NG", "\x5c\x786e")}\n'
3625 $ hg log -R a -r 0 --template '{if("", "NG", "\x5c\x786e")}\n'
3620 \x6e
3626 \x6e
3621 $ hg log -R a -r 0 --template '{if("", "NG", r"\x5c\x786e")}\n'
3627 $ hg log -R a -r 0 --template '{if("", "NG", r"\x5c\x786e")}\n'
3622 \x5c\x786e
3628 \x5c\x786e
3623
3629
3624 $ hg log -R a -r 2 --template '{ifeq("no perso\x6e", desc, "\x5c\x786e", "NG")}\n'
3630 $ hg log -R a -r 2 --template '{ifeq("no perso\x6e", desc, "\x5c\x786e", "NG")}\n'
3625 \x6e
3631 \x6e
3626 $ hg log -R a -r 2 --template '{ifeq(r"no perso\x6e", desc, "NG", r"\x5c\x786e")}\n'
3632 $ hg log -R a -r 2 --template '{ifeq(r"no perso\x6e", desc, "NG", r"\x5c\x786e")}\n'
3627 \x5c\x786e
3633 \x5c\x786e
3628 $ hg log -R a -r 2 --template '{ifeq(desc, "no perso\x6e", "\x5c\x786e", "NG")}\n'
3634 $ hg log -R a -r 2 --template '{ifeq(desc, "no perso\x6e", "\x5c\x786e", "NG")}\n'
3629 \x6e
3635 \x6e
3630 $ hg log -R a -r 2 --template '{ifeq(desc, r"no perso\x6e", "NG", r"\x5c\x786e")}\n'
3636 $ hg log -R a -r 2 --template '{ifeq(desc, r"no perso\x6e", "NG", r"\x5c\x786e")}\n'
3631 \x5c\x786e
3637 \x5c\x786e
3632
3638
3633 $ hg log -R a -r 8 --template '{join(files, "\n")}\n'
3639 $ hg log -R a -r 8 --template '{join(files, "\n")}\n'
3634 fourth
3640 fourth
3635 second
3641 second
3636 third
3642 third
3637 $ hg log -R a -r 8 --template '{join(files, r"\n")}\n'
3643 $ hg log -R a -r 8 --template '{join(files, r"\n")}\n'
3638 fourth\nsecond\nthird
3644 fourth\nsecond\nthird
3639
3645
3640 $ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", "htm\x6c")}'
3646 $ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", "htm\x6c")}'
3641 <p>
3647 <p>
3642 1st
3648 1st
3643 </p>
3649 </p>
3644 <p>
3650 <p>
3645 2nd
3651 2nd
3646 </p>
3652 </p>
3647 $ hg log -R a -r 2 --template '{rstdoc(r"1st\n\n2nd", "html")}'
3653 $ hg log -R a -r 2 --template '{rstdoc(r"1st\n\n2nd", "html")}'
3648 <p>
3654 <p>
3649 1st\n\n2nd
3655 1st\n\n2nd
3650 </p>
3656 </p>
3651 $ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", r"htm\x6c")}'
3657 $ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", r"htm\x6c")}'
3652 1st
3658 1st
3653
3659
3654 2nd
3660 2nd
3655
3661
3656 $ hg log -R a -r 2 --template '{strip(desc, "\x6e")}\n'
3662 $ hg log -R a -r 2 --template '{strip(desc, "\x6e")}\n'
3657 o perso
3663 o perso
3658 $ hg log -R a -r 2 --template '{strip(desc, r"\x6e")}\n'
3664 $ hg log -R a -r 2 --template '{strip(desc, r"\x6e")}\n'
3659 no person
3665 no person
3660 $ hg log -R a -r 2 --template '{strip("no perso\x6e", "\x6e")}\n'
3666 $ hg log -R a -r 2 --template '{strip("no perso\x6e", "\x6e")}\n'
3661 o perso
3667 o perso
3662 $ hg log -R a -r 2 --template '{strip(r"no perso\x6e", r"\x6e")}\n'
3668 $ hg log -R a -r 2 --template '{strip(r"no perso\x6e", r"\x6e")}\n'
3663 no perso
3669 no perso
3664
3670
3665 $ hg log -R a -r 2 --template '{sub("\\x6e", "\x2d", desc)}\n'
3671 $ hg log -R a -r 2 --template '{sub("\\x6e", "\x2d", desc)}\n'
3666 -o perso-
3672 -o perso-
3667 $ hg log -R a -r 2 --template '{sub(r"\\x6e", "-", desc)}\n'
3673 $ hg log -R a -r 2 --template '{sub(r"\\x6e", "-", desc)}\n'
3668 no person
3674 no person
3669 $ hg log -R a -r 2 --template '{sub("n", r"\x2d", desc)}\n'
3675 $ hg log -R a -r 2 --template '{sub("n", r"\x2d", desc)}\n'
3670 \x2do perso\x2d
3676 \x2do perso\x2d
3671 $ hg log -R a -r 2 --template '{sub("n", "\x2d", "no perso\x6e")}\n'
3677 $ hg log -R a -r 2 --template '{sub("n", "\x2d", "no perso\x6e")}\n'
3672 -o perso-
3678 -o perso-
3673 $ hg log -R a -r 2 --template '{sub("n", r"\x2d", r"no perso\x6e")}\n'
3679 $ hg log -R a -r 2 --template '{sub("n", r"\x2d", r"no perso\x6e")}\n'
3674 \x2do perso\x6e
3680 \x2do perso\x6e
3675
3681
3676 $ hg log -R a -r 8 --template '{files % "{file}\n"}'
3682 $ hg log -R a -r 8 --template '{files % "{file}\n"}'
3677 fourth
3683 fourth
3678 second
3684 second
3679 third
3685 third
3680
3686
3681 Test string escaping in nested expression:
3687 Test string escaping in nested expression:
3682
3688
3683 $ hg log -R a -r 8 --template '{ifeq(r"\x6e", if("1", "\x5c\x786e"), join(files, "\x5c\x786e"))}\n'
3689 $ hg log -R a -r 8 --template '{ifeq(r"\x6e", if("1", "\x5c\x786e"), join(files, "\x5c\x786e"))}\n'
3684 fourth\x6esecond\x6ethird
3690 fourth\x6esecond\x6ethird
3685 $ hg log -R a -r 8 --template '{ifeq(if("1", r"\x6e"), "\x5c\x786e", join(files, "\x5c\x786e"))}\n'
3691 $ hg log -R a -r 8 --template '{ifeq(if("1", r"\x6e"), "\x5c\x786e", join(files, "\x5c\x786e"))}\n'
3686 fourth\x6esecond\x6ethird
3692 fourth\x6esecond\x6ethird
3687
3693
3688 $ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", "\x5c\x786e"))}\n'
3694 $ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", "\x5c\x786e"))}\n'
3689 fourth\x6esecond\x6ethird
3695 fourth\x6esecond\x6ethird
3690 $ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", r"\x5c\x786e"))}\n'
3696 $ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", r"\x5c\x786e"))}\n'
3691 fourth\x5c\x786esecond\x5c\x786ethird
3697 fourth\x5c\x786esecond\x5c\x786ethird
3692
3698
3693 $ hg log -R a -r 3:4 --template '{rev}:{sub(if("1", "\x6e"), ifeq(branch, "foo", r"\x5c\x786e", "\x5c\x786e"), desc)}\n'
3699 $ hg log -R a -r 3:4 --template '{rev}:{sub(if("1", "\x6e"), ifeq(branch, "foo", r"\x5c\x786e", "\x5c\x786e"), desc)}\n'
3694 3:\x6eo user, \x6eo domai\x6e
3700 3:\x6eo user, \x6eo domai\x6e
3695 4:\x5c\x786eew bra\x5c\x786ech
3701 4:\x5c\x786eew bra\x5c\x786ech
3696
3702
3697 Test quotes in nested expression are evaluated just like a $(command)
3703 Test quotes in nested expression are evaluated just like a $(command)
3698 substitution in POSIX shells:
3704 substitution in POSIX shells:
3699
3705
3700 $ hg log -R a -r 8 -T '{"{"{rev}:{node|short}"}"}\n'
3706 $ hg log -R a -r 8 -T '{"{"{rev}:{node|short}"}"}\n'
3701 8:95c24699272e
3707 8:95c24699272e
3702 $ hg log -R a -r 8 -T '{"{"\{{rev}} \"{node|short}\""}"}\n'
3708 $ hg log -R a -r 8 -T '{"{"\{{rev}} \"{node|short}\""}"}\n'
3703 {8} "95c24699272e"
3709 {8} "95c24699272e"
3704
3710
3705 Test recursive evaluation:
3711 Test recursive evaluation:
3706
3712
3707 $ hg init r
3713 $ hg init r
3708 $ cd r
3714 $ cd r
3709 $ echo a > a
3715 $ echo a > a
3710 $ hg ci -Am '{rev}'
3716 $ hg ci -Am '{rev}'
3711 adding a
3717 adding a
3712 $ hg log -r 0 --template '{if(rev, desc)}\n'
3718 $ hg log -r 0 --template '{if(rev, desc)}\n'
3713 {rev}
3719 {rev}
3714 $ hg log -r 0 --template '{if(rev, "{author} {rev}")}\n'
3720 $ hg log -r 0 --template '{if(rev, "{author} {rev}")}\n'
3715 test 0
3721 test 0
3716
3722
3717 $ hg branch -q 'text.{rev}'
3723 $ hg branch -q 'text.{rev}'
3718 $ echo aa >> aa
3724 $ echo aa >> aa
3719 $ hg ci -u '{node|short}' -m 'desc to be wrapped desc to be wrapped'
3725 $ hg ci -u '{node|short}' -m 'desc to be wrapped desc to be wrapped'
3720
3726
3721 $ hg log -l1 --template '{fill(desc, "20", author, branch)}'
3727 $ hg log -l1 --template '{fill(desc, "20", author, branch)}'
3722 {node|short}desc to
3728 {node|short}desc to
3723 text.{rev}be wrapped
3729 text.{rev}be wrapped
3724 text.{rev}desc to be
3730 text.{rev}desc to be
3725 text.{rev}wrapped (no-eol)
3731 text.{rev}wrapped (no-eol)
3726 $ hg log -l1 --template '{fill(desc, "20", "{node|short}:", "text.{rev}:")}'
3732 $ hg log -l1 --template '{fill(desc, "20", "{node|short}:", "text.{rev}:")}'
3727 bcc7ff960b8e:desc to
3733 bcc7ff960b8e:desc to
3728 text.1:be wrapped
3734 text.1:be wrapped
3729 text.1:desc to be
3735 text.1:desc to be
3730 text.1:wrapped (no-eol)
3736 text.1:wrapped (no-eol)
3731 $ hg log -l1 -T '{fill(desc, date, "", "")}\n'
3737 $ hg log -l1 -T '{fill(desc, date, "", "")}\n'
3732 hg: parse error: fill expects an integer width
3738 hg: parse error: fill expects an integer width
3733 [255]
3739 [255]
3734
3740
3735 $ COLUMNS=25 hg log -l1 --template '{fill(desc, termwidth, "{node|short}:", "termwidth.{rev}:")}'
3741 $ COLUMNS=25 hg log -l1 --template '{fill(desc, termwidth, "{node|short}:", "termwidth.{rev}:")}'
3736 bcc7ff960b8e:desc to be
3742 bcc7ff960b8e:desc to be
3737 termwidth.1:wrapped desc
3743 termwidth.1:wrapped desc
3738 termwidth.1:to be wrapped (no-eol)
3744 termwidth.1:to be wrapped (no-eol)
3739
3745
3740 $ hg log -l 1 --template '{sub(r"[0-9]", "-", author)}'
3746 $ hg log -l 1 --template '{sub(r"[0-9]", "-", author)}'
3741 {node|short} (no-eol)
3747 {node|short} (no-eol)
3742 $ hg log -l 1 --template '{sub(r"[0-9]", "-", "{node|short}")}'
3748 $ hg log -l 1 --template '{sub(r"[0-9]", "-", "{node|short}")}'
3743 bcc-ff---b-e (no-eol)
3749 bcc-ff---b-e (no-eol)
3744
3750
3745 $ cat >> .hg/hgrc <<EOF
3751 $ cat >> .hg/hgrc <<EOF
3746 > [extensions]
3752 > [extensions]
3747 > color=
3753 > color=
3748 > [color]
3754 > [color]
3749 > mode=ansi
3755 > mode=ansi
3750 > text.{rev} = red
3756 > text.{rev} = red
3751 > text.1 = green
3757 > text.1 = green
3752 > EOF
3758 > EOF
3753 $ hg log --color=always -l 1 --template '{label(branch, "text\n")}'
3759 $ hg log --color=always -l 1 --template '{label(branch, "text\n")}'
3754 \x1b[0;31mtext\x1b[0m (esc)
3760 \x1b[0;31mtext\x1b[0m (esc)
3755 $ hg log --color=always -l 1 --template '{label("text.{rev}", "text\n")}'
3761 $ hg log --color=always -l 1 --template '{label("text.{rev}", "text\n")}'
3756 \x1b[0;32mtext\x1b[0m (esc)
3762 \x1b[0;32mtext\x1b[0m (esc)
3757
3763
3758 color effect can be specified without quoting:
3764 color effect can be specified without quoting:
3759
3765
3760 $ hg log --color=always -l 1 --template '{label(red, "text\n")}'
3766 $ hg log --color=always -l 1 --template '{label(red, "text\n")}'
3761 \x1b[0;31mtext\x1b[0m (esc)
3767 \x1b[0;31mtext\x1b[0m (esc)
3762
3768
3763 color effects can be nested (issue5413)
3769 color effects can be nested (issue5413)
3764
3770
3765 $ hg debugtemplate --color=always \
3771 $ hg debugtemplate --color=always \
3766 > '{label(red, "red{label(magenta, "ma{label(cyan, "cyan")}{label(yellow, "yellow")}genta")}")}\n'
3772 > '{label(red, "red{label(magenta, "ma{label(cyan, "cyan")}{label(yellow, "yellow")}genta")}")}\n'
3767 \x1b[0;31mred\x1b[0;35mma\x1b[0;36mcyan\x1b[0m\x1b[0;31m\x1b[0;35m\x1b[0;33myellow\x1b[0m\x1b[0;31m\x1b[0;35mgenta\x1b[0m (esc)
3773 \x1b[0;31mred\x1b[0;35mma\x1b[0;36mcyan\x1b[0m\x1b[0;31m\x1b[0;35m\x1b[0;33myellow\x1b[0m\x1b[0;31m\x1b[0;35mgenta\x1b[0m (esc)
3768
3774
3769 pad() should interact well with color codes (issue5416)
3775 pad() should interact well with color codes (issue5416)
3770
3776
3771 $ hg debugtemplate --color=always \
3777 $ hg debugtemplate --color=always \
3772 > '{pad(label(red, "red"), 5, label(cyan, "-"))}\n'
3778 > '{pad(label(red, "red"), 5, label(cyan, "-"))}\n'
3773 \x1b[0;31mred\x1b[0m\x1b[0;36m-\x1b[0m\x1b[0;36m-\x1b[0m (esc)
3779 \x1b[0;31mred\x1b[0m\x1b[0;36m-\x1b[0m\x1b[0;36m-\x1b[0m (esc)
3774
3780
3775 label should be no-op if color is disabled:
3781 label should be no-op if color is disabled:
3776
3782
3777 $ hg log --color=never -l 1 --template '{label(red, "text\n")}'
3783 $ hg log --color=never -l 1 --template '{label(red, "text\n")}'
3778 text
3784 text
3779 $ hg log --config extensions.color=! -l 1 --template '{label(red, "text\n")}'
3785 $ hg log --config extensions.color=! -l 1 --template '{label(red, "text\n")}'
3780 text
3786 text
3781
3787
3782 Test branches inside if statement:
3788 Test branches inside if statement:
3783
3789
3784 $ hg log -r 0 --template '{if(branches, "yes", "no")}\n'
3790 $ hg log -r 0 --template '{if(branches, "yes", "no")}\n'
3785 no
3791 no
3786
3792
3787 Test dict constructor:
3793 Test dict constructor:
3788
3794
3789 $ hg log -r 0 -T '{dict(y=node|short, x=rev)}\n'
3795 $ hg log -r 0 -T '{dict(y=node|short, x=rev)}\n'
3790 y=f7769ec2ab97 x=0
3796 y=f7769ec2ab97 x=0
3791 $ hg log -r 0 -T '{dict(x=rev, y=node|short) % "{key}={value}\n"}'
3797 $ hg log -r 0 -T '{dict(x=rev, y=node|short) % "{key}={value}\n"}'
3792 x=0
3798 x=0
3793 y=f7769ec2ab97
3799 y=f7769ec2ab97
3794 $ hg log -r 0 -T '{dict(x=rev, y=node|short)|json}\n'
3800 $ hg log -r 0 -T '{dict(x=rev, y=node|short)|json}\n'
3795 {"x": 0, "y": "f7769ec2ab97"}
3801 {"x": 0, "y": "f7769ec2ab97"}
3796 $ hg log -r 0 -T '{dict()|json}\n'
3802 $ hg log -r 0 -T '{dict()|json}\n'
3797 {}
3803 {}
3798
3804
3799 $ hg log -r 0 -T '{dict(rev, node=node|short)}\n'
3805 $ hg log -r 0 -T '{dict(rev, node=node|short)}\n'
3800 rev=0 node=f7769ec2ab97
3806 rev=0 node=f7769ec2ab97
3801 $ hg log -r 0 -T '{dict(rev, node|short)}\n'
3807 $ hg log -r 0 -T '{dict(rev, node|short)}\n'
3802 rev=0 node=f7769ec2ab97
3808 rev=0 node=f7769ec2ab97
3803
3809
3804 $ hg log -r 0 -T '{dict(rev, rev=rev)}\n'
3810 $ hg log -r 0 -T '{dict(rev, rev=rev)}\n'
3805 hg: parse error: duplicated dict key 'rev' inferred
3811 hg: parse error: duplicated dict key 'rev' inferred
3806 [255]
3812 [255]
3807 $ hg log -r 0 -T '{dict(node, node|short)}\n'
3813 $ hg log -r 0 -T '{dict(node, node|short)}\n'
3808 hg: parse error: duplicated dict key 'node' inferred
3814 hg: parse error: duplicated dict key 'node' inferred
3809 [255]
3815 [255]
3810 $ hg log -r 0 -T '{dict(1 + 2)}'
3816 $ hg log -r 0 -T '{dict(1 + 2)}'
3811 hg: parse error: dict key cannot be inferred
3817 hg: parse error: dict key cannot be inferred
3812 [255]
3818 [255]
3813
3819
3814 $ hg log -r 0 -T '{dict(x=rev, x=node)}'
3820 $ hg log -r 0 -T '{dict(x=rev, x=node)}'
3815 hg: parse error: dict got multiple values for keyword argument 'x'
3821 hg: parse error: dict got multiple values for keyword argument 'x'
3816 [255]
3822 [255]
3817
3823
3818 Test get function:
3824 Test get function:
3819
3825
3820 $ hg log -r 0 --template '{get(extras, "branch")}\n'
3826 $ hg log -r 0 --template '{get(extras, "branch")}\n'
3821 default
3827 default
3822 $ hg log -r 0 --template '{get(extras, "br{"anch"}")}\n'
3828 $ hg log -r 0 --template '{get(extras, "br{"anch"}")}\n'
3823 default
3829 default
3824 $ hg log -r 0 --template '{get(files, "should_fail")}\n'
3830 $ hg log -r 0 --template '{get(files, "should_fail")}\n'
3825 hg: parse error: get() expects a dict as first argument
3831 hg: parse error: get() expects a dict as first argument
3826 [255]
3832 [255]
3827
3833
3828 Test json filter applied to hybrid object:
3834 Test json filter applied to hybrid object:
3829
3835
3830 $ hg log -r0 -T '{files|json}\n'
3836 $ hg log -r0 -T '{files|json}\n'
3831 ["a"]
3837 ["a"]
3832 $ hg log -r0 -T '{extras|json}\n'
3838 $ hg log -r0 -T '{extras|json}\n'
3833 {"branch": "default"}
3839 {"branch": "default"}
3834
3840
3835 Test localdate(date, tz) function:
3841 Test localdate(date, tz) function:
3836
3842
3837 $ TZ=JST-09 hg log -r0 -T '{date|localdate|isodate}\n'
3843 $ TZ=JST-09 hg log -r0 -T '{date|localdate|isodate}\n'
3838 1970-01-01 09:00 +0900
3844 1970-01-01 09:00 +0900
3839 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "UTC")|isodate}\n'
3845 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "UTC")|isodate}\n'
3840 1970-01-01 00:00 +0000
3846 1970-01-01 00:00 +0000
3841 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "blahUTC")|isodate}\n'
3847 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "blahUTC")|isodate}\n'
3842 hg: parse error: localdate expects a timezone
3848 hg: parse error: localdate expects a timezone
3843 [255]
3849 [255]
3844 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "+0200")|isodate}\n'
3850 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "+0200")|isodate}\n'
3845 1970-01-01 02:00 +0200
3851 1970-01-01 02:00 +0200
3846 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "0")|isodate}\n'
3852 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "0")|isodate}\n'
3847 1970-01-01 00:00 +0000
3853 1970-01-01 00:00 +0000
3848 $ TZ=JST-09 hg log -r0 -T '{localdate(date, 0)|isodate}\n'
3854 $ TZ=JST-09 hg log -r0 -T '{localdate(date, 0)|isodate}\n'
3849 1970-01-01 00:00 +0000
3855 1970-01-01 00:00 +0000
3850 $ hg log -r0 -T '{localdate(date, "invalid")|isodate}\n'
3856 $ hg log -r0 -T '{localdate(date, "invalid")|isodate}\n'
3851 hg: parse error: localdate expects a timezone
3857 hg: parse error: localdate expects a timezone
3852 [255]
3858 [255]
3853 $ hg log -r0 -T '{localdate(date, date)|isodate}\n'
3859 $ hg log -r0 -T '{localdate(date, date)|isodate}\n'
3854 hg: parse error: localdate expects a timezone
3860 hg: parse error: localdate expects a timezone
3855 [255]
3861 [255]
3856
3862
3857 Test shortest(node) function:
3863 Test shortest(node) function:
3858
3864
3859 $ echo b > b
3865 $ echo b > b
3860 $ hg ci -qAm b
3866 $ hg ci -qAm b
3861 $ hg log --template '{shortest(node)}\n'
3867 $ hg log --template '{shortest(node)}\n'
3862 e777
3868 e777
3863 bcc7
3869 bcc7
3864 f776
3870 f776
3865 $ hg log --template '{shortest(node, 10)}\n'
3871 $ hg log --template '{shortest(node, 10)}\n'
3866 e777603221
3872 e777603221
3867 bcc7ff960b
3873 bcc7ff960b
3868 f7769ec2ab
3874 f7769ec2ab
3869 $ hg log --template '{node|shortest}\n' -l1
3875 $ hg log --template '{node|shortest}\n' -l1
3870 e777
3876 e777
3871
3877
3872 $ hg log -r 0 -T '{shortest(node, "1{"0"}")}\n'
3878 $ hg log -r 0 -T '{shortest(node, "1{"0"}")}\n'
3873 f7769ec2ab
3879 f7769ec2ab
3874 $ hg log -r 0 -T '{shortest(node, "not an int")}\n'
3880 $ hg log -r 0 -T '{shortest(node, "not an int")}\n'
3875 hg: parse error: shortest() expects an integer minlength
3881 hg: parse error: shortest() expects an integer minlength
3876 [255]
3882 [255]
3877
3883
3878 $ hg log -r 'wdir()' -T '{node|shortest}\n'
3884 $ hg log -r 'wdir()' -T '{node|shortest}\n'
3879 ffff
3885 ffff
3880
3886
3881 $ cd ..
3887 $ cd ..
3882
3888
3883 Test shortest(node) with the repo having short hash collision:
3889 Test shortest(node) with the repo having short hash collision:
3884
3890
3885 $ hg init hashcollision
3891 $ hg init hashcollision
3886 $ cd hashcollision
3892 $ cd hashcollision
3887 $ cat <<EOF >> .hg/hgrc
3893 $ cat <<EOF >> .hg/hgrc
3888 > [experimental]
3894 > [experimental]
3889 > evolution.createmarkers=True
3895 > evolution.createmarkers=True
3890 > EOF
3896 > EOF
3891 $ echo 0 > a
3897 $ echo 0 > a
3892 $ hg ci -qAm 0
3898 $ hg ci -qAm 0
3893 $ for i in 17 129 248 242 480 580 617 1057 2857 4025; do
3899 $ for i in 17 129 248 242 480 580 617 1057 2857 4025; do
3894 > hg up -q 0
3900 > hg up -q 0
3895 > echo $i > a
3901 > echo $i > a
3896 > hg ci -qm $i
3902 > hg ci -qm $i
3897 > done
3903 > done
3898 $ hg up -q null
3904 $ hg up -q null
3899 $ hg log -r0: -T '{rev}:{node}\n'
3905 $ hg log -r0: -T '{rev}:{node}\n'
3900 0:b4e73ffab476aa0ee32ed81ca51e07169844bc6a
3906 0:b4e73ffab476aa0ee32ed81ca51e07169844bc6a
3901 1:11424df6dc1dd4ea255eae2b58eaca7831973bbc
3907 1:11424df6dc1dd4ea255eae2b58eaca7831973bbc
3902 2:11407b3f1b9c3e76a79c1ec5373924df096f0499
3908 2:11407b3f1b9c3e76a79c1ec5373924df096f0499
3903 3:11dd92fe0f39dfdaacdaa5f3997edc533875cfc4
3909 3:11dd92fe0f39dfdaacdaa5f3997edc533875cfc4
3904 4:10776689e627b465361ad5c296a20a487e153ca4
3910 4:10776689e627b465361ad5c296a20a487e153ca4
3905 5:a00be79088084cb3aff086ab799f8790e01a976b
3911 5:a00be79088084cb3aff086ab799f8790e01a976b
3906 6:a0b0acd79b4498d0052993d35a6a748dd51d13e6
3912 6:a0b0acd79b4498d0052993d35a6a748dd51d13e6
3907 7:a0457b3450b8e1b778f1163b31a435802987fe5d
3913 7:a0457b3450b8e1b778f1163b31a435802987fe5d
3908 8:c56256a09cd28e5764f32e8e2810d0f01e2e357a
3914 8:c56256a09cd28e5764f32e8e2810d0f01e2e357a
3909 9:c5623987d205cd6d9d8389bfc40fff9dbb670b48
3915 9:c5623987d205cd6d9d8389bfc40fff9dbb670b48
3910 10:c562ddd9c94164376c20b86b0b4991636a3bf84f
3916 10:c562ddd9c94164376c20b86b0b4991636a3bf84f
3911 $ hg debugobsolete a00be79088084cb3aff086ab799f8790e01a976b
3917 $ hg debugobsolete a00be79088084cb3aff086ab799f8790e01a976b
3912 obsoleted 1 changesets
3918 obsoleted 1 changesets
3913 $ hg debugobsolete c5623987d205cd6d9d8389bfc40fff9dbb670b48
3919 $ hg debugobsolete c5623987d205cd6d9d8389bfc40fff9dbb670b48
3914 obsoleted 1 changesets
3920 obsoleted 1 changesets
3915 $ hg debugobsolete c562ddd9c94164376c20b86b0b4991636a3bf84f
3921 $ hg debugobsolete c562ddd9c94164376c20b86b0b4991636a3bf84f
3916 obsoleted 1 changesets
3922 obsoleted 1 changesets
3917
3923
3918 nodes starting with '11' (we don't have the revision number '11' though)
3924 nodes starting with '11' (we don't have the revision number '11' though)
3919
3925
3920 $ hg log -r 1:3 -T '{rev}:{shortest(node, 0)}\n'
3926 $ hg log -r 1:3 -T '{rev}:{shortest(node, 0)}\n'
3921 1:1142
3927 1:1142
3922 2:1140
3928 2:1140
3923 3:11d
3929 3:11d
3924
3930
3925 '5:a00' is hidden, but still we have two nodes starting with 'a0'
3931 '5:a00' is hidden, but still we have two nodes starting with 'a0'
3926
3932
3927 $ hg log -r 6:7 -T '{rev}:{shortest(node, 0)}\n'
3933 $ hg log -r 6:7 -T '{rev}:{shortest(node, 0)}\n'
3928 6:a0b
3934 6:a0b
3929 7:a04
3935 7:a04
3930
3936
3931 node '10' conflicts with the revision number '10' even if it is hidden
3937 node '10' conflicts with the revision number '10' even if it is hidden
3932 (we could exclude hidden revision numbers, but currently we don't)
3938 (we could exclude hidden revision numbers, but currently we don't)
3933
3939
3934 $ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n'
3940 $ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n'
3935 4:107
3941 4:107
3936 $ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n' --hidden
3942 $ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n' --hidden
3937 4:107
3943 4:107
3938
3944
3939 node 'c562' should be unique if the other 'c562' nodes are hidden
3945 node 'c562' should be unique if the other 'c562' nodes are hidden
3940 (but we don't try the slow path to filter out hidden nodes for now)
3946 (but we don't try the slow path to filter out hidden nodes for now)
3941
3947
3942 $ hg log -r 8 -T '{rev}:{node|shortest}\n'
3948 $ hg log -r 8 -T '{rev}:{node|shortest}\n'
3943 8:c5625
3949 8:c5625
3944 $ hg log -r 8:10 -T '{rev}:{node|shortest}\n' --hidden
3950 $ hg log -r 8:10 -T '{rev}:{node|shortest}\n' --hidden
3945 8:c5625
3951 8:c5625
3946 9:c5623
3952 9:c5623
3947 10:c562d
3953 10:c562d
3948
3954
3949 $ cd ..
3955 $ cd ..
3950
3956
3951 Test pad function
3957 Test pad function
3952
3958
3953 $ cd r
3959 $ cd r
3954
3960
3955 $ hg log --template '{pad(rev, 20)} {author|user}\n'
3961 $ hg log --template '{pad(rev, 20)} {author|user}\n'
3956 2 test
3962 2 test
3957 1 {node|short}
3963 1 {node|short}
3958 0 test
3964 0 test
3959
3965
3960 $ hg log --template '{pad(rev, 20, " ", True)} {author|user}\n'
3966 $ hg log --template '{pad(rev, 20, " ", True)} {author|user}\n'
3961 2 test
3967 2 test
3962 1 {node|short}
3968 1 {node|short}
3963 0 test
3969 0 test
3964
3970
3965 $ hg log --template '{pad(rev, 20, "-", False)} {author|user}\n'
3971 $ hg log --template '{pad(rev, 20, "-", False)} {author|user}\n'
3966 2------------------- test
3972 2------------------- test
3967 1------------------- {node|short}
3973 1------------------- {node|short}
3968 0------------------- test
3974 0------------------- test
3969
3975
3970 Test template string in pad function
3976 Test template string in pad function
3971
3977
3972 $ hg log -r 0 -T '{pad("\{{rev}}", 10)} {author|user}\n'
3978 $ hg log -r 0 -T '{pad("\{{rev}}", 10)} {author|user}\n'
3973 {0} test
3979 {0} test
3974
3980
3975 $ hg log -r 0 -T '{pad(r"\{rev}", 10)} {author|user}\n'
3981 $ hg log -r 0 -T '{pad(r"\{rev}", 10)} {author|user}\n'
3976 \{rev} test
3982 \{rev} test
3977
3983
3978 Test width argument passed to pad function
3984 Test width argument passed to pad function
3979
3985
3980 $ hg log -r 0 -T '{pad(rev, "1{"0"}")} {author|user}\n'
3986 $ hg log -r 0 -T '{pad(rev, "1{"0"}")} {author|user}\n'
3981 0 test
3987 0 test
3982 $ hg log -r 0 -T '{pad(rev, "not an int")}\n'
3988 $ hg log -r 0 -T '{pad(rev, "not an int")}\n'
3983 hg: parse error: pad() expects an integer width
3989 hg: parse error: pad() expects an integer width
3984 [255]
3990 [255]
3985
3991
3986 Test invalid fillchar passed to pad function
3992 Test invalid fillchar passed to pad function
3987
3993
3988 $ hg log -r 0 -T '{pad(rev, 10, "")}\n'
3994 $ hg log -r 0 -T '{pad(rev, 10, "")}\n'
3989 hg: parse error: pad() expects a single fill character
3995 hg: parse error: pad() expects a single fill character
3990 [255]
3996 [255]
3991 $ hg log -r 0 -T '{pad(rev, 10, "--")}\n'
3997 $ hg log -r 0 -T '{pad(rev, 10, "--")}\n'
3992 hg: parse error: pad() expects a single fill character
3998 hg: parse error: pad() expects a single fill character
3993 [255]
3999 [255]
3994
4000
3995 Test boolean argument passed to pad function
4001 Test boolean argument passed to pad function
3996
4002
3997 no crash
4003 no crash
3998
4004
3999 $ hg log -r 0 -T '{pad(rev, 10, "-", "f{"oo"}")}\n'
4005 $ hg log -r 0 -T '{pad(rev, 10, "-", "f{"oo"}")}\n'
4000 ---------0
4006 ---------0
4001
4007
4002 string/literal
4008 string/literal
4003
4009
4004 $ hg log -r 0 -T '{pad(rev, 10, "-", "false")}\n'
4010 $ hg log -r 0 -T '{pad(rev, 10, "-", "false")}\n'
4005 ---------0
4011 ---------0
4006 $ hg log -r 0 -T '{pad(rev, 10, "-", false)}\n'
4012 $ hg log -r 0 -T '{pad(rev, 10, "-", false)}\n'
4007 0---------
4013 0---------
4008 $ hg log -r 0 -T '{pad(rev, 10, "-", "")}\n'
4014 $ hg log -r 0 -T '{pad(rev, 10, "-", "")}\n'
4009 0---------
4015 0---------
4010
4016
4011 unknown keyword is evaluated to ''
4017 unknown keyword is evaluated to ''
4012
4018
4013 $ hg log -r 0 -T '{pad(rev, 10, "-", unknownkeyword)}\n'
4019 $ hg log -r 0 -T '{pad(rev, 10, "-", unknownkeyword)}\n'
4014 0---------
4020 0---------
4015
4021
4016 Test separate function
4022 Test separate function
4017
4023
4018 $ hg log -r 0 -T '{separate("-", "", "a", "b", "", "", "c", "")}\n'
4024 $ hg log -r 0 -T '{separate("-", "", "a", "b", "", "", "c", "")}\n'
4019 a-b-c
4025 a-b-c
4020 $ hg log -r 0 -T '{separate(" ", "{rev}:{node|short}", author|user, branch)}\n'
4026 $ hg log -r 0 -T '{separate(" ", "{rev}:{node|short}", author|user, branch)}\n'
4021 0:f7769ec2ab97 test default
4027 0:f7769ec2ab97 test default
4022 $ hg log -r 0 --color=always -T '{separate(" ", "a", label(red, "b"), "c", label(red, ""), "d")}\n'
4028 $ hg log -r 0 --color=always -T '{separate(" ", "a", label(red, "b"), "c", label(red, ""), "d")}\n'
4023 a \x1b[0;31mb\x1b[0m c d (esc)
4029 a \x1b[0;31mb\x1b[0m c d (esc)
4024
4030
4025 Test boolean expression/literal passed to if function
4031 Test boolean expression/literal passed to if function
4026
4032
4027 $ hg log -r 0 -T '{if(rev, "rev 0 is True")}\n'
4033 $ hg log -r 0 -T '{if(rev, "rev 0 is True")}\n'
4028 rev 0 is True
4034 rev 0 is True
4029 $ hg log -r 0 -T '{if(0, "literal 0 is True as well")}\n'
4035 $ hg log -r 0 -T '{if(0, "literal 0 is True as well")}\n'
4030 literal 0 is True as well
4036 literal 0 is True as well
4031 $ hg log -r 0 -T '{if("", "", "empty string is False")}\n'
4037 $ hg log -r 0 -T '{if("", "", "empty string is False")}\n'
4032 empty string is False
4038 empty string is False
4033 $ hg log -r 0 -T '{if(revset(r"0 - 0"), "", "empty list is False")}\n'
4039 $ hg log -r 0 -T '{if(revset(r"0 - 0"), "", "empty list is False")}\n'
4034 empty list is False
4040 empty list is False
4035 $ hg log -r 0 -T '{if(true, "true is True")}\n'
4041 $ hg log -r 0 -T '{if(true, "true is True")}\n'
4036 true is True
4042 true is True
4037 $ hg log -r 0 -T '{if(false, "", "false is False")}\n'
4043 $ hg log -r 0 -T '{if(false, "", "false is False")}\n'
4038 false is False
4044 false is False
4039 $ hg log -r 0 -T '{if("false", "non-empty string is True")}\n'
4045 $ hg log -r 0 -T '{if("false", "non-empty string is True")}\n'
4040 non-empty string is True
4046 non-empty string is True
4041
4047
4042 Test ifcontains function
4048 Test ifcontains function
4043
4049
4044 $ hg log --template '{rev} {ifcontains(rev, "2 two 0", "is in the string", "is not")}\n'
4050 $ hg log --template '{rev} {ifcontains(rev, "2 two 0", "is in the string", "is not")}\n'
4045 2 is in the string
4051 2 is in the string
4046 1 is not
4052 1 is not
4047 0 is in the string
4053 0 is in the string
4048
4054
4049 $ hg log -T '{rev} {ifcontains(rev, "2 two{" 0"}", "is in the string", "is not")}\n'
4055 $ hg log -T '{rev} {ifcontains(rev, "2 two{" 0"}", "is in the string", "is not")}\n'
4050 2 is in the string
4056 2 is in the string
4051 1 is not
4057 1 is not
4052 0 is in the string
4058 0 is in the string
4053
4059
4054 $ hg log --template '{rev} {ifcontains("a", file_adds, "added a", "did not add a")}\n'
4060 $ hg log --template '{rev} {ifcontains("a", file_adds, "added a", "did not add a")}\n'
4055 2 did not add a
4061 2 did not add a
4056 1 did not add a
4062 1 did not add a
4057 0 added a
4063 0 added a
4058
4064
4059 $ hg log --debug -T '{rev}{ifcontains(1, parents, " is parent of 1")}\n'
4065 $ hg log --debug -T '{rev}{ifcontains(1, parents, " is parent of 1")}\n'
4060 2 is parent of 1
4066 2 is parent of 1
4061 1
4067 1
4062 0
4068 0
4063
4069
4064 Test revset function
4070 Test revset function
4065
4071
4066 $ hg log --template '{rev} {ifcontains(rev, revset("."), "current rev", "not current rev")}\n'
4072 $ hg log --template '{rev} {ifcontains(rev, revset("."), "current rev", "not current rev")}\n'
4067 2 current rev
4073 2 current rev
4068 1 not current rev
4074 1 not current rev
4069 0 not current rev
4075 0 not current rev
4070
4076
4071 $ hg log --template '{rev} {ifcontains(rev, revset(". + .^"), "match rev", "not match rev")}\n'
4077 $ hg log --template '{rev} {ifcontains(rev, revset(". + .^"), "match rev", "not match rev")}\n'
4072 2 match rev
4078 2 match rev
4073 1 match rev
4079 1 match rev
4074 0 not match rev
4080 0 not match rev
4075
4081
4076 $ hg log -T '{ifcontains(desc, revset(":"), "", "type not match")}\n' -l1
4082 $ hg log -T '{ifcontains(desc, revset(":"), "", "type not match")}\n' -l1
4077 type not match
4083 type not match
4078
4084
4079 $ hg log --template '{rev} Parents: {revset("parents(%s)", rev)}\n'
4085 $ hg log --template '{rev} Parents: {revset("parents(%s)", rev)}\n'
4080 2 Parents: 1
4086 2 Parents: 1
4081 1 Parents: 0
4087 1 Parents: 0
4082 0 Parents:
4088 0 Parents:
4083
4089
4084 $ cat >> .hg/hgrc <<EOF
4090 $ cat >> .hg/hgrc <<EOF
4085 > [revsetalias]
4091 > [revsetalias]
4086 > myparents(\$1) = parents(\$1)
4092 > myparents(\$1) = parents(\$1)
4087 > EOF
4093 > EOF
4088 $ hg log --template '{rev} Parents: {revset("myparents(%s)", rev)}\n'
4094 $ hg log --template '{rev} Parents: {revset("myparents(%s)", rev)}\n'
4089 2 Parents: 1
4095 2 Parents: 1
4090 1 Parents: 0
4096 1 Parents: 0
4091 0 Parents:
4097 0 Parents:
4092
4098
4093 $ hg log --template 'Rev: {rev}\n{revset("::%s", rev) % "Ancestor: {revision}\n"}\n'
4099 $ hg log --template 'Rev: {rev}\n{revset("::%s", rev) % "Ancestor: {revision}\n"}\n'
4094 Rev: 2
4100 Rev: 2
4095 Ancestor: 0
4101 Ancestor: 0
4096 Ancestor: 1
4102 Ancestor: 1
4097 Ancestor: 2
4103 Ancestor: 2
4098
4104
4099 Rev: 1
4105 Rev: 1
4100 Ancestor: 0
4106 Ancestor: 0
4101 Ancestor: 1
4107 Ancestor: 1
4102
4108
4103 Rev: 0
4109 Rev: 0
4104 Ancestor: 0
4110 Ancestor: 0
4105
4111
4106 $ hg log --template '{revset("TIP"|lower)}\n' -l1
4112 $ hg log --template '{revset("TIP"|lower)}\n' -l1
4107 2
4113 2
4108
4114
4109 $ hg log -T '{revset("%s", "t{"ip"}")}\n' -l1
4115 $ hg log -T '{revset("%s", "t{"ip"}")}\n' -l1
4110 2
4116 2
4111
4117
4112 a list template is evaluated for each item of revset/parents
4118 a list template is evaluated for each item of revset/parents
4113
4119
4114 $ hg log -T '{rev} p: {revset("p1(%s)", rev) % "{rev}:{node|short}"}\n'
4120 $ hg log -T '{rev} p: {revset("p1(%s)", rev) % "{rev}:{node|short}"}\n'
4115 2 p: 1:bcc7ff960b8e
4121 2 p: 1:bcc7ff960b8e
4116 1 p: 0:f7769ec2ab97
4122 1 p: 0:f7769ec2ab97
4117 0 p:
4123 0 p:
4118
4124
4119 $ hg log --debug -T '{rev} p:{parents % " {rev}:{node|short}"}\n'
4125 $ hg log --debug -T '{rev} p:{parents % " {rev}:{node|short}"}\n'
4120 2 p: 1:bcc7ff960b8e -1:000000000000
4126 2 p: 1:bcc7ff960b8e -1:000000000000
4121 1 p: 0:f7769ec2ab97 -1:000000000000
4127 1 p: 0:f7769ec2ab97 -1:000000000000
4122 0 p: -1:000000000000 -1:000000000000
4128 0 p: -1:000000000000 -1:000000000000
4123
4129
4124 therefore, 'revcache' should be recreated for each rev
4130 therefore, 'revcache' should be recreated for each rev
4125
4131
4126 $ hg log -T '{rev} {file_adds}\np {revset("p1(%s)", rev) % "{file_adds}"}\n'
4132 $ hg log -T '{rev} {file_adds}\np {revset("p1(%s)", rev) % "{file_adds}"}\n'
4127 2 aa b
4133 2 aa b
4128 p
4134 p
4129 1
4135 1
4130 p a
4136 p a
4131 0 a
4137 0 a
4132 p
4138 p
4133
4139
4134 $ hg log --debug -T '{rev} {file_adds}\np {parents % "{file_adds}"}\n'
4140 $ hg log --debug -T '{rev} {file_adds}\np {parents % "{file_adds}"}\n'
4135 2 aa b
4141 2 aa b
4136 p
4142 p
4137 1
4143 1
4138 p a
4144 p a
4139 0 a
4145 0 a
4140 p
4146 p
4141
4147
4142 a revset item must be evaluated as an integer revision, not an offset from tip
4148 a revset item must be evaluated as an integer revision, not an offset from tip
4143
4149
4144 $ hg log -l 1 -T '{revset("null") % "{rev}:{node|short}"}\n'
4150 $ hg log -l 1 -T '{revset("null") % "{rev}:{node|short}"}\n'
4145 -1:000000000000
4151 -1:000000000000
4146 $ hg log -l 1 -T '{revset("%s", "null") % "{rev}:{node|short}"}\n'
4152 $ hg log -l 1 -T '{revset("%s", "null") % "{rev}:{node|short}"}\n'
4147 -1:000000000000
4153 -1:000000000000
4148
4154
4149 join() should pick '{rev}' from revset items:
4155 join() should pick '{rev}' from revset items:
4150
4156
4151 $ hg log -R ../a -T '{join(revset("parents(%d)", rev), ", ")}\n' -r6
4157 $ hg log -R ../a -T '{join(revset("parents(%d)", rev), ", ")}\n' -r6
4152 4, 5
4158 4, 5
4153
4159
4154 on the other hand, parents are formatted as '{rev}:{node|formatnode}' by
4160 on the other hand, parents are formatted as '{rev}:{node|formatnode}' by
4155 default. join() should agree with the default formatting:
4161 default. join() should agree with the default formatting:
4156
4162
4157 $ hg log -R ../a -T '{join(parents, ", ")}\n' -r6
4163 $ hg log -R ../a -T '{join(parents, ", ")}\n' -r6
4158 5:13207e5a10d9, 4:bbe44766e73d
4164 5:13207e5a10d9, 4:bbe44766e73d
4159
4165
4160 $ hg log -R ../a -T '{join(parents, ",\n")}\n' -r6 --debug
4166 $ hg log -R ../a -T '{join(parents, ",\n")}\n' -r6 --debug
4161 5:13207e5a10d9fd28ec424934298e176197f2c67f,
4167 5:13207e5a10d9fd28ec424934298e176197f2c67f,
4162 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
4168 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
4163
4169
4164 Invalid arguments passed to revset()
4170 Invalid arguments passed to revset()
4165
4171
4166 $ hg log -T '{revset("%whatever", 0)}\n'
4172 $ hg log -T '{revset("%whatever", 0)}\n'
4167 hg: parse error: unexpected revspec format character w
4173 hg: parse error: unexpected revspec format character w
4168 [255]
4174 [255]
4169 $ hg log -T '{revset("%lwhatever", files)}\n'
4175 $ hg log -T '{revset("%lwhatever", files)}\n'
4170 hg: parse error: unexpected revspec format character w
4176 hg: parse error: unexpected revspec format character w
4171 [255]
4177 [255]
4172 $ hg log -T '{revset("%s %s", 0)}\n'
4178 $ hg log -T '{revset("%s %s", 0)}\n'
4173 hg: parse error: missing argument for revspec
4179 hg: parse error: missing argument for revspec
4174 [255]
4180 [255]
4175 $ hg log -T '{revset("", 0)}\n'
4181 $ hg log -T '{revset("", 0)}\n'
4176 hg: parse error: too many revspec arguments specified
4182 hg: parse error: too many revspec arguments specified
4177 [255]
4183 [255]
4178 $ hg log -T '{revset("%s", 0, 1)}\n'
4184 $ hg log -T '{revset("%s", 0, 1)}\n'
4179 hg: parse error: too many revspec arguments specified
4185 hg: parse error: too many revspec arguments specified
4180 [255]
4186 [255]
4181 $ hg log -T '{revset("%", 0)}\n'
4187 $ hg log -T '{revset("%", 0)}\n'
4182 hg: parse error: incomplete revspec format character
4188 hg: parse error: incomplete revspec format character
4183 [255]
4189 [255]
4184 $ hg log -T '{revset("%l", 0)}\n'
4190 $ hg log -T '{revset("%l", 0)}\n'
4185 hg: parse error: incomplete revspec format character
4191 hg: parse error: incomplete revspec format character
4186 [255]
4192 [255]
4187 $ hg log -T '{revset("%d", 'foo')}\n'
4193 $ hg log -T '{revset("%d", 'foo')}\n'
4188 hg: parse error: invalid argument for revspec
4194 hg: parse error: invalid argument for revspec
4189 [255]
4195 [255]
4190 $ hg log -T '{revset("%ld", files)}\n'
4196 $ hg log -T '{revset("%ld", files)}\n'
4191 hg: parse error: invalid argument for revspec
4197 hg: parse error: invalid argument for revspec
4192 [255]
4198 [255]
4193 $ hg log -T '{revset("%ls", 0)}\n'
4199 $ hg log -T '{revset("%ls", 0)}\n'
4194 hg: parse error: invalid argument for revspec
4200 hg: parse error: invalid argument for revspec
4195 [255]
4201 [255]
4196 $ hg log -T '{revset("%b", 'foo')}\n'
4202 $ hg log -T '{revset("%b", 'foo')}\n'
4197 hg: parse error: invalid argument for revspec
4203 hg: parse error: invalid argument for revspec
4198 [255]
4204 [255]
4199 $ hg log -T '{revset("%lb", files)}\n'
4205 $ hg log -T '{revset("%lb", files)}\n'
4200 hg: parse error: invalid argument for revspec
4206 hg: parse error: invalid argument for revspec
4201 [255]
4207 [255]
4202 $ hg log -T '{revset("%r", 0)}\n'
4208 $ hg log -T '{revset("%r", 0)}\n'
4203 hg: parse error: invalid argument for revspec
4209 hg: parse error: invalid argument for revspec
4204 [255]
4210 [255]
4205
4211
4206 Test 'originalnode'
4212 Test 'originalnode'
4207
4213
4208 $ hg log -r 1 -T '{revset("null") % "{node|short} {originalnode|short}"}\n'
4214 $ hg log -r 1 -T '{revset("null") % "{node|short} {originalnode|short}"}\n'
4209 000000000000 bcc7ff960b8e
4215 000000000000 bcc7ff960b8e
4210 $ hg log -r 0 -T '{manifest % "{node} {originalnode}"}\n'
4216 $ hg log -r 0 -T '{manifest % "{node} {originalnode}"}\n'
4211 a0c8bcbbb45c63b90b70ad007bf38961f64f2af0 f7769ec2ab975ad19684098ad1ffd9b81ecc71a1
4217 a0c8bcbbb45c63b90b70ad007bf38961f64f2af0 f7769ec2ab975ad19684098ad1ffd9b81ecc71a1
4212
4218
4213 Test files function
4219 Test files function
4214
4220
4215 $ hg log -T "{rev}\n{join(files('*'), '\n')}\n"
4221 $ hg log -T "{rev}\n{join(files('*'), '\n')}\n"
4216 2
4222 2
4217 a
4223 a
4218 aa
4224 aa
4219 b
4225 b
4220 1
4226 1
4221 a
4227 a
4222 0
4228 0
4223 a
4229 a
4224
4230
4225 $ hg log -T "{rev}\n{join(files('aa'), '\n')}\n"
4231 $ hg log -T "{rev}\n{join(files('aa'), '\n')}\n"
4226 2
4232 2
4227 aa
4233 aa
4228 1
4234 1
4229
4235
4230 0
4236 0
4231
4237
4232
4238
4233 Test relpath function
4239 Test relpath function
4234
4240
4235 $ hg log -r0 -T '{files % "{file|relpath}\n"}'
4241 $ hg log -r0 -T '{files % "{file|relpath}\n"}'
4236 a
4242 a
4237 $ cd ..
4243 $ cd ..
4238 $ hg log -R r -r0 -T '{files % "{file|relpath}\n"}'
4244 $ hg log -R r -r0 -T '{files % "{file|relpath}\n"}'
4239 r/a
4245 r/a
4240 $ cd r
4246 $ cd r
4241
4247
4242 Test active bookmark templating
4248 Test active bookmark templating
4243
4249
4244 $ hg book foo
4250 $ hg book foo
4245 $ hg book bar
4251 $ hg book bar
4246 $ hg log --template "{rev} {bookmarks % '{bookmark}{ifeq(bookmark, active, \"*\")} '}\n"
4252 $ hg log --template "{rev} {bookmarks % '{bookmark}{ifeq(bookmark, active, \"*\")} '}\n"
4247 2 bar* foo
4253 2 bar* foo
4248 1
4254 1
4249 0
4255 0
4250 $ hg log --template "{rev} {activebookmark}\n"
4256 $ hg log --template "{rev} {activebookmark}\n"
4251 2 bar
4257 2 bar
4252 1
4258 1
4253 0
4259 0
4254 $ hg bookmarks --inactive bar
4260 $ hg bookmarks --inactive bar
4255 $ hg log --template "{rev} {activebookmark}\n"
4261 $ hg log --template "{rev} {activebookmark}\n"
4256 2
4262 2
4257 1
4263 1
4258 0
4264 0
4259 $ hg book -r1 baz
4265 $ hg book -r1 baz
4260 $ hg log --template "{rev} {join(bookmarks, ' ')}\n"
4266 $ hg log --template "{rev} {join(bookmarks, ' ')}\n"
4261 2 bar foo
4267 2 bar foo
4262 1 baz
4268 1 baz
4263 0
4269 0
4264 $ hg log --template "{rev} {ifcontains('foo', bookmarks, 't', 'f')}\n"
4270 $ hg log --template "{rev} {ifcontains('foo', bookmarks, 't', 'f')}\n"
4265 2 t
4271 2 t
4266 1 f
4272 1 f
4267 0 f
4273 0 f
4268
4274
4269 Test namespaces dict
4275 Test namespaces dict
4270
4276
4271 $ hg --config extensions.revnamesext=$TESTDIR/revnamesext.py log -T '{rev}\n{namespaces % " {namespace} color={colorname} builtin={builtin}\n {join(names, ",")}\n"}\n'
4277 $ hg --config extensions.revnamesext=$TESTDIR/revnamesext.py log -T '{rev}\n{namespaces % " {namespace} color={colorname} builtin={builtin}\n {join(names, ",")}\n"}\n'
4272 2
4278 2
4273 bookmarks color=bookmark builtin=True
4279 bookmarks color=bookmark builtin=True
4274 bar,foo
4280 bar,foo
4275 tags color=tag builtin=True
4281 tags color=tag builtin=True
4276 tip
4282 tip
4277 branches color=branch builtin=True
4283 branches color=branch builtin=True
4278 text.{rev}
4284 text.{rev}
4279 revnames color=revname builtin=False
4285 revnames color=revname builtin=False
4280 r2
4286 r2
4281
4287
4282 1
4288 1
4283 bookmarks color=bookmark builtin=True
4289 bookmarks color=bookmark builtin=True
4284 baz
4290 baz
4285 tags color=tag builtin=True
4291 tags color=tag builtin=True
4286
4292
4287 branches color=branch builtin=True
4293 branches color=branch builtin=True
4288 text.{rev}
4294 text.{rev}
4289 revnames color=revname builtin=False
4295 revnames color=revname builtin=False
4290 r1
4296 r1
4291
4297
4292 0
4298 0
4293 bookmarks color=bookmark builtin=True
4299 bookmarks color=bookmark builtin=True
4294
4300
4295 tags color=tag builtin=True
4301 tags color=tag builtin=True
4296
4302
4297 branches color=branch builtin=True
4303 branches color=branch builtin=True
4298 default
4304 default
4299 revnames color=revname builtin=False
4305 revnames color=revname builtin=False
4300 r0
4306 r0
4301
4307
4302 $ hg log -r2 -T '{namespaces % "{namespace}: {names}\n"}'
4308 $ hg log -r2 -T '{namespaces % "{namespace}: {names}\n"}'
4303 bookmarks: bar foo
4309 bookmarks: bar foo
4304 tags: tip
4310 tags: tip
4305 branches: text.{rev}
4311 branches: text.{rev}
4306 $ hg log -r2 -T '{namespaces % "{namespace}:\n{names % " {name}\n"}"}'
4312 $ hg log -r2 -T '{namespaces % "{namespace}:\n{names % " {name}\n"}"}'
4307 bookmarks:
4313 bookmarks:
4308 bar
4314 bar
4309 foo
4315 foo
4310 tags:
4316 tags:
4311 tip
4317 tip
4312 branches:
4318 branches:
4313 text.{rev}
4319 text.{rev}
4314 $ hg log -r2 -T '{get(namespaces, "bookmarks") % "{name}\n"}'
4320 $ hg log -r2 -T '{get(namespaces, "bookmarks") % "{name}\n"}'
4315 bar
4321 bar
4316 foo
4322 foo
4317 $ hg log -r2 -T '{namespaces.bookmarks % "{bookmark}\n"}'
4323 $ hg log -r2 -T '{namespaces.bookmarks % "{bookmark}\n"}'
4318 bar
4324 bar
4319 foo
4325 foo
4320
4326
4321 Test stringify on sub expressions
4327 Test stringify on sub expressions
4322
4328
4323 $ cd ..
4329 $ cd ..
4324 $ hg log -R a -r 8 --template '{join(files, if("1", if("1", ", ")))}\n'
4330 $ hg log -R a -r 8 --template '{join(files, if("1", if("1", ", ")))}\n'
4325 fourth, second, third
4331 fourth, second, third
4326 $ hg log -R a -r 8 --template '{strip(if("1", if("1", "-abc-")), if("1", if("1", "-")))}\n'
4332 $ hg log -R a -r 8 --template '{strip(if("1", if("1", "-abc-")), if("1", if("1", "-")))}\n'
4327 abc
4333 abc
4328
4334
4329 Test splitlines
4335 Test splitlines
4330
4336
4331 $ hg log -Gv -R a --template "{splitlines(desc) % 'foo {line}\n'}"
4337 $ hg log -Gv -R a --template "{splitlines(desc) % 'foo {line}\n'}"
4332 @ foo Modify, add, remove, rename
4338 @ foo Modify, add, remove, rename
4333 |
4339 |
4334 o foo future
4340 o foo future
4335 |
4341 |
4336 o foo third
4342 o foo third
4337 |
4343 |
4338 o foo second
4344 o foo second
4339
4345
4340 o foo merge
4346 o foo merge
4341 |\
4347 |\
4342 | o foo new head
4348 | o foo new head
4343 | |
4349 | |
4344 o | foo new branch
4350 o | foo new branch
4345 |/
4351 |/
4346 o foo no user, no domain
4352 o foo no user, no domain
4347 |
4353 |
4348 o foo no person
4354 o foo no person
4349 |
4355 |
4350 o foo other 1
4356 o foo other 1
4351 | foo other 2
4357 | foo other 2
4352 | foo
4358 | foo
4353 | foo other 3
4359 | foo other 3
4354 o foo line 1
4360 o foo line 1
4355 foo line 2
4361 foo line 2
4356
4362
4357 $ hg log -R a -r0 -T '{desc|splitlines}\n'
4363 $ hg log -R a -r0 -T '{desc|splitlines}\n'
4358 line 1 line 2
4364 line 1 line 2
4359 $ hg log -R a -r0 -T '{join(desc|splitlines, "|")}\n'
4365 $ hg log -R a -r0 -T '{join(desc|splitlines, "|")}\n'
4360 line 1|line 2
4366 line 1|line 2
4361
4367
4362 Test startswith
4368 Test startswith
4363 $ hg log -Gv -R a --template "{startswith(desc)}"
4369 $ hg log -Gv -R a --template "{startswith(desc)}"
4364 hg: parse error: startswith expects two arguments
4370 hg: parse error: startswith expects two arguments
4365 [255]
4371 [255]
4366
4372
4367 $ hg log -Gv -R a --template "{startswith('line', desc)}"
4373 $ hg log -Gv -R a --template "{startswith('line', desc)}"
4368 @
4374 @
4369 |
4375 |
4370 o
4376 o
4371 |
4377 |
4372 o
4378 o
4373 |
4379 |
4374 o
4380 o
4375
4381
4376 o
4382 o
4377 |\
4383 |\
4378 | o
4384 | o
4379 | |
4385 | |
4380 o |
4386 o |
4381 |/
4387 |/
4382 o
4388 o
4383 |
4389 |
4384 o
4390 o
4385 |
4391 |
4386 o
4392 o
4387 |
4393 |
4388 o line 1
4394 o line 1
4389 line 2
4395 line 2
4390
4396
4391 Test bad template with better error message
4397 Test bad template with better error message
4392
4398
4393 $ hg log -Gv -R a --template '{desc|user()}'
4399 $ hg log -Gv -R a --template '{desc|user()}'
4394 hg: parse error: expected a symbol, got 'func'
4400 hg: parse error: expected a symbol, got 'func'
4395 [255]
4401 [255]
4396
4402
4397 Test word function (including index out of bounds graceful failure)
4403 Test word function (including index out of bounds graceful failure)
4398
4404
4399 $ hg log -Gv -R a --template "{word('1', desc)}"
4405 $ hg log -Gv -R a --template "{word('1', desc)}"
4400 @ add,
4406 @ add,
4401 |
4407 |
4402 o
4408 o
4403 |
4409 |
4404 o
4410 o
4405 |
4411 |
4406 o
4412 o
4407
4413
4408 o
4414 o
4409 |\
4415 |\
4410 | o head
4416 | o head
4411 | |
4417 | |
4412 o | branch
4418 o | branch
4413 |/
4419 |/
4414 o user,
4420 o user,
4415 |
4421 |
4416 o person
4422 o person
4417 |
4423 |
4418 o 1
4424 o 1
4419 |
4425 |
4420 o 1
4426 o 1
4421
4427
4422
4428
4423 Test word third parameter used as splitter
4429 Test word third parameter used as splitter
4424
4430
4425 $ hg log -Gv -R a --template "{word('0', desc, 'o')}"
4431 $ hg log -Gv -R a --template "{word('0', desc, 'o')}"
4426 @ M
4432 @ M
4427 |
4433 |
4428 o future
4434 o future
4429 |
4435 |
4430 o third
4436 o third
4431 |
4437 |
4432 o sec
4438 o sec
4433
4439
4434 o merge
4440 o merge
4435 |\
4441 |\
4436 | o new head
4442 | o new head
4437 | |
4443 | |
4438 o | new branch
4444 o | new branch
4439 |/
4445 |/
4440 o n
4446 o n
4441 |
4447 |
4442 o n
4448 o n
4443 |
4449 |
4444 o
4450 o
4445 |
4451 |
4446 o line 1
4452 o line 1
4447 line 2
4453 line 2
4448
4454
4449 Test word error messages for not enough and too many arguments
4455 Test word error messages for not enough and too many arguments
4450
4456
4451 $ hg log -Gv -R a --template "{word('0')}"
4457 $ hg log -Gv -R a --template "{word('0')}"
4452 hg: parse error: word expects two or three arguments, got 1
4458 hg: parse error: word expects two or three arguments, got 1
4453 [255]
4459 [255]
4454
4460
4455 $ hg log -Gv -R a --template "{word('0', desc, 'o', 'h', 'b', 'o', 'y')}"
4461 $ hg log -Gv -R a --template "{word('0', desc, 'o', 'h', 'b', 'o', 'y')}"
4456 hg: parse error: word expects two or three arguments, got 7
4462 hg: parse error: word expects two or three arguments, got 7
4457 [255]
4463 [255]
4458
4464
4459 Test word for integer literal
4465 Test word for integer literal
4460
4466
4461 $ hg log -R a --template "{word(2, desc)}\n" -r0
4467 $ hg log -R a --template "{word(2, desc)}\n" -r0
4462 line
4468 line
4463
4469
4464 Test word for invalid numbers
4470 Test word for invalid numbers
4465
4471
4466 $ hg log -Gv -R a --template "{word('a', desc)}"
4472 $ hg log -Gv -R a --template "{word('a', desc)}"
4467 hg: parse error: word expects an integer index
4473 hg: parse error: word expects an integer index
4468 [255]
4474 [255]
4469
4475
4470 Test word for out of range
4476 Test word for out of range
4471
4477
4472 $ hg log -R a --template "{word(10000, desc)}"
4478 $ hg log -R a --template "{word(10000, desc)}"
4473 $ hg log -R a --template "{word(-10000, desc)}"
4479 $ hg log -R a --template "{word(-10000, desc)}"
4474
4480
4475 Test indent and not adding to empty lines
4481 Test indent and not adding to empty lines
4476
4482
4477 $ hg log -T "-----\n{indent(desc, '>> ', ' > ')}\n" -r 0:1 -R a
4483 $ hg log -T "-----\n{indent(desc, '>> ', ' > ')}\n" -r 0:1 -R a
4478 -----
4484 -----
4479 > line 1
4485 > line 1
4480 >> line 2
4486 >> line 2
4481 -----
4487 -----
4482 > other 1
4488 > other 1
4483 >> other 2
4489 >> other 2
4484
4490
4485 >> other 3
4491 >> other 3
4486
4492
4487 Test with non-strings like dates
4493 Test with non-strings like dates
4488
4494
4489 $ hg log -T "{indent(date, ' ')}\n" -r 2:3 -R a
4495 $ hg log -T "{indent(date, ' ')}\n" -r 2:3 -R a
4490 1200000.00
4496 1200000.00
4491 1300000.00
4497 1300000.00
4492
4498
4493 Test broken string escapes:
4499 Test broken string escapes:
4494
4500
4495 $ hg log -T "bogus\\" -R a
4501 $ hg log -T "bogus\\" -R a
4496 hg: parse error: trailing \ in string
4502 hg: parse error: trailing \ in string
4497 [255]
4503 [255]
4498 $ hg log -T "\\xy" -R a
4504 $ hg log -T "\\xy" -R a
4499 hg: parse error: invalid \x escape* (glob)
4505 hg: parse error: invalid \x escape* (glob)
4500 [255]
4506 [255]
4501
4507
4502 json filter should escape HTML tags so that the output can be embedded in hgweb:
4508 json filter should escape HTML tags so that the output can be embedded in hgweb:
4503
4509
4504 $ hg log -T "{'<foo@example.org>'|json}\n" -R a -l1
4510 $ hg log -T "{'<foo@example.org>'|json}\n" -R a -l1
4505 "\u003cfoo@example.org\u003e"
4511 "\u003cfoo@example.org\u003e"
4506
4512
4507 Templater supports aliases of symbol and func() styles:
4513 Templater supports aliases of symbol and func() styles:
4508
4514
4509 $ hg clone -q a aliases
4515 $ hg clone -q a aliases
4510 $ cd aliases
4516 $ cd aliases
4511 $ cat <<EOF >> .hg/hgrc
4517 $ cat <<EOF >> .hg/hgrc
4512 > [templatealias]
4518 > [templatealias]
4513 > r = rev
4519 > r = rev
4514 > rn = "{r}:{node|short}"
4520 > rn = "{r}:{node|short}"
4515 > status(c, files) = files % "{c} {file}\n"
4521 > status(c, files) = files % "{c} {file}\n"
4516 > utcdate(d) = localdate(d, "UTC")
4522 > utcdate(d) = localdate(d, "UTC")
4517 > EOF
4523 > EOF
4518
4524
4519 $ hg debugtemplate -vr0 '{rn} {utcdate(date)|isodate}\n'
4525 $ hg debugtemplate -vr0 '{rn} {utcdate(date)|isodate}\n'
4520 (template
4526 (template
4521 (symbol 'rn')
4527 (symbol 'rn')
4522 (string ' ')
4528 (string ' ')
4523 (|
4529 (|
4524 (func
4530 (func
4525 (symbol 'utcdate')
4531 (symbol 'utcdate')
4526 (symbol 'date'))
4532 (symbol 'date'))
4527 (symbol 'isodate'))
4533 (symbol 'isodate'))
4528 (string '\n'))
4534 (string '\n'))
4529 * expanded:
4535 * expanded:
4530 (template
4536 (template
4531 (template
4537 (template
4532 (symbol 'rev')
4538 (symbol 'rev')
4533 (string ':')
4539 (string ':')
4534 (|
4540 (|
4535 (symbol 'node')
4541 (symbol 'node')
4536 (symbol 'short')))
4542 (symbol 'short')))
4537 (string ' ')
4543 (string ' ')
4538 (|
4544 (|
4539 (func
4545 (func
4540 (symbol 'localdate')
4546 (symbol 'localdate')
4541 (list
4547 (list
4542 (symbol 'date')
4548 (symbol 'date')
4543 (string 'UTC')))
4549 (string 'UTC')))
4544 (symbol 'isodate'))
4550 (symbol 'isodate'))
4545 (string '\n'))
4551 (string '\n'))
4546 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4552 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4547
4553
4548 $ hg debugtemplate -vr0 '{status("A", file_adds)}'
4554 $ hg debugtemplate -vr0 '{status("A", file_adds)}'
4549 (template
4555 (template
4550 (func
4556 (func
4551 (symbol 'status')
4557 (symbol 'status')
4552 (list
4558 (list
4553 (string 'A')
4559 (string 'A')
4554 (symbol 'file_adds'))))
4560 (symbol 'file_adds'))))
4555 * expanded:
4561 * expanded:
4556 (template
4562 (template
4557 (%
4563 (%
4558 (symbol 'file_adds')
4564 (symbol 'file_adds')
4559 (template
4565 (template
4560 (string 'A')
4566 (string 'A')
4561 (string ' ')
4567 (string ' ')
4562 (symbol 'file')
4568 (symbol 'file')
4563 (string '\n'))))
4569 (string '\n'))))
4564 A a
4570 A a
4565
4571
4566 A unary function alias can be called as a filter:
4572 A unary function alias can be called as a filter:
4567
4573
4568 $ hg debugtemplate -vr0 '{date|utcdate|isodate}\n'
4574 $ hg debugtemplate -vr0 '{date|utcdate|isodate}\n'
4569 (template
4575 (template
4570 (|
4576 (|
4571 (|
4577 (|
4572 (symbol 'date')
4578 (symbol 'date')
4573 (symbol 'utcdate'))
4579 (symbol 'utcdate'))
4574 (symbol 'isodate'))
4580 (symbol 'isodate'))
4575 (string '\n'))
4581 (string '\n'))
4576 * expanded:
4582 * expanded:
4577 (template
4583 (template
4578 (|
4584 (|
4579 (func
4585 (func
4580 (symbol 'localdate')
4586 (symbol 'localdate')
4581 (list
4587 (list
4582 (symbol 'date')
4588 (symbol 'date')
4583 (string 'UTC')))
4589 (string 'UTC')))
4584 (symbol 'isodate'))
4590 (symbol 'isodate'))
4585 (string '\n'))
4591 (string '\n'))
4586 1970-01-12 13:46 +0000
4592 1970-01-12 13:46 +0000
4587
4593
4588 Aliases should be applied only to command arguments and templates in hgrc.
4594 Aliases should be applied only to command arguments and templates in hgrc.
4589 Otherwise, our stock styles and web templates could be corrupted:
4595 Otherwise, our stock styles and web templates could be corrupted:
4590
4596
4591 $ hg log -r0 -T '{rn} {utcdate(date)|isodate}\n'
4597 $ hg log -r0 -T '{rn} {utcdate(date)|isodate}\n'
4592 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4598 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4593
4599
4594 $ hg log -r0 --config ui.logtemplate='"{rn} {utcdate(date)|isodate}\n"'
4600 $ hg log -r0 --config ui.logtemplate='"{rn} {utcdate(date)|isodate}\n"'
4595 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4601 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4596
4602
4597 $ cat <<EOF > tmpl
4603 $ cat <<EOF > tmpl
4598 > changeset = 'nothing expanded:{rn}\n'
4604 > changeset = 'nothing expanded:{rn}\n'
4599 > EOF
4605 > EOF
4600 $ hg log -r0 --style ./tmpl
4606 $ hg log -r0 --style ./tmpl
4601 nothing expanded:
4607 nothing expanded:
4602
4608
4603 Aliases in formatter:
4609 Aliases in formatter:
4604
4610
4605 $ hg branches -T '{pad(branch, 7)} {rn}\n'
4611 $ hg branches -T '{pad(branch, 7)} {rn}\n'
4606 default 6:d41e714fe50d
4612 default 6:d41e714fe50d
4607 foo 4:bbe44766e73d
4613 foo 4:bbe44766e73d
4608
4614
4609 Aliases should honor HGPLAIN:
4615 Aliases should honor HGPLAIN:
4610
4616
4611 $ HGPLAIN= hg log -r0 -T 'nothing expanded:{rn}\n'
4617 $ HGPLAIN= hg log -r0 -T 'nothing expanded:{rn}\n'
4612 nothing expanded:
4618 nothing expanded:
4613 $ HGPLAINEXCEPT=templatealias hg log -r0 -T '{rn}\n'
4619 $ HGPLAINEXCEPT=templatealias hg log -r0 -T '{rn}\n'
4614 0:1e4e1b8f71e0
4620 0:1e4e1b8f71e0
4615
4621
4616 Unparsable alias:
4622 Unparsable alias:
4617
4623
4618 $ hg debugtemplate --config templatealias.bad='x(' -v '{bad}'
4624 $ hg debugtemplate --config templatealias.bad='x(' -v '{bad}'
4619 (template
4625 (template
4620 (symbol 'bad'))
4626 (symbol 'bad'))
4621 abort: bad definition of template alias "bad": at 2: not a prefix: end
4627 abort: bad definition of template alias "bad": at 2: not a prefix: end
4622 [255]
4628 [255]
4623 $ hg log --config templatealias.bad='x(' -T '{bad}'
4629 $ hg log --config templatealias.bad='x(' -T '{bad}'
4624 abort: bad definition of template alias "bad": at 2: not a prefix: end
4630 abort: bad definition of template alias "bad": at 2: not a prefix: end
4625 [255]
4631 [255]
4626
4632
4627 $ cd ..
4633 $ cd ..
4628
4634
4629 Set up repository for non-ascii encoding tests:
4635 Set up repository for non-ascii encoding tests:
4630
4636
4631 $ hg init nonascii
4637 $ hg init nonascii
4632 $ cd nonascii
4638 $ cd nonascii
4633 $ $PYTHON <<EOF
4639 $ $PYTHON <<EOF
4634 > open('latin1', 'wb').write(b'\xe9')
4640 > open('latin1', 'wb').write(b'\xe9')
4635 > open('utf-8', 'wb').write(b'\xc3\xa9')
4641 > open('utf-8', 'wb').write(b'\xc3\xa9')
4636 > EOF
4642 > EOF
4637 $ HGENCODING=utf-8 hg branch -q `cat utf-8`
4643 $ HGENCODING=utf-8 hg branch -q `cat utf-8`
4638 $ HGENCODING=utf-8 hg ci -qAm "non-ascii branch: `cat utf-8`" utf-8
4644 $ HGENCODING=utf-8 hg ci -qAm "non-ascii branch: `cat utf-8`" utf-8
4639
4645
4640 json filter should try round-trip conversion to utf-8:
4646 json filter should try round-trip conversion to utf-8:
4641
4647
4642 $ HGENCODING=ascii hg log -T "{branch|json}\n" -r0
4648 $ HGENCODING=ascii hg log -T "{branch|json}\n" -r0
4643 "\u00e9"
4649 "\u00e9"
4644 $ HGENCODING=ascii hg log -T "{desc|json}\n" -r0
4650 $ HGENCODING=ascii hg log -T "{desc|json}\n" -r0
4645 "non-ascii branch: \u00e9"
4651 "non-ascii branch: \u00e9"
4646
4652
4647 json filter takes input as utf-8b:
4653 json filter takes input as utf-8b:
4648
4654
4649 $ HGENCODING=ascii hg log -T "{'`cat utf-8`'|json}\n" -l1
4655 $ HGENCODING=ascii hg log -T "{'`cat utf-8`'|json}\n" -l1
4650 "\u00e9"
4656 "\u00e9"
4651 $ HGENCODING=ascii hg log -T "{'`cat latin1`'|json}\n" -l1
4657 $ HGENCODING=ascii hg log -T "{'`cat latin1`'|json}\n" -l1
4652 "\udce9"
4658 "\udce9"
4653
4659
4654 utf8 filter:
4660 utf8 filter:
4655
4661
4656 $ HGENCODING=ascii hg log -T "round-trip: {branch|utf8|hex}\n" -r0
4662 $ HGENCODING=ascii hg log -T "round-trip: {branch|utf8|hex}\n" -r0
4657 round-trip: c3a9
4663 round-trip: c3a9
4658 $ HGENCODING=latin1 hg log -T "decoded: {'`cat latin1`'|utf8|hex}\n" -l1
4664 $ HGENCODING=latin1 hg log -T "decoded: {'`cat latin1`'|utf8|hex}\n" -l1
4659 decoded: c3a9
4665 decoded: c3a9
4660 $ HGENCODING=ascii hg log -T "replaced: {'`cat latin1`'|utf8|hex}\n" -l1
4666 $ HGENCODING=ascii hg log -T "replaced: {'`cat latin1`'|utf8|hex}\n" -l1
4661 abort: decoding near * (glob)
4667 abort: decoding near * (glob)
4662 [255]
4668 [255]
4663 $ hg log -T "coerced to string: {rev|utf8}\n" -r0
4669 $ hg log -T "coerced to string: {rev|utf8}\n" -r0
4664 coerced to string: 0
4670 coerced to string: 0
4665
4671
4666 pad width:
4672 pad width:
4667
4673
4668 $ HGENCODING=utf-8 hg debugtemplate "{pad('`cat utf-8`', 2, '-')}\n"
4674 $ HGENCODING=utf-8 hg debugtemplate "{pad('`cat utf-8`', 2, '-')}\n"
4669 \xc3\xa9- (esc)
4675 \xc3\xa9- (esc)
4670
4676
4671 $ cd ..
4677 $ cd ..
4672
4678
4673 Test that template function in extension is registered as expected
4679 Test that template function in extension is registered as expected
4674
4680
4675 $ cd a
4681 $ cd a
4676
4682
4677 $ cat <<EOF > $TESTTMP/customfunc.py
4683 $ cat <<EOF > $TESTTMP/customfunc.py
4678 > from mercurial import registrar
4684 > from mercurial import registrar
4679 >
4685 >
4680 > templatefunc = registrar.templatefunc()
4686 > templatefunc = registrar.templatefunc()
4681 >
4687 >
4682 > @templatefunc(b'custom()')
4688 > @templatefunc(b'custom()')
4683 > def custom(context, mapping, args):
4689 > def custom(context, mapping, args):
4684 > return b'custom'
4690 > return b'custom'
4685 > EOF
4691 > EOF
4686 $ cat <<EOF > .hg/hgrc
4692 $ cat <<EOF > .hg/hgrc
4687 > [extensions]
4693 > [extensions]
4688 > customfunc = $TESTTMP/customfunc.py
4694 > customfunc = $TESTTMP/customfunc.py
4689 > EOF
4695 > EOF
4690
4696
4691 $ hg log -r . -T "{custom()}\n" --config customfunc.enabled=true
4697 $ hg log -r . -T "{custom()}\n" --config customfunc.enabled=true
4692 custom
4698 custom
4693
4699
4694 $ cd ..
4700 $ cd ..
4695
4701
4696 Test 'graphwidth' in 'hg log' on various topologies. The key here is that the
4702 Test 'graphwidth' in 'hg log' on various topologies. The key here is that the
4697 printed graphwidths 3, 5, 7, etc. should all line up in their respective
4703 printed graphwidths 3, 5, 7, etc. should all line up in their respective
4698 columns. We don't care about other aspects of the graph rendering here.
4704 columns. We don't care about other aspects of the graph rendering here.
4699
4705
4700 $ hg init graphwidth
4706 $ hg init graphwidth
4701 $ cd graphwidth
4707 $ cd graphwidth
4702
4708
4703 $ wrappabletext="a a a a a a a a a a a a"
4709 $ wrappabletext="a a a a a a a a a a a a"
4704
4710
4705 $ printf "first\n" > file
4711 $ printf "first\n" > file
4706 $ hg add file
4712 $ hg add file
4707 $ hg commit -m "$wrappabletext"
4713 $ hg commit -m "$wrappabletext"
4708
4714
4709 $ printf "first\nsecond\n" > file
4715 $ printf "first\nsecond\n" > file
4710 $ hg commit -m "$wrappabletext"
4716 $ hg commit -m "$wrappabletext"
4711
4717
4712 $ hg checkout 0
4718 $ hg checkout 0
4713 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4719 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4714 $ printf "third\nfirst\n" > file
4720 $ printf "third\nfirst\n" > file
4715 $ hg commit -m "$wrappabletext"
4721 $ hg commit -m "$wrappabletext"
4716 created new head
4722 created new head
4717
4723
4718 $ hg merge
4724 $ hg merge
4719 merging file
4725 merging file
4720 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
4726 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
4721 (branch merge, don't forget to commit)
4727 (branch merge, don't forget to commit)
4722
4728
4723 $ hg log --graph -T "{graphwidth}"
4729 $ hg log --graph -T "{graphwidth}"
4724 @ 3
4730 @ 3
4725 |
4731 |
4726 | @ 5
4732 | @ 5
4727 |/
4733 |/
4728 o 3
4734 o 3
4729
4735
4730 $ hg commit -m "$wrappabletext"
4736 $ hg commit -m "$wrappabletext"
4731
4737
4732 $ hg log --graph -T "{graphwidth}"
4738 $ hg log --graph -T "{graphwidth}"
4733 @ 5
4739 @ 5
4734 |\
4740 |\
4735 | o 5
4741 | o 5
4736 | |
4742 | |
4737 o | 5
4743 o | 5
4738 |/
4744 |/
4739 o 3
4745 o 3
4740
4746
4741
4747
4742 $ hg checkout 0
4748 $ hg checkout 0
4743 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4749 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4744 $ printf "third\nfirst\nsecond\n" > file
4750 $ printf "third\nfirst\nsecond\n" > file
4745 $ hg commit -m "$wrappabletext"
4751 $ hg commit -m "$wrappabletext"
4746 created new head
4752 created new head
4747
4753
4748 $ hg log --graph -T "{graphwidth}"
4754 $ hg log --graph -T "{graphwidth}"
4749 @ 3
4755 @ 3
4750 |
4756 |
4751 | o 7
4757 | o 7
4752 | |\
4758 | |\
4753 +---o 7
4759 +---o 7
4754 | |
4760 | |
4755 | o 5
4761 | o 5
4756 |/
4762 |/
4757 o 3
4763 o 3
4758
4764
4759
4765
4760 $ hg log --graph -T "{graphwidth}" -r 3
4766 $ hg log --graph -T "{graphwidth}" -r 3
4761 o 5
4767 o 5
4762 |\
4768 |\
4763 ~ ~
4769 ~ ~
4764
4770
4765 $ hg log --graph -T "{graphwidth}" -r 1
4771 $ hg log --graph -T "{graphwidth}" -r 1
4766 o 3
4772 o 3
4767 |
4773 |
4768 ~
4774 ~
4769
4775
4770 $ hg merge
4776 $ hg merge
4771 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4777 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4772 (branch merge, don't forget to commit)
4778 (branch merge, don't forget to commit)
4773 $ hg commit -m "$wrappabletext"
4779 $ hg commit -m "$wrappabletext"
4774
4780
4775 $ printf "seventh\n" >> file
4781 $ printf "seventh\n" >> file
4776 $ hg commit -m "$wrappabletext"
4782 $ hg commit -m "$wrappabletext"
4777
4783
4778 $ hg log --graph -T "{graphwidth}"
4784 $ hg log --graph -T "{graphwidth}"
4779 @ 3
4785 @ 3
4780 |
4786 |
4781 o 5
4787 o 5
4782 |\
4788 |\
4783 | o 5
4789 | o 5
4784 | |
4790 | |
4785 o | 7
4791 o | 7
4786 |\ \
4792 |\ \
4787 | o | 7
4793 | o | 7
4788 | |/
4794 | |/
4789 o / 5
4795 o / 5
4790 |/
4796 |/
4791 o 3
4797 o 3
4792
4798
4793
4799
4794 The point of graphwidth is to allow wrapping that accounts for the space taken
4800 The point of graphwidth is to allow wrapping that accounts for the space taken
4795 by the graph.
4801 by the graph.
4796
4802
4797 $ COLUMNS=10 hg log --graph -T "{fill(desc, termwidth - graphwidth)}"
4803 $ COLUMNS=10 hg log --graph -T "{fill(desc, termwidth - graphwidth)}"
4798 @ a a a a
4804 @ a a a a
4799 | a a a a
4805 | a a a a
4800 | a a a a
4806 | a a a a
4801 o a a a
4807 o a a a
4802 |\ a a a
4808 |\ a a a
4803 | | a a a
4809 | | a a a
4804 | | a a a
4810 | | a a a
4805 | o a a a
4811 | o a a a
4806 | | a a a
4812 | | a a a
4807 | | a a a
4813 | | a a a
4808 | | a a a
4814 | | a a a
4809 o | a a
4815 o | a a
4810 |\ \ a a
4816 |\ \ a a
4811 | | | a a
4817 | | | a a
4812 | | | a a
4818 | | | a a
4813 | | | a a
4819 | | | a a
4814 | | | a a
4820 | | | a a
4815 | o | a a
4821 | o | a a
4816 | |/ a a
4822 | |/ a a
4817 | | a a
4823 | | a a
4818 | | a a
4824 | | a a
4819 | | a a
4825 | | a a
4820 | | a a
4826 | | a a
4821 o | a a a
4827 o | a a a
4822 |/ a a a
4828 |/ a a a
4823 | a a a
4829 | a a a
4824 | a a a
4830 | a a a
4825 o a a a a
4831 o a a a a
4826 a a a a
4832 a a a a
4827 a a a a
4833 a a a a
4828
4834
4829 Something tricky happens when there are elided nodes; the next drawn row of
4835 Something tricky happens when there are elided nodes; the next drawn row of
4830 edges can be more than one column wider, but the graph width only increases by
4836 edges can be more than one column wider, but the graph width only increases by
4831 one column. The remaining columns are added in between the nodes.
4837 one column. The remaining columns are added in between the nodes.
4832
4838
4833 $ hg log --graph -T "{graphwidth}" -r "0|2|4|5"
4839 $ hg log --graph -T "{graphwidth}" -r "0|2|4|5"
4834 o 5
4840 o 5
4835 |\
4841 |\
4836 | \
4842 | \
4837 | :\
4843 | :\
4838 o : : 7
4844 o : : 7
4839 :/ /
4845 :/ /
4840 : o 5
4846 : o 5
4841 :/
4847 :/
4842 o 3
4848 o 3
4843
4849
4844
4850
4845 $ cd ..
4851 $ cd ..
4846
4852
General Comments 0
You need to be logged in to leave comments. Login now