##// END OF EJS Templates
give better error message on non-existent mapfile (issue813)
Dirkjan Ochtman -
r6337:d2713d90 default
parent child Browse files
Show More
@@ -1,146 +1,150
1 1 # templater.py - template expansion for output
2 2 #
3 3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms
6 6 # of the GNU General Public License, incorporated herein by reference.
7 7
8 8 from i18n import _
9 9 import re, sys, os
10 from mercurial import util
10 11
11 12 def parsestring(s, quoted=True):
12 13 '''parse a string using simple c-like syntax.
13 14 string must be in quotes if quoted is True.'''
14 15 if quoted:
15 16 if len(s) < 2 or s[0] != s[-1]:
16 17 raise SyntaxError(_('unmatched quotes'))
17 18 return s[1:-1].decode('string_escape')
18 19
19 20 return s.decode('string_escape')
20 21
21 22 class templater(object):
22 23 '''template expansion engine.
23 24
24 25 template expansion works like this. a map file contains key=value
25 26 pairs. if value is quoted, it is treated as string. otherwise, it
26 27 is treated as name of template file.
27 28
28 29 templater is asked to expand a key in map. it looks up key, and
29 30 looks for strings like this: {foo}. it expands {foo} by looking up
30 31 foo in map, and substituting it. expansion is recursive: it stops
31 32 when there is no more {foo} to replace.
32 33
33 34 expansion also allows formatting and filtering.
34 35
35 36 format uses key to expand each item in list. syntax is
36 37 {key%format}.
37 38
38 39 filter uses function to transform value. syntax is
39 40 {key|filter1|filter2|...}.'''
40 41
41 42 template_re = re.compile(r"(?:(?:#(?=[\w\|%]+#))|(?:{(?=[\w\|%]+})))"
42 43 r"(\w+)(?:(?:%(\w+))|((?:\|\w+)*))[#}]")
43 44
44 45 def __init__(self, mapfile, filters={}, defaults={}, cache={}):
45 46 '''set up template engine.
46 47 mapfile is name of file to read map definitions from.
47 48 filters is dict of functions. each transforms a value into another.
48 49 defaults is dict of default map definitions.'''
49 50 self.mapfile = mapfile or 'template'
50 51 self.cache = cache.copy()
51 52 self.map = {}
52 53 self.base = (mapfile and os.path.dirname(mapfile)) or ''
53 54 self.filters = filters
54 55 self.defaults = defaults
55 56
56 57 if not mapfile:
57 58 return
59 if not os.path.exists(mapfile):
60 raise util.Abort(_('style not found: %s') % mapfile)
61
58 62 i = 0
59 63 for l in file(mapfile):
60 64 l = l.strip()
61 65 i += 1
62 66 if not l or l[0] in '#;': continue
63 67 m = re.match(r'([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*(.+)$', l)
64 68 if m:
65 69 key, val = m.groups()
66 70 if val[0] in "'\"":
67 71 try:
68 72 self.cache[key] = parsestring(val)
69 73 except SyntaxError, inst:
70 74 raise SyntaxError('%s:%s: %s' %
71 75 (mapfile, i, inst.args[0]))
72 76 else:
73 77 self.map[key] = os.path.join(self.base, val)
74 78 else:
75 79 raise SyntaxError(_("%s:%s: parse error") % (mapfile, i))
76 80
77 81 def __contains__(self, key):
78 82 return key in self.cache or key in self.map
79 83
80 84 def __call__(self, t, **map):
81 85 '''perform expansion.
82 86 t is name of map element to expand.
83 87 map is added elements to use during expansion.'''
84 88 if not t in self.cache:
85 89 try:
86 90 self.cache[t] = file(self.map[t]).read()
87 91 except IOError, inst:
88 92 raise IOError(inst.args[0], _('template file %s: %s') %
89 93 (self.map[t], inst.args[1]))
90 94 tmpl = self.cache[t]
91 95
92 96 while tmpl:
93 97 m = self.template_re.search(tmpl)
94 98 if not m:
95 99 yield tmpl
96 100 break
97 101
98 102 start, end = m.span(0)
99 103 key, format, fl = m.groups()
100 104
101 105 if start:
102 106 yield tmpl[:start]
103 107 tmpl = tmpl[end:]
104 108
105 109 if key in map:
106 110 v = map[key]
107 111 else:
108 112 v = self.defaults.get(key, "")
109 113 if callable(v):
110 114 v = v(**map)
111 115 if format:
112 116 if not hasattr(v, '__iter__'):
113 117 raise SyntaxError(_("Error expanding '%s%s'")
114 118 % (key, format))
115 119 lm = map.copy()
116 120 for i in v:
117 121 lm.update(i)
118 122 yield self(format, **lm)
119 123 else:
120 124 if fl:
121 125 for f in fl.split("|")[1:]:
122 126 v = self.filters[f](v)
123 127 yield v
124 128
125 129 def templatepath(name=None):
126 130 '''return location of template file or directory (if no name).
127 131 returns None if not found.'''
128 132
129 133 # executable version (py2exe) doesn't support __file__
130 134 if hasattr(sys, 'frozen'):
131 135 module = sys.executable
132 136 else:
133 137 module = __file__
134 138 for f in 'templates', '../templates':
135 139 fl = f.split('/')
136 140 if name: fl.append(name)
137 141 p = os.path.join(os.path.dirname(module), *fl)
138 142 if (name and os.path.exists(p)) or os.path.isdir(p):
139 143 return os.path.normpath(p)
140 144
141 145 def stringify(thing):
142 146 '''turn nested template iterator into string.'''
143 147 if hasattr(thing, '__iter__'):
144 148 return "".join([stringify(t) for t in thing if t is not None])
145 149 return str(thing)
146 150
@@ -1,573 +1,573
1 1 created new head
2 2 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
3 3 created new head
4 4 # default style is like normal output
5 5 # normal
6 6 # verbose
7 7 # debug
8 8 # revision with no copies (used to print a traceback)
9 9
10 10 # compact style works
11 11 7[tip]:-1 29114dbae42b 1970-01-12 13:46 +0000 user
12 12 second
13 13
14 14 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
15 15 merge
16 16
17 17 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
18 18 new head
19 19
20 20 4 32a18f097fcc 1970-01-17 04:53 +0000 person
21 21 new branch
22 22
23 23 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
24 24 no user, no domain
25 25
26 26 2 97054abb4ab8 1970-01-14 21:20 +0000 other
27 27 no person
28 28
29 29 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
30 30 other 1
31 31
32 32 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
33 33 line 1
34 34
35 35 7[tip]:-1 29114dbae42b 1970-01-12 13:46 +0000 user
36 36 second
37 37
38 38 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
39 39 merge
40 40
41 41 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
42 42 new head
43 43
44 44 4 32a18f097fcc 1970-01-17 04:53 +0000 person
45 45 new branch
46 46
47 47 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
48 48 no user, no domain
49 49
50 50 2 97054abb4ab8 1970-01-14 21:20 +0000 other
51 51 no person
52 52
53 53 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
54 54 other 1
55 55
56 56 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
57 57 line 1
58 58
59 59 7[tip]:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 user
60 60 second
61 61
62 62 6:5,4 c7b487c6c50e 1970-01-18 08:40 +0000 person
63 63 merge
64 64
65 65 5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
66 66 new head
67 67
68 68 4:3,-1 32a18f097fcc 1970-01-17 04:53 +0000 person
69 69 new branch
70 70
71 71 3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
72 72 no user, no domain
73 73
74 74 2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other
75 75 no person
76 76
77 77 1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
78 78 other 1
79 79
80 80 0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
81 81 line 1
82 82
83 83 # error if style not readable
84 84 abort: Permission denied: ./q
85 85 # error if no style
86 abort: No such file or directory: notexist
86 abort: style not found: notexist
87 87 # error if style missing key
88 88 abort: ./t: no key named 'changeset'
89 89 # error if include fails
90 90 abort: template file ./q: Permission denied
91 91 # include works
92 92 7
93 93 6
94 94 5
95 95 4
96 96 3
97 97 2
98 98 1
99 99 0
100 100 # ui.style works
101 101 7
102 102 6
103 103 5
104 104 4
105 105 3
106 106 2
107 107 1
108 108 0
109 109 # issue338
110 110 1970-01-12 User Name <user@hostname>
111 111
112 112 * second:
113 113 second
114 114 [29114dbae42b] [tip]
115 115
116 116 1970-01-18 person <person>
117 117
118 118 * merge
119 119 [c7b487c6c50e]
120 120
121 121 * d:
122 122 new head
123 123 [13207e5a10d9]
124 124
125 125 1970-01-17 person <person>
126 126
127 127 * new branch
128 128 [32a18f097fcc]
129 129
130 130 1970-01-16 person <person>
131 131
132 132 * c:
133 133 no user, no domain
134 134 [10e46f2dcbf4]
135 135
136 136 1970-01-14 other <other@place>
137 137
138 138 * c:
139 139 no person
140 140 [97054abb4ab8]
141 141
142 142 1970-01-13 A. N. Other <other@place>
143 143
144 144 * b:
145 145 other 1 other 2
146 146
147 147 other 3
148 148 [b608e9d1a3f0]
149 149
150 150 1970-01-12 User Name <user@hostname>
151 151
152 152 * a:
153 153 line 1 line 2
154 154 [1e4e1b8f71e0]
155 155
156 156 # keys work
157 157 author: User Name <user@hostname>
158 158 author: person
159 159 author: person
160 160 author: person
161 161 author: person
162 162 author: other@place
163 163 author: A. N. Other <other@place>
164 164 author: User Name <user@hostname>
165 165 author--verbose: User Name <user@hostname>
166 166 author--verbose: person
167 167 author--verbose: person
168 168 author--verbose: person
169 169 author--verbose: person
170 170 author--verbose: other@place
171 171 author--verbose: A. N. Other <other@place>
172 172 author--verbose: User Name <user@hostname>
173 173 author--debug: User Name <user@hostname>
174 174 author--debug: person
175 175 author--debug: person
176 176 author--debug: person
177 177 author--debug: person
178 178 author--debug: other@place
179 179 author--debug: A. N. Other <other@place>
180 180 author--debug: User Name <user@hostname>
181 181 branches:
182 182 branches:
183 183 branches:
184 184 branches: foo
185 185 branches:
186 186 branches:
187 187 branches:
188 188 branches:
189 189 branches--verbose:
190 190 branches--verbose:
191 191 branches--verbose:
192 192 branches--verbose: foo
193 193 branches--verbose:
194 194 branches--verbose:
195 195 branches--verbose:
196 196 branches--verbose:
197 197 branches--debug:
198 198 branches--debug:
199 199 branches--debug:
200 200 branches--debug: foo
201 201 branches--debug:
202 202 branches--debug:
203 203 branches--debug:
204 204 branches--debug:
205 205 date: 1000000.00
206 206 date: 1500001.00
207 207 date: 1500000.00
208 208 date: 1400000.00
209 209 date: 1300000.00
210 210 date: 1200000.00
211 211 date: 1100000.00
212 212 date: 1000000.00
213 213 date--verbose: 1000000.00
214 214 date--verbose: 1500001.00
215 215 date--verbose: 1500000.00
216 216 date--verbose: 1400000.00
217 217 date--verbose: 1300000.00
218 218 date--verbose: 1200000.00
219 219 date--verbose: 1100000.00
220 220 date--verbose: 1000000.00
221 221 date--debug: 1000000.00
222 222 date--debug: 1500001.00
223 223 date--debug: 1500000.00
224 224 date--debug: 1400000.00
225 225 date--debug: 1300000.00
226 226 date--debug: 1200000.00
227 227 date--debug: 1100000.00
228 228 date--debug: 1000000.00
229 229 desc: second
230 230 desc: merge
231 231 desc: new head
232 232 desc: new branch
233 233 desc: no user, no domain
234 234 desc: no person
235 235 desc: other 1
236 236 other 2
237 237
238 238 other 3
239 239 desc: line 1
240 240 line 2
241 241 desc--verbose: second
242 242 desc--verbose: merge
243 243 desc--verbose: new head
244 244 desc--verbose: new branch
245 245 desc--verbose: no user, no domain
246 246 desc--verbose: no person
247 247 desc--verbose: other 1
248 248 other 2
249 249
250 250 other 3
251 251 desc--verbose: line 1
252 252 line 2
253 253 desc--debug: second
254 254 desc--debug: merge
255 255 desc--debug: new head
256 256 desc--debug: new branch
257 257 desc--debug: no user, no domain
258 258 desc--debug: no person
259 259 desc--debug: other 1
260 260 other 2
261 261
262 262 other 3
263 263 desc--debug: line 1
264 264 line 2
265 265 file_adds: second
266 266 file_adds:
267 267 file_adds: d
268 268 file_adds:
269 269 file_adds:
270 270 file_adds: c
271 271 file_adds: b
272 272 file_adds: a
273 273 file_adds--verbose: second
274 274 file_adds--verbose:
275 275 file_adds--verbose: d
276 276 file_adds--verbose:
277 277 file_adds--verbose:
278 278 file_adds--verbose: c
279 279 file_adds--verbose: b
280 280 file_adds--verbose: a
281 281 file_adds--debug: second
282 282 file_adds--debug:
283 283 file_adds--debug: d
284 284 file_adds--debug:
285 285 file_adds--debug:
286 286 file_adds--debug: c
287 287 file_adds--debug: b
288 288 file_adds--debug: a
289 289 file_dels:
290 290 file_dels:
291 291 file_dels:
292 292 file_dels:
293 293 file_dels:
294 294 file_dels:
295 295 file_dels:
296 296 file_dels:
297 297 file_dels--verbose:
298 298 file_dels--verbose:
299 299 file_dels--verbose:
300 300 file_dels--verbose:
301 301 file_dels--verbose:
302 302 file_dels--verbose:
303 303 file_dels--verbose:
304 304 file_dels--verbose:
305 305 file_dels--debug:
306 306 file_dels--debug:
307 307 file_dels--debug:
308 308 file_dels--debug:
309 309 file_dels--debug:
310 310 file_dels--debug:
311 311 file_dels--debug:
312 312 file_dels--debug:
313 313 file_mods:
314 314 file_mods:
315 315 file_mods:
316 316 file_mods:
317 317 file_mods: c
318 318 file_mods:
319 319 file_mods:
320 320 file_mods:
321 321 file_mods--verbose:
322 322 file_mods--verbose:
323 323 file_mods--verbose:
324 324 file_mods--verbose:
325 325 file_mods--verbose: c
326 326 file_mods--verbose:
327 327 file_mods--verbose:
328 328 file_mods--verbose:
329 329 file_mods--debug:
330 330 file_mods--debug:
331 331 file_mods--debug:
332 332 file_mods--debug:
333 333 file_mods--debug: c
334 334 file_mods--debug:
335 335 file_mods--debug:
336 336 file_mods--debug:
337 337 files: second
338 338 files:
339 339 files: d
340 340 files:
341 341 files: c
342 342 files: c
343 343 files: b
344 344 files: a
345 345 files--verbose: second
346 346 files--verbose:
347 347 files--verbose: d
348 348 files--verbose:
349 349 files--verbose: c
350 350 files--verbose: c
351 351 files--verbose: b
352 352 files--verbose: a
353 353 files--debug: second
354 354 files--debug:
355 355 files--debug: d
356 356 files--debug:
357 357 files--debug: c
358 358 files--debug: c
359 359 files--debug: b
360 360 files--debug: a
361 361 manifest: 7:f2dbc354b94e
362 362 manifest: 6:91015e9dbdd7
363 363 manifest: 5:4dc3def4f9b4
364 364 manifest: 4:90ae8dda64e1
365 365 manifest: 3:cb5a1327723b
366 366 manifest: 2:6e0e82995c35
367 367 manifest: 1:4e8d705b1e53
368 368 manifest: 0:a0c8bcbbb45c
369 369 manifest--verbose: 7:f2dbc354b94e
370 370 manifest--verbose: 6:91015e9dbdd7
371 371 manifest--verbose: 5:4dc3def4f9b4
372 372 manifest--verbose: 4:90ae8dda64e1
373 373 manifest--verbose: 3:cb5a1327723b
374 374 manifest--verbose: 2:6e0e82995c35
375 375 manifest--verbose: 1:4e8d705b1e53
376 376 manifest--verbose: 0:a0c8bcbbb45c
377 377 manifest--debug: 7:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
378 378 manifest--debug: 6:91015e9dbdd76a6791085d12b0a0ec7fcd22ffbf
379 379 manifest--debug: 5:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
380 380 manifest--debug: 4:90ae8dda64e1a876c792bccb9af66284f6018363
381 381 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
382 382 manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
383 383 manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
384 384 manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
385 385 node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
386 386 node: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
387 387 node: 13207e5a10d9fd28ec424934298e176197f2c67f
388 388 node: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
389 389 node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
390 390 node: 97054abb4ab824450e9164180baf491ae0078465
391 391 node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
392 392 node: 1e4e1b8f71e05681d422154f5421e385fec3454f
393 393 node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
394 394 node--verbose: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
395 395 node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
396 396 node--verbose: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
397 397 node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
398 398 node--verbose: 97054abb4ab824450e9164180baf491ae0078465
399 399 node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
400 400 node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
401 401 node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
402 402 node--debug: c7b487c6c50ef1cf464cafdc4f4f5e615fc5999f
403 403 node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
404 404 node--debug: 32a18f097fcccf76ef282f62f8a85b3adf8d13c4
405 405 node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
406 406 node--debug: 97054abb4ab824450e9164180baf491ae0078465
407 407 node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
408 408 node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
409 409 parents: -1:000000000000
410 410 parents: 5:13207e5a10d9 4:32a18f097fcc
411 411 parents: 3:10e46f2dcbf4
412 412 parents:
413 413 parents:
414 414 parents:
415 415 parents:
416 416 parents:
417 417 parents--verbose: -1:000000000000
418 418 parents--verbose: 5:13207e5a10d9 4:32a18f097fcc
419 419 parents--verbose: 3:10e46f2dcbf4
420 420 parents--verbose:
421 421 parents--verbose:
422 422 parents--verbose:
423 423 parents--verbose:
424 424 parents--verbose:
425 425 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
426 426 parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:32a18f097fcccf76ef282f62f8a85b3adf8d13c4
427 427 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
428 428 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
429 429 parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000
430 430 parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000
431 431 parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000
432 432 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
433 433 rev: 7
434 434 rev: 6
435 435 rev: 5
436 436 rev: 4
437 437 rev: 3
438 438 rev: 2
439 439 rev: 1
440 440 rev: 0
441 441 rev--verbose: 7
442 442 rev--verbose: 6
443 443 rev--verbose: 5
444 444 rev--verbose: 4
445 445 rev--verbose: 3
446 446 rev--verbose: 2
447 447 rev--verbose: 1
448 448 rev--verbose: 0
449 449 rev--debug: 7
450 450 rev--debug: 6
451 451 rev--debug: 5
452 452 rev--debug: 4
453 453 rev--debug: 3
454 454 rev--debug: 2
455 455 rev--debug: 1
456 456 rev--debug: 0
457 457 tags: tip
458 458 tags:
459 459 tags:
460 460 tags:
461 461 tags:
462 462 tags:
463 463 tags:
464 464 tags:
465 465 tags--verbose: tip
466 466 tags--verbose:
467 467 tags--verbose:
468 468 tags--verbose:
469 469 tags--verbose:
470 470 tags--verbose:
471 471 tags--verbose:
472 472 tags--verbose:
473 473 tags--debug: tip
474 474 tags--debug:
475 475 tags--debug:
476 476 tags--debug:
477 477 tags--debug:
478 478 tags--debug:
479 479 tags--debug:
480 480 tags--debug:
481 481 # filters work
482 482 hostname
483 483
484 484
485 485
486 486
487 487 place
488 488 place
489 489 hostname
490 490 User Name
491 491 person
492 492 person
493 493 person
494 494 person
495 495 other
496 496 A. N. Other
497 497 User Name
498 498 user
499 499 person
500 500 person
501 501 person
502 502 person
503 503 other
504 504 other
505 505 user
506 506 Mon Jan 12 13:46:40 1970 +0000
507 507 Sun Jan 18 08:40:01 1970 +0000
508 508 Sun Jan 18 08:40:00 1970 +0000
509 509 Sat Jan 17 04:53:20 1970 +0000
510 510 Fri Jan 16 01:06:40 1970 +0000
511 511 Wed Jan 14 21:20:00 1970 +0000
512 512 Tue Jan 13 17:33:20 1970 +0000
513 513 Mon Jan 12 13:46:40 1970 +0000
514 514 1970-01-12 13:46 +0000
515 515 1970-01-18 08:40 +0000
516 516 1970-01-18 08:40 +0000
517 517 1970-01-17 04:53 +0000
518 518 1970-01-16 01:06 +0000
519 519 1970-01-14 21:20 +0000
520 520 1970-01-13 17:33 +0000
521 521 1970-01-12 13:46 +0000
522 522 1970-01-12 13:46:40 +0000
523 523 1970-01-18 08:40:01 +0000
524 524 1970-01-18 08:40:00 +0000
525 525 1970-01-17 04:53:20 +0000
526 526 1970-01-16 01:06:40 +0000
527 527 1970-01-14 21:20:00 +0000
528 528 1970-01-13 17:33:20 +0000
529 529 1970-01-12 13:46:40 +0000
530 530 Mon, 12 Jan 1970 13:46:40 +0000
531 531 Sun, 18 Jan 1970 08:40:01 +0000
532 532 Sun, 18 Jan 1970 08:40:00 +0000
533 533 Sat, 17 Jan 1970 04:53:20 +0000
534 534 Fri, 16 Jan 1970 01:06:40 +0000
535 535 Wed, 14 Jan 1970 21:20:00 +0000
536 536 Tue, 13 Jan 1970 17:33:20 +0000
537 537 Mon, 12 Jan 1970 13:46:40 +0000
538 538 second
539 539 merge
540 540 new head
541 541 new branch
542 542 no user, no domain
543 543 no person
544 544 other 1
545 545 line 1
546 546 29114dbae42b
547 547 c7b487c6c50e
548 548 13207e5a10d9
549 549 32a18f097fcc
550 550 10e46f2dcbf4
551 551 97054abb4ab8
552 552 b608e9d1a3f0
553 553 1e4e1b8f71e0
554 554 <changeset author="User Name &lt;user@hostname&gt;"/>
555 555 <changeset author="person"/>
556 556 <changeset author="person"/>
557 557 <changeset author="person"/>
558 558 <changeset author="person"/>
559 559 <changeset author="other@place"/>
560 560 <changeset author="A. N. Other &lt;other@place&gt;"/>
561 561 <changeset author="User Name &lt;user@hostname&gt;"/>
562 562 # formatnode filter works
563 563 # quiet
564 564 1e4e1b8f71e0
565 565 # normal
566 566 1e4e1b8f71e0
567 567 # verbose
568 568 1e4e1b8f71e0
569 569 # debug
570 570 1e4e1b8f71e05681d422154f5421e385fec3454f
571 571 # error on syntax
572 572 abort: t:3: unmatched quotes
573 573 # done
General Comments 0
You need to be logged in to leave comments. Login now