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