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