##// END OF EJS Templates
templater: give slightly nicer error for unknown map entries
Matt Mackall -
r13175:09cde75e default
parent child Browse files
Show More
@@ -1,289 +1,291 b''
1 # templater.py - template expansion for output
1 # templater.py - template expansion for output
2 #
2 #
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005, 2006 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 i18n import _
8 from i18n import _
9 import sys, os
9 import sys, os
10 import util, config, templatefilters
10 import util, config, templatefilters
11
11
12 path = ['templates', '../templates']
12 path = ['templates', '../templates']
13 stringify = templatefilters.stringify
13 stringify = templatefilters.stringify
14
14
15 def _flatten(thing):
15 def _flatten(thing):
16 '''yield a single stream from a possibly nested set of iterators'''
16 '''yield a single stream from a possibly nested set of iterators'''
17 if isinstance(thing, str):
17 if isinstance(thing, str):
18 yield thing
18 yield thing
19 elif not hasattr(thing, '__iter__'):
19 elif not hasattr(thing, '__iter__'):
20 if thing is not None:
20 if thing is not None:
21 yield str(thing)
21 yield str(thing)
22 else:
22 else:
23 for i in thing:
23 for i in thing:
24 if isinstance(i, str):
24 if isinstance(i, str):
25 yield i
25 yield i
26 elif not hasattr(i, '__iter__'):
26 elif not hasattr(i, '__iter__'):
27 if i is not None:
27 if i is not None:
28 yield str(i)
28 yield str(i)
29 elif i is not None:
29 elif i is not None:
30 for j in _flatten(i):
30 for j in _flatten(i):
31 yield j
31 yield j
32
32
33 def parsestring(s, quoted=True):
33 def parsestring(s, quoted=True):
34 '''parse a string using simple c-like syntax.
34 '''parse a string using simple c-like syntax.
35 string must be in quotes if quoted is True.'''
35 string must be in quotes if quoted is True.'''
36 if quoted:
36 if quoted:
37 if len(s) < 2 or s[0] != s[-1]:
37 if len(s) < 2 or s[0] != s[-1]:
38 raise SyntaxError(_('unmatched quotes'))
38 raise SyntaxError(_('unmatched quotes'))
39 return s[1:-1].decode('string_escape')
39 return s[1:-1].decode('string_escape')
40
40
41 return s.decode('string_escape')
41 return s.decode('string_escape')
42
42
43 class engine(object):
43 class engine(object):
44 '''template expansion engine.
44 '''template expansion engine.
45
45
46 template expansion works like this. a map file contains key=value
46 template expansion works like this. a map file contains key=value
47 pairs. if value is quoted, it is treated as string. otherwise, it
47 pairs. if value is quoted, it is treated as string. otherwise, it
48 is treated as name of template file.
48 is treated as name of template file.
49
49
50 templater is asked to expand a key in map. it looks up key, and
50 templater is asked to expand a key in map. it looks up key, and
51 looks for strings like this: {foo}. it expands {foo} by looking up
51 looks for strings like this: {foo}. it expands {foo} by looking up
52 foo in map, and substituting it. expansion is recursive: it stops
52 foo in map, and substituting it. expansion is recursive: it stops
53 when there is no more {foo} to replace.
53 when there is no more {foo} to replace.
54
54
55 expansion also allows formatting and filtering.
55 expansion also allows formatting and filtering.
56
56
57 format uses key to expand each item in list. syntax is
57 format uses key to expand each item in list. syntax is
58 {key%format}.
58 {key%format}.
59
59
60 filter uses function to transform value. syntax is
60 filter uses function to transform value. syntax is
61 {key|filter1|filter2|...}.'''
61 {key|filter1|filter2|...}.'''
62
62
63 def __init__(self, loader, filters={}, defaults={}):
63 def __init__(self, loader, filters={}, defaults={}):
64 self._loader = loader
64 self._loader = loader
65 self._filters = filters
65 self._filters = filters
66 self._defaults = defaults
66 self._defaults = defaults
67 self._cache = {}
67 self._cache = {}
68
68
69 def process(self, t, mapping):
69 def process(self, t, mapping):
70 '''Perform expansion. t is name of map element to expand.
70 '''Perform expansion. t is name of map element to expand.
71 mapping contains added elements for use during expansion. Is a
71 mapping contains added elements for use during expansion. Is a
72 generator.'''
72 generator.'''
73 return _flatten(self._process(self._load(t), mapping))
73 return _flatten(self._process(self._load(t), mapping))
74
74
75 def _load(self, t):
75 def _load(self, t):
76 '''load, parse, and cache a template'''
76 '''load, parse, and cache a template'''
77 if t not in self._cache:
77 if t not in self._cache:
78 self._cache[t] = self._parse(self._loader(t))
78 self._cache[t] = self._parse(self._loader(t))
79 return self._cache[t]
79 return self._cache[t]
80
80
81 def _get(self, mapping, key):
81 def _get(self, mapping, key):
82 v = mapping.get(key)
82 v = mapping.get(key)
83 if v is None:
83 if v is None:
84 v = self._defaults.get(key, '')
84 v = self._defaults.get(key, '')
85 if hasattr(v, '__call__'):
85 if hasattr(v, '__call__'):
86 v = v(**mapping)
86 v = v(**mapping)
87 return v
87 return v
88
88
89 def _filter(self, mapping, parts):
89 def _filter(self, mapping, parts):
90 filters, val = parts
90 filters, val = parts
91 x = self._get(mapping, val)
91 x = self._get(mapping, val)
92 for f in filters:
92 for f in filters:
93 x = f(x)
93 x = f(x)
94 return x
94 return x
95
95
96 def _format(self, mapping, args):
96 def _format(self, mapping, args):
97 key, parsed = args
97 key, parsed = args
98 v = self._get(mapping, key)
98 v = self._get(mapping, key)
99 if not hasattr(v, '__iter__'):
99 if not hasattr(v, '__iter__'):
100 raise SyntaxError(_("error expanding '%s%%%s'")
100 raise SyntaxError(_("error expanding '%s%%%s'")
101 % (key, parsed))
101 % (key, parsed))
102 lm = mapping.copy()
102 lm = mapping.copy()
103 for i in v:
103 for i in v:
104 if isinstance(i, dict):
104 if isinstance(i, dict):
105 lm.update(i)
105 lm.update(i)
106 yield self._process(parsed, lm)
106 yield self._process(parsed, lm)
107 else:
107 else:
108 # v is not an iterable of dicts, this happen when 'key'
108 # v is not an iterable of dicts, this happen when 'key'
109 # has been fully expanded already and format is useless.
109 # has been fully expanded already and format is useless.
110 # If so, return the expanded value.
110 # If so, return the expanded value.
111 yield i
111 yield i
112
112
113 def _parse(self, tmpl):
113 def _parse(self, tmpl):
114 '''preparse a template'''
114 '''preparse a template'''
115 parsed = []
115 parsed = []
116 pos, stop = 0, len(tmpl)
116 pos, stop = 0, len(tmpl)
117 while pos < stop:
117 while pos < stop:
118 n = tmpl.find('{', pos)
118 n = tmpl.find('{', pos)
119 if n < 0:
119 if n < 0:
120 parsed.append((None, tmpl[pos:stop]))
120 parsed.append((None, tmpl[pos:stop]))
121 break
121 break
122 if n > 0 and tmpl[n - 1] == '\\':
122 if n > 0 and tmpl[n - 1] == '\\':
123 # escaped
123 # escaped
124 parsed.append((None, tmpl[pos:n - 1] + "{"))
124 parsed.append((None, tmpl[pos:n - 1] + "{"))
125 pos = n + 1
125 pos = n + 1
126 continue
126 continue
127 if n > pos:
127 if n > pos:
128 parsed.append((None, tmpl[pos:n]))
128 parsed.append((None, tmpl[pos:n]))
129
129
130 pos = n
130 pos = n
131 n = tmpl.find('}', pos)
131 n = tmpl.find('}', pos)
132 if n < 0:
132 if n < 0:
133 # no closing
133 # no closing
134 parsed.append((None, tmpl[pos:stop]))
134 parsed.append((None, tmpl[pos:stop]))
135 break
135 break
136
136
137 expr = tmpl[pos + 1:n]
137 expr = tmpl[pos + 1:n]
138 pos = n + 1
138 pos = n + 1
139
139
140 if '%' in expr:
140 if '%' in expr:
141 # the keyword should be formatted with a template
141 # the keyword should be formatted with a template
142 key, t = expr.split('%')
142 key, t = expr.split('%')
143 parsed.append((self._format, (key.strip(),
143 parsed.append((self._format, (key.strip(),
144 self._load(t.strip()))))
144 self._load(t.strip()))))
145 elif '|' in expr:
145 elif '|' in expr:
146 # process the keyword value with one or more filters
146 # process the keyword value with one or more filters
147 parts = expr.split('|')
147 parts = expr.split('|')
148 val = parts[0].strip()
148 val = parts[0].strip()
149 try:
149 try:
150 filters = [self._filters[f.strip()] for f in parts[1:]]
150 filters = [self._filters[f.strip()] for f in parts[1:]]
151 except KeyError, i:
151 except KeyError, i:
152 raise SyntaxError(_("unknown filter '%s'") % i[0])
152 raise SyntaxError(_("unknown filter '%s'") % i[0])
153 parsed.append((self._filter, (filters, val)))
153 parsed.append((self._filter, (filters, val)))
154 else:
154 else:
155 # just get the keyword
155 # just get the keyword
156 parsed.append((self._get, expr.strip()))
156 parsed.append((self._get, expr.strip()))
157
157
158 return parsed
158 return parsed
159
159
160 def _process(self, parsed, mapping):
160 def _process(self, parsed, mapping):
161 '''Render a template. Returns a generator.'''
161 '''Render a template. Returns a generator.'''
162 for f, e in parsed:
162 for f, e in parsed:
163 if f:
163 if f:
164 yield f(mapping, e)
164 yield f(mapping, e)
165 else:
165 else:
166 yield e
166 yield e
167
167
168 engines = {'default': engine}
168 engines = {'default': engine}
169
169
170 class templater(object):
170 class templater(object):
171
171
172 def __init__(self, mapfile, filters={}, defaults={}, cache={},
172 def __init__(self, mapfile, filters={}, defaults={}, cache={},
173 minchunk=1024, maxchunk=65536):
173 minchunk=1024, maxchunk=65536):
174 '''set up template engine.
174 '''set up template engine.
175 mapfile is name of file to read map definitions from.
175 mapfile is name of file to read map definitions from.
176 filters is dict of functions. each transforms a value into another.
176 filters is dict of functions. each transforms a value into another.
177 defaults is dict of default map definitions.'''
177 defaults is dict of default map definitions.'''
178 self.mapfile = mapfile or 'template'
178 self.mapfile = mapfile or 'template'
179 self.cache = cache.copy()
179 self.cache = cache.copy()
180 self.map = {}
180 self.map = {}
181 self.base = (mapfile and os.path.dirname(mapfile)) or ''
181 self.base = (mapfile and os.path.dirname(mapfile)) or ''
182 self.filters = templatefilters.filters.copy()
182 self.filters = templatefilters.filters.copy()
183 self.filters.update(filters)
183 self.filters.update(filters)
184 self.defaults = defaults
184 self.defaults = defaults
185 self.minchunk, self.maxchunk = minchunk, maxchunk
185 self.minchunk, self.maxchunk = minchunk, maxchunk
186 self.engines = {}
186 self.engines = {}
187
187
188 if not mapfile:
188 if not mapfile:
189 return
189 return
190 if not os.path.exists(mapfile):
190 if not os.path.exists(mapfile):
191 raise util.Abort(_('style not found: %s') % mapfile)
191 raise util.Abort(_('style not found: %s') % mapfile)
192
192
193 conf = config.config()
193 conf = config.config()
194 conf.read(mapfile)
194 conf.read(mapfile)
195
195
196 for key, val in conf[''].items():
196 for key, val in conf[''].items():
197 if val[0] in "'\"":
197 if val[0] in "'\"":
198 try:
198 try:
199 self.cache[key] = parsestring(val)
199 self.cache[key] = parsestring(val)
200 except SyntaxError, inst:
200 except SyntaxError, inst:
201 raise SyntaxError('%s: %s' %
201 raise SyntaxError('%s: %s' %
202 (conf.source('', key), inst.args[0]))
202 (conf.source('', key), inst.args[0]))
203 else:
203 else:
204 val = 'default', val
204 val = 'default', val
205 if ':' in val[1]:
205 if ':' in val[1]:
206 val = val[1].split(':', 1)
206 val = val[1].split(':', 1)
207 self.map[key] = val[0], os.path.join(self.base, val[1])
207 self.map[key] = val[0], os.path.join(self.base, val[1])
208
208
209 def __contains__(self, key):
209 def __contains__(self, key):
210 return key in self.cache or key in self.map
210 return key in self.cache or key in self.map
211
211
212 def load(self, t):
212 def load(self, t):
213 '''Get the template for the given template name. Use a local cache.'''
213 '''Get the template for the given template name. Use a local cache.'''
214 if not t in self.cache:
214 if not t in self.cache:
215 try:
215 try:
216 self.cache[t] = open(self.map[t][1]).read()
216 self.cache[t] = open(self.map[t][1]).read()
217 except KeyError, inst:
218 raise util.Abort(_('"%s" not in template map') % inst.args[0])
217 except IOError, inst:
219 except IOError, inst:
218 raise IOError(inst.args[0], _('template file %s: %s') %
220 raise IOError(inst.args[0], _('template file %s: %s') %
219 (self.map[t][1], inst.args[1]))
221 (self.map[t][1], inst.args[1]))
220 return self.cache[t]
222 return self.cache[t]
221
223
222 def __call__(self, t, **mapping):
224 def __call__(self, t, **mapping):
223 ttype = t in self.map and self.map[t][0] or 'default'
225 ttype = t in self.map and self.map[t][0] or 'default'
224 proc = self.engines.get(ttype)
226 proc = self.engines.get(ttype)
225 if proc is None:
227 if proc is None:
226 proc = engines[ttype](self.load, self.filters, self.defaults)
228 proc = engines[ttype](self.load, self.filters, self.defaults)
227 self.engines[ttype] = proc
229 self.engines[ttype] = proc
228
230
229 stream = proc.process(t, mapping)
231 stream = proc.process(t, mapping)
230 if self.minchunk:
232 if self.minchunk:
231 stream = util.increasingchunks(stream, min=self.minchunk,
233 stream = util.increasingchunks(stream, min=self.minchunk,
232 max=self.maxchunk)
234 max=self.maxchunk)
233 return stream
235 return stream
234
236
235 def templatepath(name=None):
237 def templatepath(name=None):
236 '''return location of template file or directory (if no name).
238 '''return location of template file or directory (if no name).
237 returns None if not found.'''
239 returns None if not found.'''
238 normpaths = []
240 normpaths = []
239
241
240 # executable version (py2exe) doesn't support __file__
242 # executable version (py2exe) doesn't support __file__
241 if hasattr(sys, 'frozen'):
243 if hasattr(sys, 'frozen'):
242 module = sys.executable
244 module = sys.executable
243 else:
245 else:
244 module = __file__
246 module = __file__
245 for f in path:
247 for f in path:
246 if f.startswith('/'):
248 if f.startswith('/'):
247 p = f
249 p = f
248 else:
250 else:
249 fl = f.split('/')
251 fl = f.split('/')
250 p = os.path.join(os.path.dirname(module), *fl)
252 p = os.path.join(os.path.dirname(module), *fl)
251 if name:
253 if name:
252 p = os.path.join(p, name)
254 p = os.path.join(p, name)
253 if name and os.path.exists(p):
255 if name and os.path.exists(p):
254 return os.path.normpath(p)
256 return os.path.normpath(p)
255 elif os.path.isdir(p):
257 elif os.path.isdir(p):
256 normpaths.append(os.path.normpath(p))
258 normpaths.append(os.path.normpath(p))
257
259
258 return normpaths
260 return normpaths
259
261
260 def stylemap(styles, paths=None):
262 def stylemap(styles, paths=None):
261 """Return path to mapfile for a given style.
263 """Return path to mapfile for a given style.
262
264
263 Searches mapfile in the following locations:
265 Searches mapfile in the following locations:
264 1. templatepath/style/map
266 1. templatepath/style/map
265 2. templatepath/map-style
267 2. templatepath/map-style
266 3. templatepath/map
268 3. templatepath/map
267 """
269 """
268
270
269 if paths is None:
271 if paths is None:
270 paths = templatepath()
272 paths = templatepath()
271 elif isinstance(paths, str):
273 elif isinstance(paths, str):
272 paths = [paths]
274 paths = [paths]
273
275
274 if isinstance(styles, str):
276 if isinstance(styles, str):
275 styles = [styles]
277 styles = [styles]
276
278
277 for style in styles:
279 for style in styles:
278 if not style:
280 if not style:
279 continue
281 continue
280 locations = [os.path.join(style, 'map'), 'map-' + style]
282 locations = [os.path.join(style, 'map'), 'map-' + style]
281 locations.append('map')
283 locations.append('map')
282
284
283 for path in paths:
285 for path in paths:
284 for location in locations:
286 for location in locations:
285 mapfile = os.path.join(path, location)
287 mapfile = os.path.join(path, location)
286 if os.path.isfile(mapfile):
288 if os.path.isfile(mapfile):
287 return style, mapfile
289 return style, mapfile
288
290
289 raise RuntimeError("No hgweb templates found in %r" % paths)
291 raise RuntimeError("No hgweb templates found in %r" % paths)
@@ -1,1360 +1,1360 b''
1 $ hg init a
1 $ hg init a
2 $ cd a
2 $ cd a
3 $ echo a > a
3 $ echo a > a
4 $ hg add a
4 $ hg add a
5 $ echo line 1 > b
5 $ echo line 1 > b
6 $ echo line 2 >> b
6 $ echo line 2 >> b
7 $ hg commit -l b -d '1000000 0' -u 'User Name <user@hostname>'
7 $ hg commit -l b -d '1000000 0' -u 'User Name <user@hostname>'
8
8
9 $ hg add b
9 $ hg add b
10 $ echo other 1 > c
10 $ echo other 1 > c
11 $ echo other 2 >> c
11 $ echo other 2 >> c
12 $ echo >> c
12 $ echo >> c
13 $ echo other 3 >> c
13 $ echo other 3 >> c
14 $ hg commit -l c -d '1100000 0' -u 'A. N. Other <other@place>'
14 $ hg commit -l c -d '1100000 0' -u 'A. N. Other <other@place>'
15
15
16 $ hg add c
16 $ hg add c
17 $ hg commit -m 'no person' -d '1200000 0' -u 'other@place'
17 $ hg commit -m 'no person' -d '1200000 0' -u 'other@place'
18 $ echo c >> c
18 $ echo c >> c
19 $ hg commit -m 'no user, no domain' -d '1300000 0' -u 'person'
19 $ hg commit -m 'no user, no domain' -d '1300000 0' -u 'person'
20
20
21 $ echo foo > .hg/branch
21 $ echo foo > .hg/branch
22 $ hg commit -m 'new branch' -d '1400000 0' -u 'person'
22 $ hg commit -m 'new branch' -d '1400000 0' -u 'person'
23
23
24 $ hg co -q 3
24 $ hg co -q 3
25 $ echo other 4 >> d
25 $ echo other 4 >> d
26 $ hg add d
26 $ hg add d
27 $ hg commit -m 'new head' -d '1500000 0' -u 'person'
27 $ hg commit -m 'new head' -d '1500000 0' -u 'person'
28
28
29 $ hg merge -q foo
29 $ hg merge -q foo
30 $ hg commit -m 'merge' -d '1500001 0' -u 'person'
30 $ hg commit -m 'merge' -d '1500001 0' -u 'person'
31
31
32 Second branch starting at nullrev:
32 Second branch starting at nullrev:
33
33
34 $ hg update null
34 $ hg update null
35 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
35 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
36 $ echo second > second
36 $ echo second > second
37 $ hg add second
37 $ hg add second
38 $ hg commit -m second -d '1000000 0' -u 'User Name <user@hostname>'
38 $ hg commit -m second -d '1000000 0' -u 'User Name <user@hostname>'
39 created new head
39 created new head
40
40
41 $ echo third > third
41 $ echo third > third
42 $ hg add third
42 $ hg add third
43 $ hg mv second fourth
43 $ hg mv second fourth
44 $ hg commit -m third -d "2020-01-01 10:01"
44 $ hg commit -m third -d "2020-01-01 10:01"
45
45
46 Make sure user/global hgrc does not affect tests
46 Make sure user/global hgrc does not affect tests
47
47
48 $ echo '[ui]' > .hg/hgrc
48 $ echo '[ui]' > .hg/hgrc
49 $ echo 'logtemplate =' >> .hg/hgrc
49 $ echo 'logtemplate =' >> .hg/hgrc
50 $ echo 'style =' >> .hg/hgrc
50 $ echo 'style =' >> .hg/hgrc
51
51
52 Default style is like normal output:
52 Default style is like normal output:
53
53
54 $ hg log > log.out
54 $ hg log > log.out
55 $ hg log --style default > style.out
55 $ hg log --style default > style.out
56 $ cmp log.out style.out || diff -u log.out style.out
56 $ cmp log.out style.out || diff -u log.out style.out
57
57
58 $ hg log -v > log.out
58 $ hg log -v > log.out
59 $ hg log -v --style default > style.out
59 $ hg log -v --style default > style.out
60 $ cmp log.out style.out || diff -u log.out style.out
60 $ cmp log.out style.out || diff -u log.out style.out
61
61
62 $ hg log --debug > log.out
62 $ hg log --debug > log.out
63 $ hg log --debug --style default > style.out
63 $ hg log --debug --style default > style.out
64 $ cmp log.out style.out || diff -u log.out style.out
64 $ cmp log.out style.out || diff -u log.out style.out
65
65
66 Revision with no copies (used to print a traceback):
66 Revision with no copies (used to print a traceback):
67
67
68 $ hg tip -v --template '\n'
68 $ hg tip -v --template '\n'
69
69
70
70
71 Compact style works:
71 Compact style works:
72
72
73 $ hg log --style compact
73 $ hg log --style compact
74 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
74 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
75 third
75 third
76
76
77 7:-1 29114dbae42b 1970-01-12 13:46 +0000 user
77 7:-1 29114dbae42b 1970-01-12 13:46 +0000 user
78 second
78 second
79
79
80 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
80 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
81 merge
81 merge
82
82
83 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
83 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
84 new head
84 new head
85
85
86 4 32a18f097fcc 1970-01-17 04:53 +0000 person
86 4 32a18f097fcc 1970-01-17 04:53 +0000 person
87 new branch
87 new branch
88
88
89 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
89 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
90 no user, no domain
90 no user, no domain
91
91
92 2 97054abb4ab8 1970-01-14 21:20 +0000 other
92 2 97054abb4ab8 1970-01-14 21:20 +0000 other
93 no person
93 no person
94
94
95 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
95 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
96 other 1
96 other 1
97
97
98 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
98 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
99 line 1
99 line 1
100
100
101
101
102 $ hg log -v --style compact
102 $ hg log -v --style compact
103 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
103 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
104 third
104 third
105
105
106 7:-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
106 7:-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
107 second
107 second
108
108
109 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
109 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
110 merge
110 merge
111
111
112 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
112 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
113 new head
113 new head
114
114
115 4 32a18f097fcc 1970-01-17 04:53 +0000 person
115 4 32a18f097fcc 1970-01-17 04:53 +0000 person
116 new branch
116 new branch
117
117
118 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
118 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
119 no user, no domain
119 no user, no domain
120
120
121 2 97054abb4ab8 1970-01-14 21:20 +0000 other@place
121 2 97054abb4ab8 1970-01-14 21:20 +0000 other@place
122 no person
122 no person
123
123
124 1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
124 1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
125 other 1
125 other 1
126 other 2
126 other 2
127
127
128 other 3
128 other 3
129
129
130 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
130 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
131 line 1
131 line 1
132 line 2
132 line 2
133
133
134
134
135 $ hg log --debug --style compact
135 $ hg log --debug --style compact
136 8[tip]:7,-1 95c24699272e 2020-01-01 10:01 +0000 test
136 8[tip]:7,-1 95c24699272e 2020-01-01 10:01 +0000 test
137 third
137 third
138
138
139 7:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
139 7:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
140 second
140 second
141
141
142 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
142 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
143 merge
143 merge
144
144
145 5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
145 5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
146 new head
146 new head
147
147
148 4:3,-1 32a18f097fcc 1970-01-17 04:53 +0000 person
148 4:3,-1 32a18f097fcc 1970-01-17 04:53 +0000 person
149 new branch
149 new branch
150
150
151 3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
151 3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
152 no user, no domain
152 no user, no domain
153
153
154 2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other@place
154 2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other@place
155 no person
155 no person
156
156
157 1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
157 1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
158 other 1
158 other 1
159 other 2
159 other 2
160
160
161 other 3
161 other 3
162
162
163 0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
163 0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
164 line 1
164 line 1
165 line 2
165 line 2
166
166
167
167
168 Test xml styles:
168 Test xml styles:
169
169
170 $ hg log --style xml
170 $ hg log --style xml
171 <?xml version="1.0"?>
171 <?xml version="1.0"?>
172 <log>
172 <log>
173 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
173 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
174 <tag>tip</tag>
174 <tag>tip</tag>
175 <author email="test">test</author>
175 <author email="test">test</author>
176 <date>2020-01-01T10:01:00+00:00</date>
176 <date>2020-01-01T10:01:00+00:00</date>
177 <msg xml:space="preserve">third</msg>
177 <msg xml:space="preserve">third</msg>
178 </logentry>
178 </logentry>
179 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
179 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
180 <parent revision="-1" node="0000000000000000000000000000000000000000" />
180 <parent revision="-1" node="0000000000000000000000000000000000000000" />
181 <author email="user@hostname">User Name</author>
181 <author email="user@hostname">User Name</author>
182 <date>1970-01-12T13:46:40+00:00</date>
182 <date>1970-01-12T13:46:40+00:00</date>
183 <msg xml:space="preserve">second</msg>
183 <msg xml:space="preserve">second</msg>
184 </logentry>
184 </logentry>
185 <logentry revision="6" node="c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f">
185 <logentry revision="6" node="c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f">
186 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
186 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
187 <parent revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4" />
187 <parent revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4" />
188 <author email="person">person</author>
188 <author email="person">person</author>
189 <date>1970-01-18T08:40:01+00:00</date>
189 <date>1970-01-18T08:40:01+00:00</date>
190 <msg xml:space="preserve">merge</msg>
190 <msg xml:space="preserve">merge</msg>
191 </logentry>
191 </logentry>
192 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
192 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
193 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
193 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
194 <author email="person">person</author>
194 <author email="person">person</author>
195 <date>1970-01-18T08:40:00+00:00</date>
195 <date>1970-01-18T08:40:00+00:00</date>
196 <msg xml:space="preserve">new head</msg>
196 <msg xml:space="preserve">new head</msg>
197 </logentry>
197 </logentry>
198 <logentry revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4">
198 <logentry revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4">
199 <branch>foo</branch>
199 <branch>foo</branch>
200 <author email="person">person</author>
200 <author email="person">person</author>
201 <date>1970-01-17T04:53:20+00:00</date>
201 <date>1970-01-17T04:53:20+00:00</date>
202 <msg xml:space="preserve">new branch</msg>
202 <msg xml:space="preserve">new branch</msg>
203 </logentry>
203 </logentry>
204 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
204 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
205 <author email="person">person</author>
205 <author email="person">person</author>
206 <date>1970-01-16T01:06:40+00:00</date>
206 <date>1970-01-16T01:06:40+00:00</date>
207 <msg xml:space="preserve">no user, no domain</msg>
207 <msg xml:space="preserve">no user, no domain</msg>
208 </logentry>
208 </logentry>
209 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
209 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
210 <author email="other@place">other</author>
210 <author email="other@place">other</author>
211 <date>1970-01-14T21:20:00+00:00</date>
211 <date>1970-01-14T21:20:00+00:00</date>
212 <msg xml:space="preserve">no person</msg>
212 <msg xml:space="preserve">no person</msg>
213 </logentry>
213 </logentry>
214 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
214 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
215 <author email="other@place">A. N. Other</author>
215 <author email="other@place">A. N. Other</author>
216 <date>1970-01-13T17:33:20+00:00</date>
216 <date>1970-01-13T17:33:20+00:00</date>
217 <msg xml:space="preserve">other 1
217 <msg xml:space="preserve">other 1
218 other 2
218 other 2
219
219
220 other 3</msg>
220 other 3</msg>
221 </logentry>
221 </logentry>
222 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
222 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
223 <author email="user@hostname">User Name</author>
223 <author email="user@hostname">User Name</author>
224 <date>1970-01-12T13:46:40+00:00</date>
224 <date>1970-01-12T13:46:40+00:00</date>
225 <msg xml:space="preserve">line 1
225 <msg xml:space="preserve">line 1
226 line 2</msg>
226 line 2</msg>
227 </logentry>
227 </logentry>
228 </log>
228 </log>
229
229
230 $ hg log -v --style xml
230 $ hg log -v --style xml
231 <?xml version="1.0"?>
231 <?xml version="1.0"?>
232 <log>
232 <log>
233 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
233 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
234 <tag>tip</tag>
234 <tag>tip</tag>
235 <author email="test">test</author>
235 <author email="test">test</author>
236 <date>2020-01-01T10:01:00+00:00</date>
236 <date>2020-01-01T10:01:00+00:00</date>
237 <msg xml:space="preserve">third</msg>
237 <msg xml:space="preserve">third</msg>
238 <paths>
238 <paths>
239 <path action="A">fourth</path>
239 <path action="A">fourth</path>
240 <path action="A">third</path>
240 <path action="A">third</path>
241 <path action="R">second</path>
241 <path action="R">second</path>
242 </paths>
242 </paths>
243 <copies>
243 <copies>
244 <copy source="second">fourth</copy>
244 <copy source="second">fourth</copy>
245 </copies>
245 </copies>
246 </logentry>
246 </logentry>
247 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
247 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
248 <parent revision="-1" node="0000000000000000000000000000000000000000" />
248 <parent revision="-1" node="0000000000000000000000000000000000000000" />
249 <author email="user@hostname">User Name</author>
249 <author email="user@hostname">User Name</author>
250 <date>1970-01-12T13:46:40+00:00</date>
250 <date>1970-01-12T13:46:40+00:00</date>
251 <msg xml:space="preserve">second</msg>
251 <msg xml:space="preserve">second</msg>
252 <paths>
252 <paths>
253 <path action="A">second</path>
253 <path action="A">second</path>
254 </paths>
254 </paths>
255 </logentry>
255 </logentry>
256 <logentry revision="6" node="c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f">
256 <logentry revision="6" node="c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f">
257 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
257 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
258 <parent revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4" />
258 <parent revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4" />
259 <author email="person">person</author>
259 <author email="person">person</author>
260 <date>1970-01-18T08:40:01+00:00</date>
260 <date>1970-01-18T08:40:01+00:00</date>
261 <msg xml:space="preserve">merge</msg>
261 <msg xml:space="preserve">merge</msg>
262 <paths>
262 <paths>
263 </paths>
263 </paths>
264 </logentry>
264 </logentry>
265 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
265 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
266 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
266 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
267 <author email="person">person</author>
267 <author email="person">person</author>
268 <date>1970-01-18T08:40:00+00:00</date>
268 <date>1970-01-18T08:40:00+00:00</date>
269 <msg xml:space="preserve">new head</msg>
269 <msg xml:space="preserve">new head</msg>
270 <paths>
270 <paths>
271 <path action="A">d</path>
271 <path action="A">d</path>
272 </paths>
272 </paths>
273 </logentry>
273 </logentry>
274 <logentry revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4">
274 <logentry revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4">
275 <branch>foo</branch>
275 <branch>foo</branch>
276 <author email="person">person</author>
276 <author email="person">person</author>
277 <date>1970-01-17T04:53:20+00:00</date>
277 <date>1970-01-17T04:53:20+00:00</date>
278 <msg xml:space="preserve">new branch</msg>
278 <msg xml:space="preserve">new branch</msg>
279 <paths>
279 <paths>
280 </paths>
280 </paths>
281 </logentry>
281 </logentry>
282 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
282 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
283 <author email="person">person</author>
283 <author email="person">person</author>
284 <date>1970-01-16T01:06:40+00:00</date>
284 <date>1970-01-16T01:06:40+00:00</date>
285 <msg xml:space="preserve">no user, no domain</msg>
285 <msg xml:space="preserve">no user, no domain</msg>
286 <paths>
286 <paths>
287 <path action="M">c</path>
287 <path action="M">c</path>
288 </paths>
288 </paths>
289 </logentry>
289 </logentry>
290 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
290 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
291 <author email="other@place">other</author>
291 <author email="other@place">other</author>
292 <date>1970-01-14T21:20:00+00:00</date>
292 <date>1970-01-14T21:20:00+00:00</date>
293 <msg xml:space="preserve">no person</msg>
293 <msg xml:space="preserve">no person</msg>
294 <paths>
294 <paths>
295 <path action="A">c</path>
295 <path action="A">c</path>
296 </paths>
296 </paths>
297 </logentry>
297 </logentry>
298 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
298 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
299 <author email="other@place">A. N. Other</author>
299 <author email="other@place">A. N. Other</author>
300 <date>1970-01-13T17:33:20+00:00</date>
300 <date>1970-01-13T17:33:20+00:00</date>
301 <msg xml:space="preserve">other 1
301 <msg xml:space="preserve">other 1
302 other 2
302 other 2
303
303
304 other 3</msg>
304 other 3</msg>
305 <paths>
305 <paths>
306 <path action="A">b</path>
306 <path action="A">b</path>
307 </paths>
307 </paths>
308 </logentry>
308 </logentry>
309 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
309 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
310 <author email="user@hostname">User Name</author>
310 <author email="user@hostname">User Name</author>
311 <date>1970-01-12T13:46:40+00:00</date>
311 <date>1970-01-12T13:46:40+00:00</date>
312 <msg xml:space="preserve">line 1
312 <msg xml:space="preserve">line 1
313 line 2</msg>
313 line 2</msg>
314 <paths>
314 <paths>
315 <path action="A">a</path>
315 <path action="A">a</path>
316 </paths>
316 </paths>
317 </logentry>
317 </logentry>
318 </log>
318 </log>
319
319
320 $ hg log --debug --style xml
320 $ hg log --debug --style xml
321 <?xml version="1.0"?>
321 <?xml version="1.0"?>
322 <log>
322 <log>
323 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
323 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
324 <tag>tip</tag>
324 <tag>tip</tag>
325 <parent revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453" />
325 <parent revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453" />
326 <parent revision="-1" node="0000000000000000000000000000000000000000" />
326 <parent revision="-1" node="0000000000000000000000000000000000000000" />
327 <author email="test">test</author>
327 <author email="test">test</author>
328 <date>2020-01-01T10:01:00+00:00</date>
328 <date>2020-01-01T10:01:00+00:00</date>
329 <msg xml:space="preserve">third</msg>
329 <msg xml:space="preserve">third</msg>
330 <paths>
330 <paths>
331 <path action="A">fourth</path>
331 <path action="A">fourth</path>
332 <path action="A">third</path>
332 <path action="A">third</path>
333 <path action="R">second</path>
333 <path action="R">second</path>
334 </paths>
334 </paths>
335 <copies>
335 <copies>
336 <copy source="second">fourth</copy>
336 <copy source="second">fourth</copy>
337 </copies>
337 </copies>
338 <extra key="branch">default</extra>
338 <extra key="branch">default</extra>
339 </logentry>
339 </logentry>
340 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
340 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
341 <parent revision="-1" node="0000000000000000000000000000000000000000" />
341 <parent revision="-1" node="0000000000000000000000000000000000000000" />
342 <parent revision="-1" node="0000000000000000000000000000000000000000" />
342 <parent revision="-1" node="0000000000000000000000000000000000000000" />
343 <author email="user@hostname">User Name</author>
343 <author email="user@hostname">User Name</author>
344 <date>1970-01-12T13:46:40+00:00</date>
344 <date>1970-01-12T13:46:40+00:00</date>
345 <msg xml:space="preserve">second</msg>
345 <msg xml:space="preserve">second</msg>
346 <paths>
346 <paths>
347 <path action="A">second</path>
347 <path action="A">second</path>
348 </paths>
348 </paths>
349 <extra key="branch">default</extra>
349 <extra key="branch">default</extra>
350 </logentry>
350 </logentry>
351 <logentry revision="6" node="c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f">
351 <logentry revision="6" node="c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f">
352 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
352 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
353 <parent revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4" />
353 <parent revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4" />
354 <author email="person">person</author>
354 <author email="person">person</author>
355 <date>1970-01-18T08:40:01+00:00</date>
355 <date>1970-01-18T08:40:01+00:00</date>
356 <msg xml:space="preserve">merge</msg>
356 <msg xml:space="preserve">merge</msg>
357 <paths>
357 <paths>
358 </paths>
358 </paths>
359 <extra key="branch">default</extra>
359 <extra key="branch">default</extra>
360 </logentry>
360 </logentry>
361 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
361 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
362 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
362 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
363 <parent revision="-1" node="0000000000000000000000000000000000000000" />
363 <parent revision="-1" node="0000000000000000000000000000000000000000" />
364 <author email="person">person</author>
364 <author email="person">person</author>
365 <date>1970-01-18T08:40:00+00:00</date>
365 <date>1970-01-18T08:40:00+00:00</date>
366 <msg xml:space="preserve">new head</msg>
366 <msg xml:space="preserve">new head</msg>
367 <paths>
367 <paths>
368 <path action="A">d</path>
368 <path action="A">d</path>
369 </paths>
369 </paths>
370 <extra key="branch">default</extra>
370 <extra key="branch">default</extra>
371 </logentry>
371 </logentry>
372 <logentry revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4">
372 <logentry revision="4" node="32a18f097fcccf76ef282f62f8a85b3adf8d13c4">
373 <branch>foo</branch>
373 <branch>foo</branch>
374 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
374 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
375 <parent revision="-1" node="0000000000000000000000000000000000000000" />
375 <parent revision="-1" node="0000000000000000000000000000000000000000" />
376 <author email="person">person</author>
376 <author email="person">person</author>
377 <date>1970-01-17T04:53:20+00:00</date>
377 <date>1970-01-17T04:53:20+00:00</date>
378 <msg xml:space="preserve">new branch</msg>
378 <msg xml:space="preserve">new branch</msg>
379 <paths>
379 <paths>
380 </paths>
380 </paths>
381 <extra key="branch">foo</extra>
381 <extra key="branch">foo</extra>
382 </logentry>
382 </logentry>
383 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
383 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
384 <parent revision="2" node="97054abb4ab824450e9164180baf491ae0078465" />
384 <parent revision="2" node="97054abb4ab824450e9164180baf491ae0078465" />
385 <parent revision="-1" node="0000000000000000000000000000000000000000" />
385 <parent revision="-1" node="0000000000000000000000000000000000000000" />
386 <author email="person">person</author>
386 <author email="person">person</author>
387 <date>1970-01-16T01:06:40+00:00</date>
387 <date>1970-01-16T01:06:40+00:00</date>
388 <msg xml:space="preserve">no user, no domain</msg>
388 <msg xml:space="preserve">no user, no domain</msg>
389 <paths>
389 <paths>
390 <path action="M">c</path>
390 <path action="M">c</path>
391 </paths>
391 </paths>
392 <extra key="branch">default</extra>
392 <extra key="branch">default</extra>
393 </logentry>
393 </logentry>
394 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
394 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
395 <parent revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965" />
395 <parent revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965" />
396 <parent revision="-1" node="0000000000000000000000000000000000000000" />
396 <parent revision="-1" node="0000000000000000000000000000000000000000" />
397 <author email="other@place">other</author>
397 <author email="other@place">other</author>
398 <date>1970-01-14T21:20:00+00:00</date>
398 <date>1970-01-14T21:20:00+00:00</date>
399 <msg xml:space="preserve">no person</msg>
399 <msg xml:space="preserve">no person</msg>
400 <paths>
400 <paths>
401 <path action="A">c</path>
401 <path action="A">c</path>
402 </paths>
402 </paths>
403 <extra key="branch">default</extra>
403 <extra key="branch">default</extra>
404 </logentry>
404 </logentry>
405 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
405 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
406 <parent revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f" />
406 <parent revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f" />
407 <parent revision="-1" node="0000000000000000000000000000000000000000" />
407 <parent revision="-1" node="0000000000000000000000000000000000000000" />
408 <author email="other@place">A. N. Other</author>
408 <author email="other@place">A. N. Other</author>
409 <date>1970-01-13T17:33:20+00:00</date>
409 <date>1970-01-13T17:33:20+00:00</date>
410 <msg xml:space="preserve">other 1
410 <msg xml:space="preserve">other 1
411 other 2
411 other 2
412
412
413 other 3</msg>
413 other 3</msg>
414 <paths>
414 <paths>
415 <path action="A">b</path>
415 <path action="A">b</path>
416 </paths>
416 </paths>
417 <extra key="branch">default</extra>
417 <extra key="branch">default</extra>
418 </logentry>
418 </logentry>
419 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
419 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
420 <parent revision="-1" node="0000000000000000000000000000000000000000" />
420 <parent revision="-1" node="0000000000000000000000000000000000000000" />
421 <parent revision="-1" node="0000000000000000000000000000000000000000" />
421 <parent revision="-1" node="0000000000000000000000000000000000000000" />
422 <author email="user@hostname">User Name</author>
422 <author email="user@hostname">User Name</author>
423 <date>1970-01-12T13:46:40+00:00</date>
423 <date>1970-01-12T13:46:40+00:00</date>
424 <msg xml:space="preserve">line 1
424 <msg xml:space="preserve">line 1
425 line 2</msg>
425 line 2</msg>
426 <paths>
426 <paths>
427 <path action="A">a</path>
427 <path action="A">a</path>
428 </paths>
428 </paths>
429 <extra key="branch">default</extra>
429 <extra key="branch">default</extra>
430 </logentry>
430 </logentry>
431 </log>
431 </log>
432
432
433
433
434 Error if style not readable:
434 Error if style not readable:
435
435
436 $ touch q
436 $ touch q
437 $ chmod 0 q
437 $ chmod 0 q
438 $ hg log --style ./q
438 $ hg log --style ./q
439 abort: Permission denied: ./q
439 abort: Permission denied: ./q
440 [255]
440 [255]
441
441
442 Error if no style:
442 Error if no style:
443
443
444 $ hg log --style notexist
444 $ hg log --style notexist
445 abort: style not found: notexist
445 abort: style not found: notexist
446 [255]
446 [255]
447
447
448 Error if style missing key:
448 Error if style missing key:
449
449
450 $ echo 'q = q' > t
450 $ echo 'q = q' > t
451 $ hg log --style ./t
451 $ hg log --style ./t
452 abort: ./t: no key named 'changeset'
452 abort: "changeset" not in template map
453 [255]
453 [255]
454
454
455 Error if include fails:
455 Error if include fails:
456
456
457 $ echo 'changeset = q' >> t
457 $ echo 'changeset = q' >> t
458 $ hg log --style ./t
458 $ hg log --style ./t
459 abort: template file ./q: Permission denied
459 abort: template file ./q: Permission denied
460 [255]
460 [255]
461
461
462 Include works:
462 Include works:
463
463
464 $ rm q
464 $ rm q
465 $ echo '{rev}' > q
465 $ echo '{rev}' > q
466 $ hg log --style ./t
466 $ hg log --style ./t
467 8
467 8
468 7
468 7
469 6
469 6
470 5
470 5
471 4
471 4
472 3
472 3
473 2
473 2
474 1
474 1
475 0
475 0
476
476
477 ui.style works:
477 ui.style works:
478
478
479 $ echo '[ui]' > .hg/hgrc
479 $ echo '[ui]' > .hg/hgrc
480 $ echo 'style = t' >> .hg/hgrc
480 $ echo 'style = t' >> .hg/hgrc
481 $ hg log
481 $ hg log
482 8
482 8
483 7
483 7
484 6
484 6
485 5
485 5
486 4
486 4
487 3
487 3
488 2
488 2
489 1
489 1
490 0
490 0
491
491
492
492
493 Issue338:
493 Issue338:
494
494
495 $ hg log --style=changelog > changelog
495 $ hg log --style=changelog > changelog
496
496
497 $ cat changelog
497 $ cat changelog
498 2020-01-01 test <test>
498 2020-01-01 test <test>
499
499
500 * fourth, second, third:
500 * fourth, second, third:
501 third
501 third
502 [95c24699272e] [tip]
502 [95c24699272e] [tip]
503
503
504 1970-01-12 User Name <user@hostname>
504 1970-01-12 User Name <user@hostname>
505
505
506 * second:
506 * second:
507 second
507 second
508 [29114dbae42b]
508 [29114dbae42b]
509
509
510 1970-01-18 person <person>
510 1970-01-18 person <person>
511
511
512 * merge
512 * merge
513 [c7b487c6c50e]
513 [c7b487c6c50e]
514
514
515 * d:
515 * d:
516 new head
516 new head
517 [13207e5a10d9]
517 [13207e5a10d9]
518
518
519 1970-01-17 person <person>
519 1970-01-17 person <person>
520
520
521 * new branch
521 * new branch
522 [32a18f097fcc] <foo>
522 [32a18f097fcc] <foo>
523
523
524 1970-01-16 person <person>
524 1970-01-16 person <person>
525
525
526 * c:
526 * c:
527 no user, no domain
527 no user, no domain
528 [10e46f2dcbf4]
528 [10e46f2dcbf4]
529
529
530 1970-01-14 other <other@place>
530 1970-01-14 other <other@place>
531
531
532 * c:
532 * c:
533 no person
533 no person
534 [97054abb4ab8]
534 [97054abb4ab8]
535
535
536 1970-01-13 A. N. Other <other@place>
536 1970-01-13 A. N. Other <other@place>
537
537
538 * b:
538 * b:
539 other 1 other 2
539 other 1 other 2
540
540
541 other 3
541 other 3
542 [b608e9d1a3f0]
542 [b608e9d1a3f0]
543
543
544 1970-01-12 User Name <user@hostname>
544 1970-01-12 User Name <user@hostname>
545
545
546 * a:
546 * a:
547 line 1 line 2
547 line 1 line 2
548 [1e4e1b8f71e0]
548 [1e4e1b8f71e0]
549
549
550
550
551 Issue2130: xml output for 'hg heads' is malformed
551 Issue2130: xml output for 'hg heads' is malformed
552
552
553 $ hg heads --style changelog
553 $ hg heads --style changelog
554 2020-01-01 test <test>
554 2020-01-01 test <test>
555
555
556 * fourth, second, third:
556 * fourth, second, third:
557 third
557 third
558 [95c24699272e] [tip]
558 [95c24699272e] [tip]
559
559
560 1970-01-18 person <person>
560 1970-01-18 person <person>
561
561
562 * merge
562 * merge
563 [c7b487c6c50e]
563 [c7b487c6c50e]
564
564
565 1970-01-17 person <person>
565 1970-01-17 person <person>
566
566
567 * new branch
567 * new branch
568 [32a18f097fcc] <foo>
568 [32a18f097fcc] <foo>
569
569
570
570
571 Keys work:
571 Keys work:
572
572
573 $ for key in author branch branches date desc file_adds file_dels file_mods \
573 $ for key in author branch branches date desc file_adds file_dels file_mods \
574 > file_copies file_copies_switch files \
574 > file_copies file_copies_switch files \
575 > manifest node parents rev tags diffstat extras; do
575 > manifest node parents rev tags diffstat extras; do
576 > for mode in '' --verbose --debug; do
576 > for mode in '' --verbose --debug; do
577 > hg log $mode --template "$key$mode: {$key}\n"
577 > hg log $mode --template "$key$mode: {$key}\n"
578 > done
578 > done
579 > done
579 > done
580 author: test
580 author: test
581 author: User Name <user@hostname>
581 author: User Name <user@hostname>
582 author: person
582 author: person
583 author: person
583 author: person
584 author: person
584 author: person
585 author: person
585 author: person
586 author: other@place
586 author: other@place
587 author: A. N. Other <other@place>
587 author: A. N. Other <other@place>
588 author: User Name <user@hostname>
588 author: User Name <user@hostname>
589 author--verbose: test
589 author--verbose: test
590 author--verbose: User Name <user@hostname>
590 author--verbose: User Name <user@hostname>
591 author--verbose: person
591 author--verbose: person
592 author--verbose: person
592 author--verbose: person
593 author--verbose: person
593 author--verbose: person
594 author--verbose: person
594 author--verbose: person
595 author--verbose: other@place
595 author--verbose: other@place
596 author--verbose: A. N. Other <other@place>
596 author--verbose: A. N. Other <other@place>
597 author--verbose: User Name <user@hostname>
597 author--verbose: User Name <user@hostname>
598 author--debug: test
598 author--debug: test
599 author--debug: User Name <user@hostname>
599 author--debug: User Name <user@hostname>
600 author--debug: person
600 author--debug: person
601 author--debug: person
601 author--debug: person
602 author--debug: person
602 author--debug: person
603 author--debug: person
603 author--debug: person
604 author--debug: other@place
604 author--debug: other@place
605 author--debug: A. N. Other <other@place>
605 author--debug: A. N. Other <other@place>
606 author--debug: User Name <user@hostname>
606 author--debug: User Name <user@hostname>
607 branch: default
607 branch: default
608 branch: default
608 branch: default
609 branch: default
609 branch: default
610 branch: default
610 branch: default
611 branch: foo
611 branch: foo
612 branch: default
612 branch: default
613 branch: default
613 branch: default
614 branch: default
614 branch: default
615 branch: default
615 branch: default
616 branch--verbose: default
616 branch--verbose: default
617 branch--verbose: default
617 branch--verbose: default
618 branch--verbose: default
618 branch--verbose: default
619 branch--verbose: default
619 branch--verbose: default
620 branch--verbose: foo
620 branch--verbose: foo
621 branch--verbose: default
621 branch--verbose: default
622 branch--verbose: default
622 branch--verbose: default
623 branch--verbose: default
623 branch--verbose: default
624 branch--verbose: default
624 branch--verbose: default
625 branch--debug: default
625 branch--debug: default
626 branch--debug: default
626 branch--debug: default
627 branch--debug: default
627 branch--debug: default
628 branch--debug: default
628 branch--debug: default
629 branch--debug: foo
629 branch--debug: foo
630 branch--debug: default
630 branch--debug: default
631 branch--debug: default
631 branch--debug: default
632 branch--debug: default
632 branch--debug: default
633 branch--debug: default
633 branch--debug: default
634 branches:
634 branches:
635 branches:
635 branches:
636 branches:
636 branches:
637 branches:
637 branches:
638 branches: foo
638 branches: foo
639 branches:
639 branches:
640 branches:
640 branches:
641 branches:
641 branches:
642 branches:
642 branches:
643 branches--verbose:
643 branches--verbose:
644 branches--verbose:
644 branches--verbose:
645 branches--verbose:
645 branches--verbose:
646 branches--verbose:
646 branches--verbose:
647 branches--verbose: foo
647 branches--verbose: foo
648 branches--verbose:
648 branches--verbose:
649 branches--verbose:
649 branches--verbose:
650 branches--verbose:
650 branches--verbose:
651 branches--verbose:
651 branches--verbose:
652 branches--debug:
652 branches--debug:
653 branches--debug:
653 branches--debug:
654 branches--debug:
654 branches--debug:
655 branches--debug:
655 branches--debug:
656 branches--debug: foo
656 branches--debug: foo
657 branches--debug:
657 branches--debug:
658 branches--debug:
658 branches--debug:
659 branches--debug:
659 branches--debug:
660 branches--debug:
660 branches--debug:
661 date: 1577872860.00
661 date: 1577872860.00
662 date: 1000000.00
662 date: 1000000.00
663 date: 1500001.00
663 date: 1500001.00
664 date: 1500000.00
664 date: 1500000.00
665 date: 1400000.00
665 date: 1400000.00
666 date: 1300000.00
666 date: 1300000.00
667 date: 1200000.00
667 date: 1200000.00
668 date: 1100000.00
668 date: 1100000.00
669 date: 1000000.00
669 date: 1000000.00
670 date--verbose: 1577872860.00
670 date--verbose: 1577872860.00
671 date--verbose: 1000000.00
671 date--verbose: 1000000.00
672 date--verbose: 1500001.00
672 date--verbose: 1500001.00
673 date--verbose: 1500000.00
673 date--verbose: 1500000.00
674 date--verbose: 1400000.00
674 date--verbose: 1400000.00
675 date--verbose: 1300000.00
675 date--verbose: 1300000.00
676 date--verbose: 1200000.00
676 date--verbose: 1200000.00
677 date--verbose: 1100000.00
677 date--verbose: 1100000.00
678 date--verbose: 1000000.00
678 date--verbose: 1000000.00
679 date--debug: 1577872860.00
679 date--debug: 1577872860.00
680 date--debug: 1000000.00
680 date--debug: 1000000.00
681 date--debug: 1500001.00
681 date--debug: 1500001.00
682 date--debug: 1500000.00
682 date--debug: 1500000.00
683 date--debug: 1400000.00
683 date--debug: 1400000.00
684 date--debug: 1300000.00
684 date--debug: 1300000.00
685 date--debug: 1200000.00
685 date--debug: 1200000.00
686 date--debug: 1100000.00
686 date--debug: 1100000.00
687 date--debug: 1000000.00
687 date--debug: 1000000.00
688 desc: third
688 desc: third
689 desc: second
689 desc: second
690 desc: merge
690 desc: merge
691 desc: new head
691 desc: new head
692 desc: new branch
692 desc: new branch
693 desc: no user, no domain
693 desc: no user, no domain
694 desc: no person
694 desc: no person
695 desc: other 1
695 desc: other 1
696 other 2
696 other 2
697
697
698 other 3
698 other 3
699 desc: line 1
699 desc: line 1
700 line 2
700 line 2
701 desc--verbose: third
701 desc--verbose: third
702 desc--verbose: second
702 desc--verbose: second
703 desc--verbose: merge
703 desc--verbose: merge
704 desc--verbose: new head
704 desc--verbose: new head
705 desc--verbose: new branch
705 desc--verbose: new branch
706 desc--verbose: no user, no domain
706 desc--verbose: no user, no domain
707 desc--verbose: no person
707 desc--verbose: no person
708 desc--verbose: other 1
708 desc--verbose: other 1
709 other 2
709 other 2
710
710
711 other 3
711 other 3
712 desc--verbose: line 1
712 desc--verbose: line 1
713 line 2
713 line 2
714 desc--debug: third
714 desc--debug: third
715 desc--debug: second
715 desc--debug: second
716 desc--debug: merge
716 desc--debug: merge
717 desc--debug: new head
717 desc--debug: new head
718 desc--debug: new branch
718 desc--debug: new branch
719 desc--debug: no user, no domain
719 desc--debug: no user, no domain
720 desc--debug: no person
720 desc--debug: no person
721 desc--debug: other 1
721 desc--debug: other 1
722 other 2
722 other 2
723
723
724 other 3
724 other 3
725 desc--debug: line 1
725 desc--debug: line 1
726 line 2
726 line 2
727 file_adds: fourth third
727 file_adds: fourth third
728 file_adds: second
728 file_adds: second
729 file_adds:
729 file_adds:
730 file_adds: d
730 file_adds: d
731 file_adds:
731 file_adds:
732 file_adds:
732 file_adds:
733 file_adds: c
733 file_adds: c
734 file_adds: b
734 file_adds: b
735 file_adds: a
735 file_adds: a
736 file_adds--verbose: fourth third
736 file_adds--verbose: fourth third
737 file_adds--verbose: second
737 file_adds--verbose: second
738 file_adds--verbose:
738 file_adds--verbose:
739 file_adds--verbose: d
739 file_adds--verbose: d
740 file_adds--verbose:
740 file_adds--verbose:
741 file_adds--verbose:
741 file_adds--verbose:
742 file_adds--verbose: c
742 file_adds--verbose: c
743 file_adds--verbose: b
743 file_adds--verbose: b
744 file_adds--verbose: a
744 file_adds--verbose: a
745 file_adds--debug: fourth third
745 file_adds--debug: fourth third
746 file_adds--debug: second
746 file_adds--debug: second
747 file_adds--debug:
747 file_adds--debug:
748 file_adds--debug: d
748 file_adds--debug: d
749 file_adds--debug:
749 file_adds--debug:
750 file_adds--debug:
750 file_adds--debug:
751 file_adds--debug: c
751 file_adds--debug: c
752 file_adds--debug: b
752 file_adds--debug: b
753 file_adds--debug: a
753 file_adds--debug: a
754 file_dels: second
754 file_dels: second
755 file_dels:
755 file_dels:
756 file_dels:
756 file_dels:
757 file_dels:
757 file_dels:
758 file_dels:
758 file_dels:
759 file_dels:
759 file_dels:
760 file_dels:
760 file_dels:
761 file_dels:
761 file_dels:
762 file_dels:
762 file_dels:
763 file_dels--verbose: second
763 file_dels--verbose: second
764 file_dels--verbose:
764 file_dels--verbose:
765 file_dels--verbose:
765 file_dels--verbose:
766 file_dels--verbose:
766 file_dels--verbose:
767 file_dels--verbose:
767 file_dels--verbose:
768 file_dels--verbose:
768 file_dels--verbose:
769 file_dels--verbose:
769 file_dels--verbose:
770 file_dels--verbose:
770 file_dels--verbose:
771 file_dels--verbose:
771 file_dels--verbose:
772 file_dels--debug: second
772 file_dels--debug: second
773 file_dels--debug:
773 file_dels--debug:
774 file_dels--debug:
774 file_dels--debug:
775 file_dels--debug:
775 file_dels--debug:
776 file_dels--debug:
776 file_dels--debug:
777 file_dels--debug:
777 file_dels--debug:
778 file_dels--debug:
778 file_dels--debug:
779 file_dels--debug:
779 file_dels--debug:
780 file_dels--debug:
780 file_dels--debug:
781 file_mods:
781 file_mods:
782 file_mods:
782 file_mods:
783 file_mods:
783 file_mods:
784 file_mods:
784 file_mods:
785 file_mods:
785 file_mods:
786 file_mods: c
786 file_mods: c
787 file_mods:
787 file_mods:
788 file_mods:
788 file_mods:
789 file_mods:
789 file_mods:
790 file_mods--verbose:
790 file_mods--verbose:
791 file_mods--verbose:
791 file_mods--verbose:
792 file_mods--verbose:
792 file_mods--verbose:
793 file_mods--verbose:
793 file_mods--verbose:
794 file_mods--verbose:
794 file_mods--verbose:
795 file_mods--verbose: c
795 file_mods--verbose: c
796 file_mods--verbose:
796 file_mods--verbose:
797 file_mods--verbose:
797 file_mods--verbose:
798 file_mods--verbose:
798 file_mods--verbose:
799 file_mods--debug:
799 file_mods--debug:
800 file_mods--debug:
800 file_mods--debug:
801 file_mods--debug:
801 file_mods--debug:
802 file_mods--debug:
802 file_mods--debug:
803 file_mods--debug:
803 file_mods--debug:
804 file_mods--debug: c
804 file_mods--debug: c
805 file_mods--debug:
805 file_mods--debug:
806 file_mods--debug:
806 file_mods--debug:
807 file_mods--debug:
807 file_mods--debug:
808 file_copies: fourth (second)
808 file_copies: fourth (second)
809 file_copies:
809 file_copies:
810 file_copies:
810 file_copies:
811 file_copies:
811 file_copies:
812 file_copies:
812 file_copies:
813 file_copies:
813 file_copies:
814 file_copies:
814 file_copies:
815 file_copies:
815 file_copies:
816 file_copies:
816 file_copies:
817 file_copies--verbose: fourth (second)
817 file_copies--verbose: fourth (second)
818 file_copies--verbose:
818 file_copies--verbose:
819 file_copies--verbose:
819 file_copies--verbose:
820 file_copies--verbose:
820 file_copies--verbose:
821 file_copies--verbose:
821 file_copies--verbose:
822 file_copies--verbose:
822 file_copies--verbose:
823 file_copies--verbose:
823 file_copies--verbose:
824 file_copies--verbose:
824 file_copies--verbose:
825 file_copies--verbose:
825 file_copies--verbose:
826 file_copies--debug: fourth (second)
826 file_copies--debug: fourth (second)
827 file_copies--debug:
827 file_copies--debug:
828 file_copies--debug:
828 file_copies--debug:
829 file_copies--debug:
829 file_copies--debug:
830 file_copies--debug:
830 file_copies--debug:
831 file_copies--debug:
831 file_copies--debug:
832 file_copies--debug:
832 file_copies--debug:
833 file_copies--debug:
833 file_copies--debug:
834 file_copies--debug:
834 file_copies--debug:
835 file_copies_switch:
835 file_copies_switch:
836 file_copies_switch:
836 file_copies_switch:
837 file_copies_switch:
837 file_copies_switch:
838 file_copies_switch:
838 file_copies_switch:
839 file_copies_switch:
839 file_copies_switch:
840 file_copies_switch:
840 file_copies_switch:
841 file_copies_switch:
841 file_copies_switch:
842 file_copies_switch:
842 file_copies_switch:
843 file_copies_switch:
843 file_copies_switch:
844 file_copies_switch--verbose:
844 file_copies_switch--verbose:
845 file_copies_switch--verbose:
845 file_copies_switch--verbose:
846 file_copies_switch--verbose:
846 file_copies_switch--verbose:
847 file_copies_switch--verbose:
847 file_copies_switch--verbose:
848 file_copies_switch--verbose:
848 file_copies_switch--verbose:
849 file_copies_switch--verbose:
849 file_copies_switch--verbose:
850 file_copies_switch--verbose:
850 file_copies_switch--verbose:
851 file_copies_switch--verbose:
851 file_copies_switch--verbose:
852 file_copies_switch--verbose:
852 file_copies_switch--verbose:
853 file_copies_switch--debug:
853 file_copies_switch--debug:
854 file_copies_switch--debug:
854 file_copies_switch--debug:
855 file_copies_switch--debug:
855 file_copies_switch--debug:
856 file_copies_switch--debug:
856 file_copies_switch--debug:
857 file_copies_switch--debug:
857 file_copies_switch--debug:
858 file_copies_switch--debug:
858 file_copies_switch--debug:
859 file_copies_switch--debug:
859 file_copies_switch--debug:
860 file_copies_switch--debug:
860 file_copies_switch--debug:
861 file_copies_switch--debug:
861 file_copies_switch--debug:
862 files: fourth second third
862 files: fourth second third
863 files: second
863 files: second
864 files:
864 files:
865 files: d
865 files: d
866 files:
866 files:
867 files: c
867 files: c
868 files: c
868 files: c
869 files: b
869 files: b
870 files: a
870 files: a
871 files--verbose: fourth second third
871 files--verbose: fourth second third
872 files--verbose: second
872 files--verbose: second
873 files--verbose:
873 files--verbose:
874 files--verbose: d
874 files--verbose: d
875 files--verbose:
875 files--verbose:
876 files--verbose: c
876 files--verbose: c
877 files--verbose: c
877 files--verbose: c
878 files--verbose: b
878 files--verbose: b
879 files--verbose: a
879 files--verbose: a
880 files--debug: fourth second third
880 files--debug: fourth second third
881 files--debug: second
881 files--debug: second
882 files--debug:
882 files--debug:
883 files--debug: d
883 files--debug: d
884 files--debug:
884 files--debug:
885 files--debug: c
885 files--debug: c
886 files--debug: c
886 files--debug: c
887 files--debug: b
887 files--debug: b
888 files--debug: a
888 files--debug: a
889 manifest: 8:94961b75a2da
889 manifest: 8:94961b75a2da
890 manifest: 7:f2dbc354b94e
890 manifest: 7:f2dbc354b94e
891 manifest: 6:91015e9dbdd7
891 manifest: 6:91015e9dbdd7
892 manifest: 5:4dc3def4f9b4
892 manifest: 5:4dc3def4f9b4
893 manifest: 4:90ae8dda64e1
893 manifest: 4:90ae8dda64e1
894 manifest: 3:cb5a1327723b
894 manifest: 3:cb5a1327723b
895 manifest: 2:6e0e82995c35
895 manifest: 2:6e0e82995c35
896 manifest: 1:4e8d705b1e53
896 manifest: 1:4e8d705b1e53
897 manifest: 0:a0c8bcbbb45c
897 manifest: 0:a0c8bcbbb45c
898 manifest--verbose: 8:94961b75a2da
898 manifest--verbose: 8:94961b75a2da
899 manifest--verbose: 7:f2dbc354b94e
899 manifest--verbose: 7:f2dbc354b94e
900 manifest--verbose: 6:91015e9dbdd7
900 manifest--verbose: 6:91015e9dbdd7
901 manifest--verbose: 5:4dc3def4f9b4
901 manifest--verbose: 5:4dc3def4f9b4
902 manifest--verbose: 4:90ae8dda64e1
902 manifest--verbose: 4:90ae8dda64e1
903 manifest--verbose: 3:cb5a1327723b
903 manifest--verbose: 3:cb5a1327723b
904 manifest--verbose: 2:6e0e82995c35
904 manifest--verbose: 2:6e0e82995c35
905 manifest--verbose: 1:4e8d705b1e53
905 manifest--verbose: 1:4e8d705b1e53
906 manifest--verbose: 0:a0c8bcbbb45c
906 manifest--verbose: 0:a0c8bcbbb45c
907 manifest--debug: 8:94961b75a2da554b4df6fb599e5bfc7d48de0c64
907 manifest--debug: 8:94961b75a2da554b4df6fb599e5bfc7d48de0c64
908 manifest--debug: 7:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
908 manifest--debug: 7:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
909 manifest--debug: 6:91015e9dbdd76a6791085d12b0a0ec7fcd22ffbf
909 manifest--debug: 6:91015e9dbdd76a6791085d12b0a0ec7fcd22ffbf
910 manifest--debug: 5:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
910 manifest--debug: 5:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
911 manifest--debug: 4:90ae8dda64e1a876c792bccb9af66284f6018363
911 manifest--debug: 4:90ae8dda64e1a876c792bccb9af66284f6018363
912 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
912 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
913 manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
913 manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
914 manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
914 manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
915 manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
915 manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
916 node: 95c24699272ef57d062b8bccc32c878bf841784a
916 node: 95c24699272ef57d062b8bccc32c878bf841784a
917 node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
917 node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
918 node: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
918 node: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
919 node: 13207e5a10d9fd28ec424934298e176197f2c67f
919 node: 13207e5a10d9fd28ec424934298e176197f2c67f
920 node: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
920 node: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
921 node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
921 node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
922 node: 97054abb4ab824450e9164180baf491ae0078465
922 node: 97054abb4ab824450e9164180baf491ae0078465
923 node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
923 node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
924 node: 1e4e1b8f71e05681d422154f5421e385fec3454f
924 node: 1e4e1b8f71e05681d422154f5421e385fec3454f
925 node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
925 node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
926 node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
926 node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
927 node--verbose: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
927 node--verbose: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
928 node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
928 node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
929 node--verbose: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
929 node--verbose: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
930 node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
930 node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
931 node--verbose: 97054abb4ab824450e9164180baf491ae0078465
931 node--verbose: 97054abb4ab824450e9164180baf491ae0078465
932 node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
932 node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
933 node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
933 node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
934 node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
934 node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
935 node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
935 node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
936 node--debug: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
936 node--debug: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
937 node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
937 node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
938 node--debug: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
938 node--debug: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
939 node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
939 node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
940 node--debug: 97054abb4ab824450e9164180baf491ae0078465
940 node--debug: 97054abb4ab824450e9164180baf491ae0078465
941 node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
941 node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
942 node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
942 node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
943 parents:
943 parents:
944 parents: -1:000000000000
944 parents: -1:000000000000
945 parents: 5:13207e5a10d9 4:32a18f097fcc
945 parents: 5:13207e5a10d9 4:32a18f097fcc
946 parents: 3:10e46f2dcbf4
946 parents: 3:10e46f2dcbf4
947 parents:
947 parents:
948 parents:
948 parents:
949 parents:
949 parents:
950 parents:
950 parents:
951 parents:
951 parents:
952 parents--verbose:
952 parents--verbose:
953 parents--verbose: -1:000000000000
953 parents--verbose: -1:000000000000
954 parents--verbose: 5:13207e5a10d9 4:32a18f097fcc
954 parents--verbose: 5:13207e5a10d9 4:32a18f097fcc
955 parents--verbose: 3:10e46f2dcbf4
955 parents--verbose: 3:10e46f2dcbf4
956 parents--verbose:
956 parents--verbose:
957 parents--verbose:
957 parents--verbose:
958 parents--verbose:
958 parents--verbose:
959 parents--verbose:
959 parents--verbose:
960 parents--verbose:
960 parents--verbose:
961 parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000
961 parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000
962 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
962 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
963 parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:32a18f097fcccf76ef282f62f8a85b3adf8d13c4
963 parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:32a18f097fcccf76ef282f62f8a85b3adf8d13c4
964 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
964 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
965 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
965 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
966 parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000
966 parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000
967 parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000
967 parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000
968 parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000
968 parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000
969 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
969 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
970 rev: 8
970 rev: 8
971 rev: 7
971 rev: 7
972 rev: 6
972 rev: 6
973 rev: 5
973 rev: 5
974 rev: 4
974 rev: 4
975 rev: 3
975 rev: 3
976 rev: 2
976 rev: 2
977 rev: 1
977 rev: 1
978 rev: 0
978 rev: 0
979 rev--verbose: 8
979 rev--verbose: 8
980 rev--verbose: 7
980 rev--verbose: 7
981 rev--verbose: 6
981 rev--verbose: 6
982 rev--verbose: 5
982 rev--verbose: 5
983 rev--verbose: 4
983 rev--verbose: 4
984 rev--verbose: 3
984 rev--verbose: 3
985 rev--verbose: 2
985 rev--verbose: 2
986 rev--verbose: 1
986 rev--verbose: 1
987 rev--verbose: 0
987 rev--verbose: 0
988 rev--debug: 8
988 rev--debug: 8
989 rev--debug: 7
989 rev--debug: 7
990 rev--debug: 6
990 rev--debug: 6
991 rev--debug: 5
991 rev--debug: 5
992 rev--debug: 4
992 rev--debug: 4
993 rev--debug: 3
993 rev--debug: 3
994 rev--debug: 2
994 rev--debug: 2
995 rev--debug: 1
995 rev--debug: 1
996 rev--debug: 0
996 rev--debug: 0
997 tags: tip
997 tags: tip
998 tags:
998 tags:
999 tags:
999 tags:
1000 tags:
1000 tags:
1001 tags:
1001 tags:
1002 tags:
1002 tags:
1003 tags:
1003 tags:
1004 tags:
1004 tags:
1005 tags:
1005 tags:
1006 tags--verbose: tip
1006 tags--verbose: tip
1007 tags--verbose:
1007 tags--verbose:
1008 tags--verbose:
1008 tags--verbose:
1009 tags--verbose:
1009 tags--verbose:
1010 tags--verbose:
1010 tags--verbose:
1011 tags--verbose:
1011 tags--verbose:
1012 tags--verbose:
1012 tags--verbose:
1013 tags--verbose:
1013 tags--verbose:
1014 tags--verbose:
1014 tags--verbose:
1015 tags--debug: tip
1015 tags--debug: tip
1016 tags--debug:
1016 tags--debug:
1017 tags--debug:
1017 tags--debug:
1018 tags--debug:
1018 tags--debug:
1019 tags--debug:
1019 tags--debug:
1020 tags--debug:
1020 tags--debug:
1021 tags--debug:
1021 tags--debug:
1022 tags--debug:
1022 tags--debug:
1023 tags--debug:
1023 tags--debug:
1024 diffstat: 3: +2/-1
1024 diffstat: 3: +2/-1
1025 diffstat: 1: +1/-0
1025 diffstat: 1: +1/-0
1026 diffstat: 0: +0/-0
1026 diffstat: 0: +0/-0
1027 diffstat: 1: +1/-0
1027 diffstat: 1: +1/-0
1028 diffstat: 0: +0/-0
1028 diffstat: 0: +0/-0
1029 diffstat: 1: +1/-0
1029 diffstat: 1: +1/-0
1030 diffstat: 1: +4/-0
1030 diffstat: 1: +4/-0
1031 diffstat: 1: +2/-0
1031 diffstat: 1: +2/-0
1032 diffstat: 1: +1/-0
1032 diffstat: 1: +1/-0
1033 diffstat--verbose: 3: +2/-1
1033 diffstat--verbose: 3: +2/-1
1034 diffstat--verbose: 1: +1/-0
1034 diffstat--verbose: 1: +1/-0
1035 diffstat--verbose: 0: +0/-0
1035 diffstat--verbose: 0: +0/-0
1036 diffstat--verbose: 1: +1/-0
1036 diffstat--verbose: 1: +1/-0
1037 diffstat--verbose: 0: +0/-0
1037 diffstat--verbose: 0: +0/-0
1038 diffstat--verbose: 1: +1/-0
1038 diffstat--verbose: 1: +1/-0
1039 diffstat--verbose: 1: +4/-0
1039 diffstat--verbose: 1: +4/-0
1040 diffstat--verbose: 1: +2/-0
1040 diffstat--verbose: 1: +2/-0
1041 diffstat--verbose: 1: +1/-0
1041 diffstat--verbose: 1: +1/-0
1042 diffstat--debug: 3: +2/-1
1042 diffstat--debug: 3: +2/-1
1043 diffstat--debug: 1: +1/-0
1043 diffstat--debug: 1: +1/-0
1044 diffstat--debug: 0: +0/-0
1044 diffstat--debug: 0: +0/-0
1045 diffstat--debug: 1: +1/-0
1045 diffstat--debug: 1: +1/-0
1046 diffstat--debug: 0: +0/-0
1046 diffstat--debug: 0: +0/-0
1047 diffstat--debug: 1: +1/-0
1047 diffstat--debug: 1: +1/-0
1048 diffstat--debug: 1: +4/-0
1048 diffstat--debug: 1: +4/-0
1049 diffstat--debug: 1: +2/-0
1049 diffstat--debug: 1: +2/-0
1050 diffstat--debug: 1: +1/-0
1050 diffstat--debug: 1: +1/-0
1051 extras: branch=default
1051 extras: branch=default
1052 extras: branch=default
1052 extras: branch=default
1053 extras: branch=default
1053 extras: branch=default
1054 extras: branch=default
1054 extras: branch=default
1055 extras: branch=foo
1055 extras: branch=foo
1056 extras: branch=default
1056 extras: branch=default
1057 extras: branch=default
1057 extras: branch=default
1058 extras: branch=default
1058 extras: branch=default
1059 extras: branch=default
1059 extras: branch=default
1060 extras--verbose: branch=default
1060 extras--verbose: branch=default
1061 extras--verbose: branch=default
1061 extras--verbose: branch=default
1062 extras--verbose: branch=default
1062 extras--verbose: branch=default
1063 extras--verbose: branch=default
1063 extras--verbose: branch=default
1064 extras--verbose: branch=foo
1064 extras--verbose: branch=foo
1065 extras--verbose: branch=default
1065 extras--verbose: branch=default
1066 extras--verbose: branch=default
1066 extras--verbose: branch=default
1067 extras--verbose: branch=default
1067 extras--verbose: branch=default
1068 extras--verbose: branch=default
1068 extras--verbose: branch=default
1069 extras--debug: branch=default
1069 extras--debug: branch=default
1070 extras--debug: branch=default
1070 extras--debug: branch=default
1071 extras--debug: branch=default
1071 extras--debug: branch=default
1072 extras--debug: branch=default
1072 extras--debug: branch=default
1073 extras--debug: branch=foo
1073 extras--debug: branch=foo
1074 extras--debug: branch=default
1074 extras--debug: branch=default
1075 extras--debug: branch=default
1075 extras--debug: branch=default
1076 extras--debug: branch=default
1076 extras--debug: branch=default
1077 extras--debug: branch=default
1077 extras--debug: branch=default
1078
1078
1079
1079
1080 Filters work:
1080 Filters work:
1081
1081
1082 $ hg log --template '{author|domain}\n'
1082 $ hg log --template '{author|domain}\n'
1083
1083
1084 hostname
1084 hostname
1085
1085
1086
1086
1087
1087
1088
1088
1089 place
1089 place
1090 place
1090 place
1091 hostname
1091 hostname
1092
1092
1093 $ hg log --template '{author|person}\n'
1093 $ hg log --template '{author|person}\n'
1094 test
1094 test
1095 User Name
1095 User Name
1096 person
1096 person
1097 person
1097 person
1098 person
1098 person
1099 person
1099 person
1100 other
1100 other
1101 A. N. Other
1101 A. N. Other
1102 User Name
1102 User Name
1103
1103
1104 $ hg log --template '{author|user}\n'
1104 $ hg log --template '{author|user}\n'
1105 test
1105 test
1106 user
1106 user
1107 person
1107 person
1108 person
1108 person
1109 person
1109 person
1110 person
1110 person
1111 other
1111 other
1112 other
1112 other
1113 user
1113 user
1114
1114
1115 $ hg log --template '{date|age}\n' > /dev/null || exit 1
1115 $ hg log --template '{date|age}\n' > /dev/null || exit 1
1116
1116
1117 $ hg log -l1 --template '{date|age}\n'
1117 $ hg log -l1 --template '{date|age}\n'
1118 in the future
1118 in the future
1119 $ hg log --template '{date|date}\n'
1119 $ hg log --template '{date|date}\n'
1120 Wed Jan 01 10:01:00 2020 +0000
1120 Wed Jan 01 10:01:00 2020 +0000
1121 Mon Jan 12 13:46:40 1970 +0000
1121 Mon Jan 12 13:46:40 1970 +0000
1122 Sun Jan 18 08:40:01 1970 +0000
1122 Sun Jan 18 08:40:01 1970 +0000
1123 Sun Jan 18 08:40:00 1970 +0000
1123 Sun Jan 18 08:40:00 1970 +0000
1124 Sat Jan 17 04:53:20 1970 +0000
1124 Sat Jan 17 04:53:20 1970 +0000
1125 Fri Jan 16 01:06:40 1970 +0000
1125 Fri Jan 16 01:06:40 1970 +0000
1126 Wed Jan 14 21:20:00 1970 +0000
1126 Wed Jan 14 21:20:00 1970 +0000
1127 Tue Jan 13 17:33:20 1970 +0000
1127 Tue Jan 13 17:33:20 1970 +0000
1128 Mon Jan 12 13:46:40 1970 +0000
1128 Mon Jan 12 13:46:40 1970 +0000
1129
1129
1130 $ hg log --template '{date|isodate}\n'
1130 $ hg log --template '{date|isodate}\n'
1131 2020-01-01 10:01 +0000
1131 2020-01-01 10:01 +0000
1132 1970-01-12 13:46 +0000
1132 1970-01-12 13:46 +0000
1133 1970-01-18 08:40 +0000
1133 1970-01-18 08:40 +0000
1134 1970-01-18 08:40 +0000
1134 1970-01-18 08:40 +0000
1135 1970-01-17 04:53 +0000
1135 1970-01-17 04:53 +0000
1136 1970-01-16 01:06 +0000
1136 1970-01-16 01:06 +0000
1137 1970-01-14 21:20 +0000
1137 1970-01-14 21:20 +0000
1138 1970-01-13 17:33 +0000
1138 1970-01-13 17:33 +0000
1139 1970-01-12 13:46 +0000
1139 1970-01-12 13:46 +0000
1140
1140
1141 $ hg log --template '{date|isodatesec}\n'
1141 $ hg log --template '{date|isodatesec}\n'
1142 2020-01-01 10:01:00 +0000
1142 2020-01-01 10:01:00 +0000
1143 1970-01-12 13:46:40 +0000
1143 1970-01-12 13:46:40 +0000
1144 1970-01-18 08:40:01 +0000
1144 1970-01-18 08:40:01 +0000
1145 1970-01-18 08:40:00 +0000
1145 1970-01-18 08:40:00 +0000
1146 1970-01-17 04:53:20 +0000
1146 1970-01-17 04:53:20 +0000
1147 1970-01-16 01:06:40 +0000
1147 1970-01-16 01:06:40 +0000
1148 1970-01-14 21:20:00 +0000
1148 1970-01-14 21:20:00 +0000
1149 1970-01-13 17:33:20 +0000
1149 1970-01-13 17:33:20 +0000
1150 1970-01-12 13:46:40 +0000
1150 1970-01-12 13:46:40 +0000
1151
1151
1152 $ hg log --template '{date|rfc822date}\n'
1152 $ hg log --template '{date|rfc822date}\n'
1153 Wed, 01 Jan 2020 10:01:00 +0000
1153 Wed, 01 Jan 2020 10:01:00 +0000
1154 Mon, 12 Jan 1970 13:46:40 +0000
1154 Mon, 12 Jan 1970 13:46:40 +0000
1155 Sun, 18 Jan 1970 08:40:01 +0000
1155 Sun, 18 Jan 1970 08:40:01 +0000
1156 Sun, 18 Jan 1970 08:40:00 +0000
1156 Sun, 18 Jan 1970 08:40:00 +0000
1157 Sat, 17 Jan 1970 04:53:20 +0000
1157 Sat, 17 Jan 1970 04:53:20 +0000
1158 Fri, 16 Jan 1970 01:06:40 +0000
1158 Fri, 16 Jan 1970 01:06:40 +0000
1159 Wed, 14 Jan 1970 21:20:00 +0000
1159 Wed, 14 Jan 1970 21:20:00 +0000
1160 Tue, 13 Jan 1970 17:33:20 +0000
1160 Tue, 13 Jan 1970 17:33:20 +0000
1161 Mon, 12 Jan 1970 13:46:40 +0000
1161 Mon, 12 Jan 1970 13:46:40 +0000
1162
1162
1163 $ hg log --template '{desc|firstline}\n'
1163 $ hg log --template '{desc|firstline}\n'
1164 third
1164 third
1165 second
1165 second
1166 merge
1166 merge
1167 new head
1167 new head
1168 new branch
1168 new branch
1169 no user, no domain
1169 no user, no domain
1170 no person
1170 no person
1171 other 1
1171 other 1
1172 line 1
1172 line 1
1173
1173
1174 $ hg log --template '{node|short}\n'
1174 $ hg log --template '{node|short}\n'
1175 95c24699272e
1175 95c24699272e
1176 29114dbae42b
1176 29114dbae42b
1177 c7b487c6c50e
1177 c7b487c6c50e
1178 13207e5a10d9
1178 13207e5a10d9
1179 32a18f097fcc
1179 32a18f097fcc
1180 10e46f2dcbf4
1180 10e46f2dcbf4
1181 97054abb4ab8
1181 97054abb4ab8
1182 b608e9d1a3f0
1182 b608e9d1a3f0
1183 1e4e1b8f71e0
1183 1e4e1b8f71e0
1184
1184
1185 $ hg log --template '<changeset author="{author|xmlescape}"/>\n'
1185 $ hg log --template '<changeset author="{author|xmlescape}"/>\n'
1186 <changeset author="test"/>
1186 <changeset author="test"/>
1187 <changeset author="User Name &lt;user@hostname&gt;"/>
1187 <changeset author="User Name &lt;user@hostname&gt;"/>
1188 <changeset author="person"/>
1188 <changeset author="person"/>
1189 <changeset author="person"/>
1189 <changeset author="person"/>
1190 <changeset author="person"/>
1190 <changeset author="person"/>
1191 <changeset author="person"/>
1191 <changeset author="person"/>
1192 <changeset author="other@place"/>
1192 <changeset author="other@place"/>
1193 <changeset author="A. N. Other &lt;other@place&gt;"/>
1193 <changeset author="A. N. Other &lt;other@place&gt;"/>
1194 <changeset author="User Name &lt;user@hostname&gt;"/>
1194 <changeset author="User Name &lt;user@hostname&gt;"/>
1195
1195
1196 $ hg log --template '{rev}: {children}\n'
1196 $ hg log --template '{rev}: {children}\n'
1197 8:
1197 8:
1198 7: 8:95c24699272e
1198 7: 8:95c24699272e
1199 6:
1199 6:
1200 5: 6:c7b487c6c50e
1200 5: 6:c7b487c6c50e
1201 4: 6:c7b487c6c50e
1201 4: 6:c7b487c6c50e
1202 3: 4:32a18f097fcc 5:13207e5a10d9
1202 3: 4:32a18f097fcc 5:13207e5a10d9
1203 2: 3:10e46f2dcbf4
1203 2: 3:10e46f2dcbf4
1204 1: 2:97054abb4ab8
1204 1: 2:97054abb4ab8
1205 0: 1:b608e9d1a3f0
1205 0: 1:b608e9d1a3f0
1206
1206
1207 Formatnode filter works:
1207 Formatnode filter works:
1208
1208
1209 $ hg -q log -r 0 --template '{node|formatnode}\n'
1209 $ hg -q log -r 0 --template '{node|formatnode}\n'
1210 1e4e1b8f71e0
1210 1e4e1b8f71e0
1211
1211
1212 $ hg log -r 0 --template '{node|formatnode}\n'
1212 $ hg log -r 0 --template '{node|formatnode}\n'
1213 1e4e1b8f71e0
1213 1e4e1b8f71e0
1214
1214
1215 $ hg -v log -r 0 --template '{node|formatnode}\n'
1215 $ hg -v log -r 0 --template '{node|formatnode}\n'
1216 1e4e1b8f71e0
1216 1e4e1b8f71e0
1217
1217
1218 $ hg --debug log -r 0 --template '{node|formatnode}\n'
1218 $ hg --debug log -r 0 --template '{node|formatnode}\n'
1219 1e4e1b8f71e05681d422154f5421e385fec3454f
1219 1e4e1b8f71e05681d422154f5421e385fec3454f
1220
1220
1221 Error on syntax:
1221 Error on syntax:
1222
1222
1223 $ echo 'x = "f' >> t
1223 $ echo 'x = "f' >> t
1224 $ hg log
1224 $ hg log
1225 abort: t:3: unmatched quotes
1225 abort: t:3: unmatched quotes
1226 [255]
1226 [255]
1227
1227
1228 $ cd ..
1228 $ cd ..
1229
1229
1230
1230
1231 latesttag:
1231 latesttag:
1232
1232
1233 $ hg init latesttag
1233 $ hg init latesttag
1234 $ cd latesttag
1234 $ cd latesttag
1235
1235
1236 $ echo a > file
1236 $ echo a > file
1237 $ hg ci -Am a -d '0 0'
1237 $ hg ci -Am a -d '0 0'
1238 adding file
1238 adding file
1239
1239
1240 $ echo b >> file
1240 $ echo b >> file
1241 $ hg ci -m b -d '1 0'
1241 $ hg ci -m b -d '1 0'
1242
1242
1243 $ echo c >> head1
1243 $ echo c >> head1
1244 $ hg ci -Am h1c -d '2 0'
1244 $ hg ci -Am h1c -d '2 0'
1245 adding head1
1245 adding head1
1246
1246
1247 $ hg update -q 1
1247 $ hg update -q 1
1248 $ echo d >> head2
1248 $ echo d >> head2
1249 $ hg ci -Am h2d -d '3 0'
1249 $ hg ci -Am h2d -d '3 0'
1250 adding head2
1250 adding head2
1251 created new head
1251 created new head
1252
1252
1253 $ echo e >> head2
1253 $ echo e >> head2
1254 $ hg ci -m h2e -d '4 0'
1254 $ hg ci -m h2e -d '4 0'
1255
1255
1256 $ hg merge -q
1256 $ hg merge -q
1257 $ hg ci -m merge -d '5 0'
1257 $ hg ci -m merge -d '5 0'
1258
1258
1259 No tag set:
1259 No tag set:
1260
1260
1261 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1261 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1262 5: null+5
1262 5: null+5
1263 4: null+4
1263 4: null+4
1264 3: null+3
1264 3: null+3
1265 2: null+3
1265 2: null+3
1266 1: null+2
1266 1: null+2
1267 0: null+1
1267 0: null+1
1268
1268
1269 One common tag: longuest path wins:
1269 One common tag: longuest path wins:
1270
1270
1271 $ hg tag -r 1 -m t1 -d '6 0' t1
1271 $ hg tag -r 1 -m t1 -d '6 0' t1
1272 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1272 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1273 6: t1+4
1273 6: t1+4
1274 5: t1+3
1274 5: t1+3
1275 4: t1+2
1275 4: t1+2
1276 3: t1+1
1276 3: t1+1
1277 2: t1+1
1277 2: t1+1
1278 1: t1+0
1278 1: t1+0
1279 0: null+1
1279 0: null+1
1280
1280
1281 One ancestor tag: more recent wins:
1281 One ancestor tag: more recent wins:
1282
1282
1283 $ hg tag -r 2 -m t2 -d '7 0' t2
1283 $ hg tag -r 2 -m t2 -d '7 0' t2
1284 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1284 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1285 7: t2+3
1285 7: t2+3
1286 6: t2+2
1286 6: t2+2
1287 5: t2+1
1287 5: t2+1
1288 4: t1+2
1288 4: t1+2
1289 3: t1+1
1289 3: t1+1
1290 2: t2+0
1290 2: t2+0
1291 1: t1+0
1291 1: t1+0
1292 0: null+1
1292 0: null+1
1293
1293
1294 Two branch tags: more recent wins:
1294 Two branch tags: more recent wins:
1295
1295
1296 $ hg tag -r 3 -m t3 -d '8 0' t3
1296 $ hg tag -r 3 -m t3 -d '8 0' t3
1297 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1297 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1298 8: t3+5
1298 8: t3+5
1299 7: t3+4
1299 7: t3+4
1300 6: t3+3
1300 6: t3+3
1301 5: t3+2
1301 5: t3+2
1302 4: t3+1
1302 4: t3+1
1303 3: t3+0
1303 3: t3+0
1304 2: t2+0
1304 2: t2+0
1305 1: t1+0
1305 1: t1+0
1306 0: null+1
1306 0: null+1
1307
1307
1308 Merged tag overrides:
1308 Merged tag overrides:
1309
1309
1310 $ hg tag -r 5 -m t5 -d '9 0' t5
1310 $ hg tag -r 5 -m t5 -d '9 0' t5
1311 $ hg tag -r 3 -m at3 -d '10 0' at3
1311 $ hg tag -r 3 -m at3 -d '10 0' at3
1312 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1312 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
1313 10: t5+5
1313 10: t5+5
1314 9: t5+4
1314 9: t5+4
1315 8: t5+3
1315 8: t5+3
1316 7: t5+2
1316 7: t5+2
1317 6: t5+1
1317 6: t5+1
1318 5: t5+0
1318 5: t5+0
1319 4: at3:t3+1
1319 4: at3:t3+1
1320 3: at3:t3+0
1320 3: at3:t3+0
1321 2: t2+0
1321 2: t2+0
1322 1: t1+0
1322 1: t1+0
1323 0: null+1
1323 0: null+1
1324
1324
1325 $ cd ..
1325 $ cd ..
1326
1326
1327
1327
1328 Style path expansion: issue1948 - ui.style option doesn't work on OSX
1328 Style path expansion: issue1948 - ui.style option doesn't work on OSX
1329 if it is a relative path
1329 if it is a relative path
1330
1330
1331 $ mkdir -p home/styles
1331 $ mkdir -p home/styles
1332
1332
1333 $ cat > home/styles/teststyle <<EOF
1333 $ cat > home/styles/teststyle <<EOF
1334 > changeset = 'test {rev}:{node|short}\n'
1334 > changeset = 'test {rev}:{node|short}\n'
1335 > EOF
1335 > EOF
1336
1336
1337 $ HOME=`pwd`/home; export HOME
1337 $ HOME=`pwd`/home; export HOME
1338
1338
1339 $ cat > latesttag/.hg/hgrc <<EOF
1339 $ cat > latesttag/.hg/hgrc <<EOF
1340 > [ui]
1340 > [ui]
1341 > style = ~/styles/teststyle
1341 > style = ~/styles/teststyle
1342 > EOF
1342 > EOF
1343
1343
1344 $ hg -R latesttag tip
1344 $ hg -R latesttag tip
1345 test 10:dee8f28249af
1345 test 10:dee8f28249af
1346
1346
1347 Test recursive showlist template (issue1989):
1347 Test recursive showlist template (issue1989):
1348
1348
1349 $ cat > style1989 <<EOF
1349 $ cat > style1989 <<EOF
1350 > changeset = '{file_mods}{manifest}{extras}'
1350 > changeset = '{file_mods}{manifest}{extras}'
1351 > file_mod = 'M|{author|person}\n'
1351 > file_mod = 'M|{author|person}\n'
1352 > manifest = '{rev},{author}\n'
1352 > manifest = '{rev},{author}\n'
1353 > extra = '{key}: {author}\n'
1353 > extra = '{key}: {author}\n'
1354 > EOF
1354 > EOF
1355
1355
1356 $ hg -R latesttag log -r tip --style=style1989
1356 $ hg -R latesttag log -r tip --style=style1989
1357 M|test
1357 M|test
1358 10,test
1358 10,test
1359 branch: test
1359 branch: test
1360
1360
General Comments 0
You need to be logged in to leave comments. Login now