##// END OF EJS Templates
Merge with crew-stable
Martin Geisler -
r9404:4483af16 merge default
parent child Browse files
Show More
@@ -1,690 +1,698
1 #
1 #
2 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
2 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 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, incorporated herein by reference.
6 # GNU General Public License version 2, incorporated herein by reference.
7
7
8 import os, mimetypes, re, cgi, copy
8 import os, mimetypes, re, cgi, copy
9 import webutil
9 import webutil
10 from mercurial import error, archival, templater, templatefilters
10 from mercurial import error, archival, templater, templatefilters
11 from mercurial.node import short, hex
11 from mercurial.node import short, hex
12 from mercurial.util import binary
12 from mercurial.util import binary
13 from common import paritygen, staticfile, get_contact, ErrorResponse
13 from common import paritygen, staticfile, get_contact, ErrorResponse
14 from common import HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND
14 from common import HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND
15 from mercurial import graphmod
15 from mercurial import graphmod
16
16
17 # __all__ is populated with the allowed commands. Be sure to add to it if
17 # __all__ is populated with the allowed commands. Be sure to add to it if
18 # you're adding a new command, or the new command won't work.
18 # you're adding a new command, or the new command won't work.
19
19
20 __all__ = [
20 __all__ = [
21 'log', 'rawfile', 'file', 'changelog', 'shortlog', 'changeset', 'rev',
21 'log', 'rawfile', 'file', 'changelog', 'shortlog', 'changeset', 'rev',
22 'manifest', 'tags', 'branches', 'summary', 'filediff', 'diff', 'annotate',
22 'manifest', 'tags', 'branches', 'summary', 'filediff', 'diff', 'annotate',
23 'filelog', 'archive', 'static', 'graph',
23 'filelog', 'archive', 'static', 'graph',
24 ]
24 ]
25
25
26 def log(web, req, tmpl):
26 def log(web, req, tmpl):
27 if 'file' in req.form and req.form['file'][0]:
27 if 'file' in req.form and req.form['file'][0]:
28 return filelog(web, req, tmpl)
28 return filelog(web, req, tmpl)
29 else:
29 else:
30 return changelog(web, req, tmpl)
30 return changelog(web, req, tmpl)
31
31
32 def rawfile(web, req, tmpl):
32 def rawfile(web, req, tmpl):
33 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
33 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
34 if not path:
34 if not path:
35 content = manifest(web, req, tmpl)
35 content = manifest(web, req, tmpl)
36 req.respond(HTTP_OK, web.ctype)
36 req.respond(HTTP_OK, web.ctype)
37 return content
37 return content
38
38
39 try:
39 try:
40 fctx = webutil.filectx(web.repo, req)
40 fctx = webutil.filectx(web.repo, req)
41 except error.LookupError, inst:
41 except error.LookupError, inst:
42 try:
42 try:
43 content = manifest(web, req, tmpl)
43 content = manifest(web, req, tmpl)
44 req.respond(HTTP_OK, web.ctype)
44 req.respond(HTTP_OK, web.ctype)
45 return content
45 return content
46 except ErrorResponse:
46 except ErrorResponse:
47 raise inst
47 raise inst
48
48
49 path = fctx.path()
49 path = fctx.path()
50 text = fctx.data()
50 text = fctx.data()
51 mt = mimetypes.guess_type(path)[0]
51 mt = mimetypes.guess_type(path)[0]
52 if mt is None:
52 if mt is None:
53 mt = binary(text) and 'application/octet-stream' or 'text/plain'
53 mt = binary(text) and 'application/octet-stream' or 'text/plain'
54
54
55 req.respond(HTTP_OK, mt, path, len(text))
55 req.respond(HTTP_OK, mt, path, len(text))
56 return [text]
56 return [text]
57
57
58 def _filerevision(web, tmpl, fctx):
58 def _filerevision(web, tmpl, fctx):
59 f = fctx.path()
59 f = fctx.path()
60 text = fctx.data()
60 text = fctx.data()
61 parity = paritygen(web.stripecount)
61 parity = paritygen(web.stripecount)
62
62
63 if binary(text):
63 if binary(text):
64 mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
64 mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
65 text = '(binary:%s)' % mt
65 text = '(binary:%s)' % mt
66
66
67 def lines():
67 def lines():
68 for lineno, t in enumerate(text.splitlines(True)):
68 for lineno, t in enumerate(text.splitlines(True)):
69 yield {"line": t,
69 yield {"line": t,
70 "lineid": "l%d" % (lineno + 1),
70 "lineid": "l%d" % (lineno + 1),
71 "linenumber": "% 6d" % (lineno + 1),
71 "linenumber": "% 6d" % (lineno + 1),
72 "parity": parity.next()}
72 "parity": parity.next()}
73
73
74 return tmpl("filerevision",
74 return tmpl("filerevision",
75 file=f,
75 file=f,
76 path=webutil.up(f),
76 path=webutil.up(f),
77 text=lines(),
77 text=lines(),
78 rev=fctx.rev(),
78 rev=fctx.rev(),
79 node=hex(fctx.node()),
79 node=hex(fctx.node()),
80 author=fctx.user(),
80 author=fctx.user(),
81 date=fctx.date(),
81 date=fctx.date(),
82 desc=fctx.description(),
82 desc=fctx.description(),
83 branch=webutil.nodebranchnodefault(fctx),
83 branch=webutil.nodebranchnodefault(fctx),
84 parent=webutil.parents(fctx),
84 parent=webutil.parents(fctx),
85 child=webutil.children(fctx),
85 child=webutil.children(fctx),
86 rename=webutil.renamelink(fctx),
86 rename=webutil.renamelink(fctx),
87 permissions=fctx.manifest().flags(f))
87 permissions=fctx.manifest().flags(f))
88
88
89 def file(web, req, tmpl):
89 def file(web, req, tmpl):
90 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
90 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
91 if not path:
91 if not path:
92 return manifest(web, req, tmpl)
92 return manifest(web, req, tmpl)
93 try:
93 try:
94 return _filerevision(web, tmpl, webutil.filectx(web.repo, req))
94 return _filerevision(web, tmpl, webutil.filectx(web.repo, req))
95 except error.LookupError, inst:
95 except error.LookupError, inst:
96 try:
96 try:
97 return manifest(web, req, tmpl)
97 return manifest(web, req, tmpl)
98 except ErrorResponse:
98 except ErrorResponse:
99 raise inst
99 raise inst
100
100
101 def _search(web, tmpl, query):
101 def _search(web, tmpl, query):
102
102
103 def changelist(**map):
103 def changelist(**map):
104 cl = web.repo.changelog
104 cl = web.repo.changelog
105 count = 0
105 count = 0
106 qw = query.lower().split()
106 qw = query.lower().split()
107
107
108 def revgen():
108 def revgen():
109 for i in xrange(len(cl) - 1, 0, -100):
109 for i in xrange(len(cl) - 1, 0, -100):
110 l = []
110 l = []
111 for j in xrange(max(0, i - 100), i + 1):
111 for j in xrange(max(0, i - 100), i + 1):
112 ctx = web.repo[j]
112 ctx = web.repo[j]
113 l.append(ctx)
113 l.append(ctx)
114 l.reverse()
114 l.reverse()
115 for e in l:
115 for e in l:
116 yield e
116 yield e
117
117
118 for ctx in revgen():
118 for ctx in revgen():
119 miss = 0
119 miss = 0
120 for q in qw:
120 for q in qw:
121 if not (q in ctx.user().lower() or
121 if not (q in ctx.user().lower() or
122 q in ctx.description().lower() or
122 q in ctx.description().lower() or
123 q in " ".join(ctx.files()).lower()):
123 q in " ".join(ctx.files()).lower()):
124 miss = 1
124 miss = 1
125 break
125 break
126 if miss:
126 if miss:
127 continue
127 continue
128
128
129 count += 1
129 count += 1
130 n = ctx.node()
130 n = ctx.node()
131 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
131 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
132 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
132 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
133
133
134 yield tmpl('searchentry',
134 yield tmpl('searchentry',
135 parity=parity.next(),
135 parity=parity.next(),
136 author=ctx.user(),
136 author=ctx.user(),
137 parent=webutil.parents(ctx),
137 parent=webutil.parents(ctx),
138 child=webutil.children(ctx),
138 child=webutil.children(ctx),
139 changelogtag=showtags,
139 changelogtag=showtags,
140 desc=ctx.description(),
140 desc=ctx.description(),
141 date=ctx.date(),
141 date=ctx.date(),
142 files=files,
142 files=files,
143 rev=ctx.rev(),
143 rev=ctx.rev(),
144 node=hex(n),
144 node=hex(n),
145 tags=webutil.nodetagsdict(web.repo, n),
145 tags=webutil.nodetagsdict(web.repo, n),
146 inbranch=webutil.nodeinbranch(web.repo, ctx),
146 inbranch=webutil.nodeinbranch(web.repo, ctx),
147 branches=webutil.nodebranchdict(web.repo, ctx))
147 branches=webutil.nodebranchdict(web.repo, ctx))
148
148
149 if count >= web.maxchanges:
149 if count >= web.maxchanges:
150 break
150 break
151
151
152 cl = web.repo.changelog
152 cl = web.repo.changelog
153 parity = paritygen(web.stripecount)
153 parity = paritygen(web.stripecount)
154
154
155 return tmpl('search',
155 return tmpl('search',
156 query=query,
156 query=query,
157 node=hex(cl.tip()),
157 node=hex(cl.tip()),
158 entries=changelist,
158 entries=changelist,
159 archives=web.archivelist("tip"))
159 archives=web.archivelist("tip"))
160
160
161 def changelog(web, req, tmpl, shortlog = False):
161 def changelog(web, req, tmpl, shortlog = False):
162 if 'node' in req.form:
162 if 'node' in req.form:
163 ctx = webutil.changectx(web.repo, req)
163 ctx = webutil.changectx(web.repo, req)
164 else:
164 else:
165 if 'rev' in req.form:
165 if 'rev' in req.form:
166 hi = req.form['rev'][0]
166 hi = req.form['rev'][0]
167 else:
167 else:
168 hi = len(web.repo) - 1
168 hi = len(web.repo) - 1
169 try:
169 try:
170 ctx = web.repo[hi]
170 ctx = web.repo[hi]
171 except error.RepoError:
171 except error.RepoError:
172 return _search(web, tmpl, hi) # XXX redirect to 404 page?
172 return _search(web, tmpl, hi) # XXX redirect to 404 page?
173
173
174 def changelist(limit=0, **map):
174 def changelist(limit=0, **map):
175 l = [] # build a list in forward order for efficiency
175 l = [] # build a list in forward order for efficiency
176 for i in xrange(start, end):
176 for i in xrange(start, end):
177 ctx = web.repo[i]
177 ctx = web.repo[i]
178 n = ctx.node()
178 n = ctx.node()
179 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
179 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
180 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
180 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
181
181
182 l.insert(0, {"parity": parity.next(),
182 l.insert(0, {"parity": parity.next(),
183 "author": ctx.user(),
183 "author": ctx.user(),
184 "parent": webutil.parents(ctx, i - 1),
184 "parent": webutil.parents(ctx, i - 1),
185 "child": webutil.children(ctx, i + 1),
185 "child": webutil.children(ctx, i + 1),
186 "changelogtag": showtags,
186 "changelogtag": showtags,
187 "desc": ctx.description(),
187 "desc": ctx.description(),
188 "date": ctx.date(),
188 "date": ctx.date(),
189 "files": files,
189 "files": files,
190 "rev": i,
190 "rev": i,
191 "node": hex(n),
191 "node": hex(n),
192 "tags": webutil.nodetagsdict(web.repo, n),
192 "tags": webutil.nodetagsdict(web.repo, n),
193 "inbranch": webutil.nodeinbranch(web.repo, ctx),
193 "inbranch": webutil.nodeinbranch(web.repo, ctx),
194 "branches": webutil.nodebranchdict(web.repo, ctx)
194 "branches": webutil.nodebranchdict(web.repo, ctx)
195 })
195 })
196
196
197 if limit > 0:
197 if limit > 0:
198 l = l[:limit]
198 l = l[:limit]
199
199
200 for e in l:
200 for e in l:
201 yield e
201 yield e
202
202
203 maxchanges = shortlog and web.maxshortchanges or web.maxchanges
203 maxchanges = shortlog and web.maxshortchanges or web.maxchanges
204 cl = web.repo.changelog
204 cl = web.repo.changelog
205 count = len(cl)
205 count = len(cl)
206 pos = ctx.rev()
206 pos = ctx.rev()
207 start = max(0, pos - maxchanges + 1)
207 start = max(0, pos - maxchanges + 1)
208 end = min(count, start + maxchanges)
208 end = min(count, start + maxchanges)
209 pos = end - 1
209 pos = end - 1
210 parity = paritygen(web.stripecount, offset=start-end)
210 parity = paritygen(web.stripecount, offset=start-end)
211
211
212 changenav = webutil.revnavgen(pos, maxchanges, count, web.repo.changectx)
212 changenav = webutil.revnavgen(pos, maxchanges, count, web.repo.changectx)
213
213
214 return tmpl(shortlog and 'shortlog' or 'changelog',
214 return tmpl(shortlog and 'shortlog' or 'changelog',
215 changenav=changenav,
215 changenav=changenav,
216 node=hex(ctx.node()),
216 node=hex(ctx.node()),
217 rev=pos, changesets=count,
217 rev=pos, changesets=count,
218 entries=lambda **x: changelist(limit=0,**x),
218 entries=lambda **x: changelist(limit=0,**x),
219 latestentry=lambda **x: changelist(limit=1,**x),
219 latestentry=lambda **x: changelist(limit=1,**x),
220 archives=web.archivelist("tip"))
220 archives=web.archivelist("tip"))
221
221
222 def shortlog(web, req, tmpl):
222 def shortlog(web, req, tmpl):
223 return changelog(web, req, tmpl, shortlog = True)
223 return changelog(web, req, tmpl, shortlog = True)
224
224
225 def changeset(web, req, tmpl):
225 def changeset(web, req, tmpl):
226 ctx = webutil.changectx(web.repo, req)
226 ctx = webutil.changectx(web.repo, req)
227 showtags = webutil.showtag(web.repo, tmpl, 'changesettag', ctx.node())
227 showtags = webutil.showtag(web.repo, tmpl, 'changesettag', ctx.node())
228 showbranch = webutil.nodebranchnodefault(ctx)
228 showbranch = webutil.nodebranchnodefault(ctx)
229
229
230 files = []
230 files = []
231 parity = paritygen(web.stripecount)
231 parity = paritygen(web.stripecount)
232 for f in ctx.files():
232 for f in ctx.files():
233 template = f in ctx and 'filenodelink' or 'filenolink'
233 template = f in ctx and 'filenodelink' or 'filenolink'
234 files.append(tmpl(template,
234 files.append(tmpl(template,
235 node=ctx.hex(), file=f,
235 node=ctx.hex(), file=f,
236 parity=parity.next()))
236 parity=parity.next()))
237
237
238 parity = paritygen(web.stripecount)
238 parity = paritygen(web.stripecount)
239 diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity)
239 style = web.config('web', 'style', 'paper')
240 if 'style' in req.form:
241 style = req.form['style'][0]
242
243 diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
240 return tmpl('changeset',
244 return tmpl('changeset',
241 diff=diffs,
245 diff=diffs,
242 rev=ctx.rev(),
246 rev=ctx.rev(),
243 node=ctx.hex(),
247 node=ctx.hex(),
244 parent=webutil.parents(ctx),
248 parent=webutil.parents(ctx),
245 child=webutil.children(ctx),
249 child=webutil.children(ctx),
246 changesettag=showtags,
250 changesettag=showtags,
247 changesetbranch=showbranch,
251 changesetbranch=showbranch,
248 author=ctx.user(),
252 author=ctx.user(),
249 desc=ctx.description(),
253 desc=ctx.description(),
250 date=ctx.date(),
254 date=ctx.date(),
251 files=files,
255 files=files,
252 archives=web.archivelist(ctx.hex()),
256 archives=web.archivelist(ctx.hex()),
253 tags=webutil.nodetagsdict(web.repo, ctx.node()),
257 tags=webutil.nodetagsdict(web.repo, ctx.node()),
254 branch=webutil.nodebranchnodefault(ctx),
258 branch=webutil.nodebranchnodefault(ctx),
255 inbranch=webutil.nodeinbranch(web.repo, ctx),
259 inbranch=webutil.nodeinbranch(web.repo, ctx),
256 branches=webutil.nodebranchdict(web.repo, ctx))
260 branches=webutil.nodebranchdict(web.repo, ctx))
257
261
258 rev = changeset
262 rev = changeset
259
263
260 def manifest(web, req, tmpl):
264 def manifest(web, req, tmpl):
261 ctx = webutil.changectx(web.repo, req)
265 ctx = webutil.changectx(web.repo, req)
262 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
266 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
263 mf = ctx.manifest()
267 mf = ctx.manifest()
264 node = ctx.node()
268 node = ctx.node()
265
269
266 files = {}
270 files = {}
267 dirs = {}
271 dirs = {}
268 parity = paritygen(web.stripecount)
272 parity = paritygen(web.stripecount)
269
273
270 if path and path[-1] != "/":
274 if path and path[-1] != "/":
271 path += "/"
275 path += "/"
272 l = len(path)
276 l = len(path)
273 abspath = "/" + path
277 abspath = "/" + path
274
278
275 for f, n in mf.iteritems():
279 for f, n in mf.iteritems():
276 if f[:l] != path:
280 if f[:l] != path:
277 continue
281 continue
278 remain = f[l:]
282 remain = f[l:]
279 elements = remain.split('/')
283 elements = remain.split('/')
280 if len(elements) == 1:
284 if len(elements) == 1:
281 files[remain] = f
285 files[remain] = f
282 else:
286 else:
283 h = dirs # need to retain ref to dirs (root)
287 h = dirs # need to retain ref to dirs (root)
284 for elem in elements[0:-1]:
288 for elem in elements[0:-1]:
285 if elem not in h:
289 if elem not in h:
286 h[elem] = {}
290 h[elem] = {}
287 h = h[elem]
291 h = h[elem]
288 if len(h) > 1:
292 if len(h) > 1:
289 break
293 break
290 h[None] = None # denotes files present
294 h[None] = None # denotes files present
291
295
292 if mf and not files and not dirs:
296 if mf and not files and not dirs:
293 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
297 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
294
298
295 def filelist(**map):
299 def filelist(**map):
296 for f in sorted(files):
300 for f in sorted(files):
297 full = files[f]
301 full = files[f]
298
302
299 fctx = ctx.filectx(full)
303 fctx = ctx.filectx(full)
300 yield {"file": full,
304 yield {"file": full,
301 "parity": parity.next(),
305 "parity": parity.next(),
302 "basename": f,
306 "basename": f,
303 "date": fctx.date(),
307 "date": fctx.date(),
304 "size": fctx.size(),
308 "size": fctx.size(),
305 "permissions": mf.flags(full)}
309 "permissions": mf.flags(full)}
306
310
307 def dirlist(**map):
311 def dirlist(**map):
308 for d in sorted(dirs):
312 for d in sorted(dirs):
309
313
310 emptydirs = []
314 emptydirs = []
311 h = dirs[d]
315 h = dirs[d]
312 while isinstance(h, dict) and len(h) == 1:
316 while isinstance(h, dict) and len(h) == 1:
313 k,v = h.items()[0]
317 k,v = h.items()[0]
314 if v:
318 if v:
315 emptydirs.append(k)
319 emptydirs.append(k)
316 h = v
320 h = v
317
321
318 path = "%s%s" % (abspath, d)
322 path = "%s%s" % (abspath, d)
319 yield {"parity": parity.next(),
323 yield {"parity": parity.next(),
320 "path": path,
324 "path": path,
321 "emptydirs": "/".join(emptydirs),
325 "emptydirs": "/".join(emptydirs),
322 "basename": d}
326 "basename": d}
323
327
324 return tmpl("manifest",
328 return tmpl("manifest",
325 rev=ctx.rev(),
329 rev=ctx.rev(),
326 node=hex(node),
330 node=hex(node),
327 path=abspath,
331 path=abspath,
328 up=webutil.up(abspath),
332 up=webutil.up(abspath),
329 upparity=parity.next(),
333 upparity=parity.next(),
330 fentries=filelist,
334 fentries=filelist,
331 dentries=dirlist,
335 dentries=dirlist,
332 archives=web.archivelist(hex(node)),
336 archives=web.archivelist(hex(node)),
333 tags=webutil.nodetagsdict(web.repo, node),
337 tags=webutil.nodetagsdict(web.repo, node),
334 inbranch=webutil.nodeinbranch(web.repo, ctx),
338 inbranch=webutil.nodeinbranch(web.repo, ctx),
335 branches=webutil.nodebranchdict(web.repo, ctx))
339 branches=webutil.nodebranchdict(web.repo, ctx))
336
340
337 def tags(web, req, tmpl):
341 def tags(web, req, tmpl):
338 i = web.repo.tagslist()
342 i = web.repo.tagslist()
339 i.reverse()
343 i.reverse()
340 parity = paritygen(web.stripecount)
344 parity = paritygen(web.stripecount)
341
345
342 def entries(notip=False, limit=0, **map):
346 def entries(notip=False, limit=0, **map):
343 count = 0
347 count = 0
344 for k, n in i:
348 for k, n in i:
345 if notip and k == "tip":
349 if notip and k == "tip":
346 continue
350 continue
347 if limit > 0 and count >= limit:
351 if limit > 0 and count >= limit:
348 continue
352 continue
349 count = count + 1
353 count = count + 1
350 yield {"parity": parity.next(),
354 yield {"parity": parity.next(),
351 "tag": k,
355 "tag": k,
352 "date": web.repo[n].date(),
356 "date": web.repo[n].date(),
353 "node": hex(n)}
357 "node": hex(n)}
354
358
355 return tmpl("tags",
359 return tmpl("tags",
356 node=hex(web.repo.changelog.tip()),
360 node=hex(web.repo.changelog.tip()),
357 entries=lambda **x: entries(False,0, **x),
361 entries=lambda **x: entries(False,0, **x),
358 entriesnotip=lambda **x: entries(True,0, **x),
362 entriesnotip=lambda **x: entries(True,0, **x),
359 latestentry=lambda **x: entries(True,1, **x))
363 latestentry=lambda **x: entries(True,1, **x))
360
364
361 def branches(web, req, tmpl):
365 def branches(web, req, tmpl):
362 b = web.repo.branchtags()
366 b = web.repo.branchtags()
363 tips = (web.repo[n] for t, n in web.repo.branchtags().iteritems())
367 tips = (web.repo[n] for t, n in web.repo.branchtags().iteritems())
364 heads = web.repo.heads()
368 heads = web.repo.heads()
365 parity = paritygen(web.stripecount)
369 parity = paritygen(web.stripecount)
366 sortkey = lambda ctx: ('close' not in ctx.extra(), ctx.rev())
370 sortkey = lambda ctx: ('close' not in ctx.extra(), ctx.rev())
367
371
368 def entries(limit, **map):
372 def entries(limit, **map):
369 count = 0
373 count = 0
370 for ctx in sorted(tips, key=sortkey, reverse=True):
374 for ctx in sorted(tips, key=sortkey, reverse=True):
371 if limit > 0 and count >= limit:
375 if limit > 0 and count >= limit:
372 return
376 return
373 count += 1
377 count += 1
374 if ctx.node() not in heads:
378 if ctx.node() not in heads:
375 status = 'inactive'
379 status = 'inactive'
376 elif not web.repo.branchheads(ctx.branch()):
380 elif not web.repo.branchheads(ctx.branch()):
377 status = 'closed'
381 status = 'closed'
378 else:
382 else:
379 status = 'open'
383 status = 'open'
380 yield {'parity': parity.next(),
384 yield {'parity': parity.next(),
381 'branch': ctx.branch(),
385 'branch': ctx.branch(),
382 'status': status,
386 'status': status,
383 'node': ctx.hex(),
387 'node': ctx.hex(),
384 'date': ctx.date()}
388 'date': ctx.date()}
385
389
386 return tmpl('branches', node=hex(web.repo.changelog.tip()),
390 return tmpl('branches', node=hex(web.repo.changelog.tip()),
387 entries=lambda **x: entries(0, **x),
391 entries=lambda **x: entries(0, **x),
388 latestentry=lambda **x: entries(1, **x))
392 latestentry=lambda **x: entries(1, **x))
389
393
390 def summary(web, req, tmpl):
394 def summary(web, req, tmpl):
391 i = web.repo.tagslist()
395 i = web.repo.tagslist()
392 i.reverse()
396 i.reverse()
393
397
394 def tagentries(**map):
398 def tagentries(**map):
395 parity = paritygen(web.stripecount)
399 parity = paritygen(web.stripecount)
396 count = 0
400 count = 0
397 for k, n in i:
401 for k, n in i:
398 if k == "tip": # skip tip
402 if k == "tip": # skip tip
399 continue
403 continue
400
404
401 count += 1
405 count += 1
402 if count > 10: # limit to 10 tags
406 if count > 10: # limit to 10 tags
403 break
407 break
404
408
405 yield tmpl("tagentry",
409 yield tmpl("tagentry",
406 parity=parity.next(),
410 parity=parity.next(),
407 tag=k,
411 tag=k,
408 node=hex(n),
412 node=hex(n),
409 date=web.repo[n].date())
413 date=web.repo[n].date())
410
414
411 def branches(**map):
415 def branches(**map):
412 parity = paritygen(web.stripecount)
416 parity = paritygen(web.stripecount)
413
417
414 b = web.repo.branchtags()
418 b = web.repo.branchtags()
415 l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()]
419 l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()]
416 for r,n,t in sorted(l):
420 for r,n,t in sorted(l):
417 yield {'parity': parity.next(),
421 yield {'parity': parity.next(),
418 'branch': t,
422 'branch': t,
419 'node': hex(n),
423 'node': hex(n),
420 'date': web.repo[n].date()}
424 'date': web.repo[n].date()}
421
425
422 def changelist(**map):
426 def changelist(**map):
423 parity = paritygen(web.stripecount, offset=start-end)
427 parity = paritygen(web.stripecount, offset=start-end)
424 l = [] # build a list in forward order for efficiency
428 l = [] # build a list in forward order for efficiency
425 for i in xrange(start, end):
429 for i in xrange(start, end):
426 ctx = web.repo[i]
430 ctx = web.repo[i]
427 n = ctx.node()
431 n = ctx.node()
428 hn = hex(n)
432 hn = hex(n)
429
433
430 l.insert(0, tmpl(
434 l.insert(0, tmpl(
431 'shortlogentry',
435 'shortlogentry',
432 parity=parity.next(),
436 parity=parity.next(),
433 author=ctx.user(),
437 author=ctx.user(),
434 desc=ctx.description(),
438 desc=ctx.description(),
435 date=ctx.date(),
439 date=ctx.date(),
436 rev=i,
440 rev=i,
437 node=hn,
441 node=hn,
438 tags=webutil.nodetagsdict(web.repo, n),
442 tags=webutil.nodetagsdict(web.repo, n),
439 inbranch=webutil.nodeinbranch(web.repo, ctx),
443 inbranch=webutil.nodeinbranch(web.repo, ctx),
440 branches=webutil.nodebranchdict(web.repo, ctx)))
444 branches=webutil.nodebranchdict(web.repo, ctx)))
441
445
442 yield l
446 yield l
443
447
444 cl = web.repo.changelog
448 cl = web.repo.changelog
445 count = len(cl)
449 count = len(cl)
446 start = max(0, count - web.maxchanges)
450 start = max(0, count - web.maxchanges)
447 end = min(count, start + web.maxchanges)
451 end = min(count, start + web.maxchanges)
448
452
449 return tmpl("summary",
453 return tmpl("summary",
450 desc=web.config("web", "description", "unknown"),
454 desc=web.config("web", "description", "unknown"),
451 owner=get_contact(web.config) or "unknown",
455 owner=get_contact(web.config) or "unknown",
452 lastchange=cl.read(cl.tip())[2],
456 lastchange=cl.read(cl.tip())[2],
453 tags=tagentries,
457 tags=tagentries,
454 branches=branches,
458 branches=branches,
455 shortlog=changelist,
459 shortlog=changelist,
456 node=hex(cl.tip()),
460 node=hex(cl.tip()),
457 archives=web.archivelist("tip"))
461 archives=web.archivelist("tip"))
458
462
459 def filediff(web, req, tmpl):
463 def filediff(web, req, tmpl):
460 fctx, ctx = None, None
464 fctx, ctx = None, None
461 try:
465 try:
462 fctx = webutil.filectx(web.repo, req)
466 fctx = webutil.filectx(web.repo, req)
463 except LookupError:
467 except LookupError:
464 ctx = webutil.changectx(web.repo, req)
468 ctx = webutil.changectx(web.repo, req)
465 path = webutil.cleanpath(web.repo, req.form['file'][0])
469 path = webutil.cleanpath(web.repo, req.form['file'][0])
466 if path not in ctx.files():
470 if path not in ctx.files():
467 raise
471 raise
468
472
469 if fctx is not None:
473 if fctx is not None:
470 n = fctx.node()
474 n = fctx.node()
471 path = fctx.path()
475 path = fctx.path()
472 else:
476 else:
473 n = ctx.node()
477 n = ctx.node()
474 # path already defined in except clause
478 # path already defined in except clause
475
479
476 parity = paritygen(web.stripecount)
480 parity = paritygen(web.stripecount)
477 diffs = webutil.diffs(web.repo, tmpl, fctx or ctx, [path], parity)
481 style = web.config('web', 'style', 'paper')
482 if 'style' in req.form:
483 style = req.form['style'][0]
484
485 diffs = webutil.diffs(web.repo, tmpl, fctx or ctx, [path], parity, style)
478 rename = fctx and webutil.renamelink(fctx) or []
486 rename = fctx and webutil.renamelink(fctx) or []
479 ctx = fctx and fctx or ctx
487 ctx = fctx and fctx or ctx
480 return tmpl("filediff",
488 return tmpl("filediff",
481 file=path,
489 file=path,
482 node=hex(n),
490 node=hex(n),
483 rev=ctx.rev(),
491 rev=ctx.rev(),
484 date=ctx.date(),
492 date=ctx.date(),
485 desc=ctx.description(),
493 desc=ctx.description(),
486 author=ctx.user(),
494 author=ctx.user(),
487 rename=rename,
495 rename=rename,
488 branch=webutil.nodebranchnodefault(ctx),
496 branch=webutil.nodebranchnodefault(ctx),
489 parent=webutil.parents(ctx),
497 parent=webutil.parents(ctx),
490 child=webutil.children(ctx),
498 child=webutil.children(ctx),
491 diff=diffs)
499 diff=diffs)
492
500
493 diff = filediff
501 diff = filediff
494
502
495 def annotate(web, req, tmpl):
503 def annotate(web, req, tmpl):
496 fctx = webutil.filectx(web.repo, req)
504 fctx = webutil.filectx(web.repo, req)
497 f = fctx.path()
505 f = fctx.path()
498 parity = paritygen(web.stripecount)
506 parity = paritygen(web.stripecount)
499
507
500 def annotate(**map):
508 def annotate(**map):
501 last = None
509 last = None
502 if binary(fctx.data()):
510 if binary(fctx.data()):
503 mt = (mimetypes.guess_type(fctx.path())[0]
511 mt = (mimetypes.guess_type(fctx.path())[0]
504 or 'application/octet-stream')
512 or 'application/octet-stream')
505 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
513 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
506 '(binary:%s)' % mt)])
514 '(binary:%s)' % mt)])
507 else:
515 else:
508 lines = enumerate(fctx.annotate(follow=True, linenumber=True))
516 lines = enumerate(fctx.annotate(follow=True, linenumber=True))
509 for lineno, ((f, targetline), l) in lines:
517 for lineno, ((f, targetline), l) in lines:
510 fnode = f.filenode()
518 fnode = f.filenode()
511
519
512 if last != fnode:
520 if last != fnode:
513 last = fnode
521 last = fnode
514
522
515 yield {"parity": parity.next(),
523 yield {"parity": parity.next(),
516 "node": hex(f.node()),
524 "node": hex(f.node()),
517 "rev": f.rev(),
525 "rev": f.rev(),
518 "author": f.user(),
526 "author": f.user(),
519 "desc": f.description(),
527 "desc": f.description(),
520 "file": f.path(),
528 "file": f.path(),
521 "targetline": targetline,
529 "targetline": targetline,
522 "line": l,
530 "line": l,
523 "lineid": "l%d" % (lineno + 1),
531 "lineid": "l%d" % (lineno + 1),
524 "linenumber": "% 6d" % (lineno + 1)}
532 "linenumber": "% 6d" % (lineno + 1)}
525
533
526 return tmpl("fileannotate",
534 return tmpl("fileannotate",
527 file=f,
535 file=f,
528 annotate=annotate,
536 annotate=annotate,
529 path=webutil.up(f),
537 path=webutil.up(f),
530 rev=fctx.rev(),
538 rev=fctx.rev(),
531 node=hex(fctx.node()),
539 node=hex(fctx.node()),
532 author=fctx.user(),
540 author=fctx.user(),
533 date=fctx.date(),
541 date=fctx.date(),
534 desc=fctx.description(),
542 desc=fctx.description(),
535 rename=webutil.renamelink(fctx),
543 rename=webutil.renamelink(fctx),
536 branch=webutil.nodebranchnodefault(fctx),
544 branch=webutil.nodebranchnodefault(fctx),
537 parent=webutil.parents(fctx),
545 parent=webutil.parents(fctx),
538 child=webutil.children(fctx),
546 child=webutil.children(fctx),
539 permissions=fctx.manifest().flags(f))
547 permissions=fctx.manifest().flags(f))
540
548
541 def filelog(web, req, tmpl):
549 def filelog(web, req, tmpl):
542
550
543 try:
551 try:
544 fctx = webutil.filectx(web.repo, req)
552 fctx = webutil.filectx(web.repo, req)
545 f = fctx.path()
553 f = fctx.path()
546 fl = fctx.filelog()
554 fl = fctx.filelog()
547 except error.LookupError:
555 except error.LookupError:
548 f = webutil.cleanpath(web.repo, req.form['file'][0])
556 f = webutil.cleanpath(web.repo, req.form['file'][0])
549 fl = web.repo.file(f)
557 fl = web.repo.file(f)
550 numrevs = len(fl)
558 numrevs = len(fl)
551 if not numrevs: # file doesn't exist at all
559 if not numrevs: # file doesn't exist at all
552 raise
560 raise
553 rev = webutil.changectx(web.repo, req).rev()
561 rev = webutil.changectx(web.repo, req).rev()
554 first = fl.linkrev(0)
562 first = fl.linkrev(0)
555 if rev < first: # current rev is from before file existed
563 if rev < first: # current rev is from before file existed
556 raise
564 raise
557 frev = numrevs - 1
565 frev = numrevs - 1
558 while fl.linkrev(frev) > rev:
566 while fl.linkrev(frev) > rev:
559 frev -= 1
567 frev -= 1
560 fctx = web.repo.filectx(f, fl.linkrev(frev))
568 fctx = web.repo.filectx(f, fl.linkrev(frev))
561
569
562 count = fctx.filerev() + 1
570 count = fctx.filerev() + 1
563 pagelen = web.maxshortchanges
571 pagelen = web.maxshortchanges
564 start = max(0, fctx.filerev() - pagelen + 1) # first rev on this page
572 start = max(0, fctx.filerev() - pagelen + 1) # first rev on this page
565 end = min(count, start + pagelen) # last rev on this page
573 end = min(count, start + pagelen) # last rev on this page
566 parity = paritygen(web.stripecount, offset=start-end)
574 parity = paritygen(web.stripecount, offset=start-end)
567
575
568 def entries(limit=0, **map):
576 def entries(limit=0, **map):
569 l = []
577 l = []
570
578
571 repo = web.repo
579 repo = web.repo
572 for i in xrange(start, end):
580 for i in xrange(start, end):
573 iterfctx = fctx.filectx(i)
581 iterfctx = fctx.filectx(i)
574
582
575 l.insert(0, {"parity": parity.next(),
583 l.insert(0, {"parity": parity.next(),
576 "filerev": i,
584 "filerev": i,
577 "file": f,
585 "file": f,
578 "node": hex(iterfctx.node()),
586 "node": hex(iterfctx.node()),
579 "author": iterfctx.user(),
587 "author": iterfctx.user(),
580 "date": iterfctx.date(),
588 "date": iterfctx.date(),
581 "rename": webutil.renamelink(iterfctx),
589 "rename": webutil.renamelink(iterfctx),
582 "parent": webutil.parents(iterfctx),
590 "parent": webutil.parents(iterfctx),
583 "child": webutil.children(iterfctx),
591 "child": webutil.children(iterfctx),
584 "desc": iterfctx.description(),
592 "desc": iterfctx.description(),
585 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
593 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
586 "branch": webutil.nodebranchnodefault(iterfctx),
594 "branch": webutil.nodebranchnodefault(iterfctx),
587 "inbranch": webutil.nodeinbranch(repo, iterfctx),
595 "inbranch": webutil.nodeinbranch(repo, iterfctx),
588 "branches": webutil.nodebranchdict(repo, iterfctx)})
596 "branches": webutil.nodebranchdict(repo, iterfctx)})
589
597
590 if limit > 0:
598 if limit > 0:
591 l = l[:limit]
599 l = l[:limit]
592
600
593 for e in l:
601 for e in l:
594 yield e
602 yield e
595
603
596 nodefunc = lambda x: fctx.filectx(fileid=x)
604 nodefunc = lambda x: fctx.filectx(fileid=x)
597 nav = webutil.revnavgen(end - 1, pagelen, count, nodefunc)
605 nav = webutil.revnavgen(end - 1, pagelen, count, nodefunc)
598 return tmpl("filelog", file=f, node=hex(fctx.node()), nav=nav,
606 return tmpl("filelog", file=f, node=hex(fctx.node()), nav=nav,
599 entries=lambda **x: entries(limit=0, **x),
607 entries=lambda **x: entries(limit=0, **x),
600 latestentry=lambda **x: entries(limit=1, **x))
608 latestentry=lambda **x: entries(limit=1, **x))
601
609
602
610
603 def archive(web, req, tmpl):
611 def archive(web, req, tmpl):
604 type_ = req.form.get('type', [None])[0]
612 type_ = req.form.get('type', [None])[0]
605 allowed = web.configlist("web", "allow_archive")
613 allowed = web.configlist("web", "allow_archive")
606 key = req.form['node'][0]
614 key = req.form['node'][0]
607
615
608 if type_ not in web.archives:
616 if type_ not in web.archives:
609 msg = 'Unsupported archive type: %s' % type_
617 msg = 'Unsupported archive type: %s' % type_
610 raise ErrorResponse(HTTP_NOT_FOUND, msg)
618 raise ErrorResponse(HTTP_NOT_FOUND, msg)
611
619
612 if not ((type_ in allowed or
620 if not ((type_ in allowed or
613 web.configbool("web", "allow" + type_, False))):
621 web.configbool("web", "allow" + type_, False))):
614 msg = 'Archive type not allowed: %s' % type_
622 msg = 'Archive type not allowed: %s' % type_
615 raise ErrorResponse(HTTP_FORBIDDEN, msg)
623 raise ErrorResponse(HTTP_FORBIDDEN, msg)
616
624
617 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
625 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
618 cnode = web.repo.lookup(key)
626 cnode = web.repo.lookup(key)
619 arch_version = key
627 arch_version = key
620 if cnode == key or key == 'tip':
628 if cnode == key or key == 'tip':
621 arch_version = short(cnode)
629 arch_version = short(cnode)
622 name = "%s-%s" % (reponame, arch_version)
630 name = "%s-%s" % (reponame, arch_version)
623 mimetype, artype, extension, encoding = web.archive_specs[type_]
631 mimetype, artype, extension, encoding = web.archive_specs[type_]
624 headers = [
632 headers = [
625 ('Content-Type', mimetype),
633 ('Content-Type', mimetype),
626 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
634 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
627 ]
635 ]
628 if encoding:
636 if encoding:
629 headers.append(('Content-Encoding', encoding))
637 headers.append(('Content-Encoding', encoding))
630 req.header(headers)
638 req.header(headers)
631 req.respond(HTTP_OK)
639 req.respond(HTTP_OK)
632 archival.archive(web.repo, req, cnode, artype, prefix=name)
640 archival.archive(web.repo, req, cnode, artype, prefix=name)
633 return []
641 return []
634
642
635
643
636 def static(web, req, tmpl):
644 def static(web, req, tmpl):
637 fname = req.form['file'][0]
645 fname = req.form['file'][0]
638 # a repo owner may set web.static in .hg/hgrc to get any file
646 # a repo owner may set web.static in .hg/hgrc to get any file
639 # readable by the user running the CGI script
647 # readable by the user running the CGI script
640 static = web.config("web", "static", None, untrusted=False)
648 static = web.config("web", "static", None, untrusted=False)
641 if not static:
649 if not static:
642 tp = web.templatepath or templater.templatepath()
650 tp = web.templatepath or templater.templatepath()
643 if isinstance(tp, str):
651 if isinstance(tp, str):
644 tp = [tp]
652 tp = [tp]
645 static = [os.path.join(p, 'static') for p in tp]
653 static = [os.path.join(p, 'static') for p in tp]
646 return [staticfile(static, fname, req)]
654 return [staticfile(static, fname, req)]
647
655
648 def graph(web, req, tmpl):
656 def graph(web, req, tmpl):
649 rev = webutil.changectx(web.repo, req).rev()
657 rev = webutil.changectx(web.repo, req).rev()
650 bg_height = 39
658 bg_height = 39
651
659
652 revcount = 25
660 revcount = 25
653 if 'revcount' in req.form:
661 if 'revcount' in req.form:
654 revcount = int(req.form.get('revcount', [revcount])[0])
662 revcount = int(req.form.get('revcount', [revcount])[0])
655 tmpl.defaults['sessionvars']['revcount'] = revcount
663 tmpl.defaults['sessionvars']['revcount'] = revcount
656
664
657 lessvars = copy.copy(tmpl.defaults['sessionvars'])
665 lessvars = copy.copy(tmpl.defaults['sessionvars'])
658 lessvars['revcount'] = revcount / 2
666 lessvars['revcount'] = revcount / 2
659 morevars = copy.copy(tmpl.defaults['sessionvars'])
667 morevars = copy.copy(tmpl.defaults['sessionvars'])
660 morevars['revcount'] = revcount * 2
668 morevars['revcount'] = revcount * 2
661
669
662 max_rev = len(web.repo) - 1
670 max_rev = len(web.repo) - 1
663 revcount = min(max_rev, revcount)
671 revcount = min(max_rev, revcount)
664 revnode = web.repo.changelog.node(rev)
672 revnode = web.repo.changelog.node(rev)
665 revnode_hex = hex(revnode)
673 revnode_hex = hex(revnode)
666 uprev = min(max_rev, rev + revcount)
674 uprev = min(max_rev, rev + revcount)
667 downrev = max(0, rev - revcount)
675 downrev = max(0, rev - revcount)
668 count = len(web.repo)
676 count = len(web.repo)
669 changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx)
677 changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx)
670
678
671 dag = graphmod.revisions(web.repo, rev, downrev)
679 dag = graphmod.revisions(web.repo, rev, downrev)
672 tree = list(graphmod.colored(dag))
680 tree = list(graphmod.colored(dag))
673 canvasheight = (len(tree) + 1) * bg_height - 27;
681 canvasheight = (len(tree) + 1) * bg_height - 27;
674 data = []
682 data = []
675 for (id, type, ctx, vtx, edges) in tree:
683 for (id, type, ctx, vtx, edges) in tree:
676 if type != graphmod.CHANGESET:
684 if type != graphmod.CHANGESET:
677 continue
685 continue
678 node = short(ctx.node())
686 node = short(ctx.node())
679 age = templatefilters.age(ctx.date())
687 age = templatefilters.age(ctx.date())
680 desc = templatefilters.firstline(ctx.description())
688 desc = templatefilters.firstline(ctx.description())
681 desc = cgi.escape(templatefilters.nonempty(desc))
689 desc = cgi.escape(templatefilters.nonempty(desc))
682 user = cgi.escape(templatefilters.person(ctx.user()))
690 user = cgi.escape(templatefilters.person(ctx.user()))
683 branch = ctx.branch()
691 branch = ctx.branch()
684 branch = branch, web.repo.branchtags().get(branch) == ctx.node()
692 branch = branch, web.repo.branchtags().get(branch) == ctx.node()
685 data.append((node, vtx, edges, desc, user, age, branch, ctx.tags()))
693 data.append((node, vtx, edges, desc, user, age, branch, ctx.tags()))
686
694
687 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
695 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
688 lessvars=lessvars, morevars=morevars, downrev=downrev,
696 lessvars=lessvars, morevars=morevars, downrev=downrev,
689 canvasheight=canvasheight, jsdata=data, bg_height=bg_height,
697 canvasheight=canvasheight, jsdata=data, bg_height=bg_height,
690 node=revnode_hex, changenav=changenav)
698 node=revnode_hex, changenav=changenav)
@@ -1,218 +1,218
1 # hgweb/webutil.py - utility library for the web interface.
1 # hgweb/webutil.py - utility library for the web interface.
2 #
2 #
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2, incorporated herein by reference.
7 # GNU General Public License version 2, incorporated herein by reference.
8
8
9 import os, copy
9 import os, copy
10 from mercurial import match, patch, util, error
10 from mercurial import match, patch, util, error
11 from mercurial.node import hex, nullid
11 from mercurial.node import hex, nullid
12
12
13 def up(p):
13 def up(p):
14 if p[0] != "/":
14 if p[0] != "/":
15 p = "/" + p
15 p = "/" + p
16 if p[-1] == "/":
16 if p[-1] == "/":
17 p = p[:-1]
17 p = p[:-1]
18 up = os.path.dirname(p)
18 up = os.path.dirname(p)
19 if up == "/":
19 if up == "/":
20 return "/"
20 return "/"
21 return up + "/"
21 return up + "/"
22
22
23 def revnavgen(pos, pagelen, limit, nodefunc):
23 def revnavgen(pos, pagelen, limit, nodefunc):
24 def seq(factor, limit=None):
24 def seq(factor, limit=None):
25 if limit:
25 if limit:
26 yield limit
26 yield limit
27 if limit >= 20 and limit <= 40:
27 if limit >= 20 and limit <= 40:
28 yield 50
28 yield 50
29 else:
29 else:
30 yield 1 * factor
30 yield 1 * factor
31 yield 3 * factor
31 yield 3 * factor
32 for f in seq(factor * 10):
32 for f in seq(factor * 10):
33 yield f
33 yield f
34
34
35 def nav(**map):
35 def nav(**map):
36 l = []
36 l = []
37 last = 0
37 last = 0
38 for f in seq(1, pagelen):
38 for f in seq(1, pagelen):
39 if f < pagelen or f <= last:
39 if f < pagelen or f <= last:
40 continue
40 continue
41 if f > limit:
41 if f > limit:
42 break
42 break
43 last = f
43 last = f
44 if pos + f < limit:
44 if pos + f < limit:
45 l.append(("+%d" % f, hex(nodefunc(pos + f).node())))
45 l.append(("+%d" % f, hex(nodefunc(pos + f).node())))
46 if pos - f >= 0:
46 if pos - f >= 0:
47 l.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
47 l.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
48
48
49 try:
49 try:
50 yield {"label": "(0)", "node": hex(nodefunc('0').node())}
50 yield {"label": "(0)", "node": hex(nodefunc('0').node())}
51
51
52 for label, node in l:
52 for label, node in l:
53 yield {"label": label, "node": node}
53 yield {"label": label, "node": node}
54
54
55 yield {"label": "tip", "node": "tip"}
55 yield {"label": "tip", "node": "tip"}
56 except error.RepoError:
56 except error.RepoError:
57 pass
57 pass
58
58
59 return nav
59 return nav
60
60
61 def _siblings(siblings=[], hiderev=None):
61 def _siblings(siblings=[], hiderev=None):
62 siblings = [s for s in siblings if s.node() != nullid]
62 siblings = [s for s in siblings if s.node() != nullid]
63 if len(siblings) == 1 and siblings[0].rev() == hiderev:
63 if len(siblings) == 1 and siblings[0].rev() == hiderev:
64 return
64 return
65 for s in siblings:
65 for s in siblings:
66 d = {'node': hex(s.node()), 'rev': s.rev()}
66 d = {'node': hex(s.node()), 'rev': s.rev()}
67 d['user'] = s.user()
67 d['user'] = s.user()
68 d['date'] = s.date()
68 d['date'] = s.date()
69 d['description'] = s.description()
69 d['description'] = s.description()
70 d['branch'] = s.branch()
70 d['branch'] = s.branch()
71 if hasattr(s, 'path'):
71 if hasattr(s, 'path'):
72 d['file'] = s.path()
72 d['file'] = s.path()
73 yield d
73 yield d
74
74
75 def parents(ctx, hide=None):
75 def parents(ctx, hide=None):
76 return _siblings(ctx.parents(), hide)
76 return _siblings(ctx.parents(), hide)
77
77
78 def children(ctx, hide=None):
78 def children(ctx, hide=None):
79 return _siblings(ctx.children(), hide)
79 return _siblings(ctx.children(), hide)
80
80
81 def renamelink(fctx):
81 def renamelink(fctx):
82 r = fctx.renamed()
82 r = fctx.renamed()
83 if r:
83 if r:
84 return [dict(file=r[0], node=hex(r[1]))]
84 return [dict(file=r[0], node=hex(r[1]))]
85 return []
85 return []
86
86
87 def nodetagsdict(repo, node):
87 def nodetagsdict(repo, node):
88 return [{"name": i} for i in repo.nodetags(node)]
88 return [{"name": i} for i in repo.nodetags(node)]
89
89
90 def nodebranchdict(repo, ctx):
90 def nodebranchdict(repo, ctx):
91 branches = []
91 branches = []
92 branch = ctx.branch()
92 branch = ctx.branch()
93 # If this is an empty repo, ctx.node() == nullid,
93 # If this is an empty repo, ctx.node() == nullid,
94 # ctx.branch() == 'default', but branchtags() is
94 # ctx.branch() == 'default', but branchtags() is
95 # an empty dict. Using dict.get avoids a traceback.
95 # an empty dict. Using dict.get avoids a traceback.
96 if repo.branchtags().get(branch) == ctx.node():
96 if repo.branchtags().get(branch) == ctx.node():
97 branches.append({"name": branch})
97 branches.append({"name": branch})
98 return branches
98 return branches
99
99
100 def nodeinbranch(repo, ctx):
100 def nodeinbranch(repo, ctx):
101 branches = []
101 branches = []
102 branch = ctx.branch()
102 branch = ctx.branch()
103 if branch != 'default' and repo.branchtags().get(branch) != ctx.node():
103 if branch != 'default' and repo.branchtags().get(branch) != ctx.node():
104 branches.append({"name": branch})
104 branches.append({"name": branch})
105 return branches
105 return branches
106
106
107 def nodebranchnodefault(ctx):
107 def nodebranchnodefault(ctx):
108 branches = []
108 branches = []
109 branch = ctx.branch()
109 branch = ctx.branch()
110 if branch != 'default':
110 if branch != 'default':
111 branches.append({"name": branch})
111 branches.append({"name": branch})
112 return branches
112 return branches
113
113
114 def showtag(repo, tmpl, t1, node=nullid, **args):
114 def showtag(repo, tmpl, t1, node=nullid, **args):
115 for t in repo.nodetags(node):
115 for t in repo.nodetags(node):
116 yield tmpl(t1, tag=t, **args)
116 yield tmpl(t1, tag=t, **args)
117
117
118 def cleanpath(repo, path):
118 def cleanpath(repo, path):
119 path = path.lstrip('/')
119 path = path.lstrip('/')
120 return util.canonpath(repo.root, '', path)
120 return util.canonpath(repo.root, '', path)
121
121
122 def changectx(repo, req):
122 def changectx(repo, req):
123 changeid = "tip"
123 changeid = "tip"
124 if 'node' in req.form:
124 if 'node' in req.form:
125 changeid = req.form['node'][0]
125 changeid = req.form['node'][0]
126 elif 'manifest' in req.form:
126 elif 'manifest' in req.form:
127 changeid = req.form['manifest'][0]
127 changeid = req.form['manifest'][0]
128
128
129 try:
129 try:
130 ctx = repo[changeid]
130 ctx = repo[changeid]
131 except error.RepoError:
131 except error.RepoError:
132 man = repo.manifest
132 man = repo.manifest
133 ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))]
133 ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))]
134
134
135 return ctx
135 return ctx
136
136
137 def filectx(repo, req):
137 def filectx(repo, req):
138 path = cleanpath(repo, req.form['file'][0])
138 path = cleanpath(repo, req.form['file'][0])
139 if 'node' in req.form:
139 if 'node' in req.form:
140 changeid = req.form['node'][0]
140 changeid = req.form['node'][0]
141 else:
141 else:
142 changeid = req.form['filenode'][0]
142 changeid = req.form['filenode'][0]
143 try:
143 try:
144 fctx = repo[changeid][path]
144 fctx = repo[changeid][path]
145 except error.RepoError:
145 except error.RepoError:
146 fctx = repo.filectx(path, fileid=changeid)
146 fctx = repo.filectx(path, fileid=changeid)
147
147
148 return fctx
148 return fctx
149
149
150 def listfilediffs(tmpl, files, node, max):
150 def listfilediffs(tmpl, files, node, max):
151 for f in files[:max]:
151 for f in files[:max]:
152 yield tmpl('filedifflink', node=hex(node), file=f)
152 yield tmpl('filedifflink', node=hex(node), file=f)
153 if len(files) > max:
153 if len(files) > max:
154 yield tmpl('fileellipses')
154 yield tmpl('fileellipses')
155
155
156 def diffs(repo, tmpl, ctx, files, parity):
156 def diffs(repo, tmpl, ctx, files, parity, style):
157
157
158 def countgen():
158 def countgen():
159 start = 1
159 start = 1
160 while True:
160 while True:
161 yield start
161 yield start
162 start += 1
162 start += 1
163
163
164 blockcount = countgen()
164 blockcount = countgen()
165 def prettyprintlines(diff):
165 def prettyprintlines(diff):
166 blockno = blockcount.next()
166 blockno = blockcount.next()
167 for lineno, l in enumerate(diff.splitlines(True)):
167 for lineno, l in enumerate(diff.splitlines(True)):
168 lineno = "%d.%d" % (blockno, lineno + 1)
168 lineno = "%d.%d" % (blockno, lineno + 1)
169 if l.startswith('+'):
169 if l.startswith('+'):
170 ltype = "difflineplus"
170 ltype = "difflineplus"
171 elif l.startswith('-'):
171 elif l.startswith('-'):
172 ltype = "difflineminus"
172 ltype = "difflineminus"
173 elif l.startswith('@'):
173 elif l.startswith('@'):
174 ltype = "difflineat"
174 ltype = "difflineat"
175 else:
175 else:
176 ltype = "diffline"
176 ltype = "diffline"
177 yield tmpl(ltype,
177 yield tmpl(ltype,
178 line=l,
178 line=l,
179 lineid="l%s" % lineno,
179 lineid="l%s" % lineno,
180 linenumber="% 8s" % lineno)
180 linenumber="% 8s" % lineno)
181
181
182 if files:
182 if files:
183 m = match.exact(repo.root, repo.getcwd(), files)
183 m = match.exact(repo.root, repo.getcwd(), files)
184 else:
184 else:
185 m = match.always(repo.root, repo.getcwd())
185 m = match.always(repo.root, repo.getcwd())
186
186
187 diffopts = patch.diffopts(repo.ui, untrusted=True)
187 diffopts = patch.diffopts(repo.ui, untrusted=True)
188 parents = ctx.parents()
188 parents = ctx.parents()
189 node1 = parents and parents[0].node() or nullid
189 node1 = parents and parents[0].node() or nullid
190 node2 = ctx.node()
190 node2 = ctx.node()
191
191
192 block = []
192 block = []
193 for chunk in patch.diff(repo, node1, node2, m, opts=diffopts):
193 for chunk in patch.diff(repo, node1, node2, m, opts=diffopts):
194 if chunk.startswith('diff') and block:
194 if chunk.startswith('diff') and block:
195 yield tmpl('diffblock', parity=parity.next(),
195 yield tmpl('diffblock', parity=parity.next(),
196 lines=prettyprintlines(''.join(block)))
196 lines=prettyprintlines(''.join(block)))
197 block = []
197 block = []
198 if chunk.startswith('diff'):
198 if chunk.startswith('diff') and style != 'raw':
199 chunk = ''.join(chunk.splitlines(True)[1:])
199 chunk = ''.join(chunk.splitlines(True)[1:])
200 block.append(chunk)
200 block.append(chunk)
201 yield tmpl('diffblock', parity=parity.next(),
201 yield tmpl('diffblock', parity=parity.next(),
202 lines=prettyprintlines(''.join(block)))
202 lines=prettyprintlines(''.join(block)))
203
203
204 class sessionvars(object):
204 class sessionvars(object):
205 def __init__(self, vars, start='?'):
205 def __init__(self, vars, start='?'):
206 self.start = start
206 self.start = start
207 self.vars = vars
207 self.vars = vars
208 def __getitem__(self, key):
208 def __getitem__(self, key):
209 return self.vars[key]
209 return self.vars[key]
210 def __setitem__(self, key, value):
210 def __setitem__(self, key, value):
211 self.vars[key] = value
211 self.vars[key] = value
212 def __copy__(self):
212 def __copy__(self):
213 return sessionvars(copy.copy(self.vars), self.start)
213 return sessionvars(copy.copy(self.vars), self.start)
214 def __iter__(self):
214 def __iter__(self):
215 separator = self.start
215 separator = self.start
216 for key, value in self.vars.iteritems():
216 for key, value in self.vars.iteritems():
217 yield {'name': key, 'value': str(value), 'separator': separator}
217 yield {'name': key, 'value': str(value), 'separator': separator}
218 separator = '&'
218 separator = '&'
@@ -1,988 +1,990
1 % Set up the repo
1 % Set up the repo
2 adding da/foo
2 adding da/foo
3 adding foo
3 adding foo
4 marked working directory as branch stable
4 marked working directory as branch stable
5 % Logs and changes
5 % Logs and changes
6 200 Script output follows
6 200 Script output follows
7
7
8 <?xml version="1.0" encoding="ascii"?>
8 <?xml version="1.0" encoding="ascii"?>
9 <feed xmlns="http://127.0.0.1/2005/Atom">
9 <feed xmlns="http://127.0.0.1/2005/Atom">
10 <!-- Changelog -->
10 <!-- Changelog -->
11 <id>http://127.0.0.1/</id>
11 <id>http://127.0.0.1/</id>
12 <link rel="self" href="http://127.0.0.1/atom-log"/>
12 <link rel="self" href="http://127.0.0.1/atom-log"/>
13 <link rel="alternate" href="http://127.0.0.1/"/>
13 <link rel="alternate" href="http://127.0.0.1/"/>
14 <title>test Changelog</title>
14 <title>test Changelog</title>
15 <updated>1970-01-01T00:00:00+00:00</updated>
15 <updated>1970-01-01T00:00:00+00:00</updated>
16
16
17 <entry>
17 <entry>
18 <title>branch</title>
18 <title>branch</title>
19 <id>http://127.0.0.1/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id>
19 <id>http://127.0.0.1/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id>
20 <link href="http://127.0.0.1/rev/1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe"/>
20 <link href="http://127.0.0.1/rev/1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe"/>
21 <author>
21 <author>
22 <name>test</name>
22 <name>test</name>
23 <email>&#116;&#101;&#115;&#116;</email>
23 <email>&#116;&#101;&#115;&#116;</email>
24 </author>
24 </author>
25 <updated>1970-01-01T00:00:00+00:00</updated>
25 <updated>1970-01-01T00:00:00+00:00</updated>
26 <published>1970-01-01T00:00:00+00:00</published>
26 <published>1970-01-01T00:00:00+00:00</published>
27 <content type="xhtml">
27 <content type="xhtml">
28 <div xmlns="http://127.0.0.1/1999/xhtml">
28 <div xmlns="http://127.0.0.1/1999/xhtml">
29 <pre xml:space="preserve">branch</pre>
29 <pre xml:space="preserve">branch</pre>
30 </div>
30 </div>
31 </content>
31 </content>
32 </entry>
32 </entry>
33 <entry>
33 <entry>
34 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
34 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
35 <id>http://127.0.0.1/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id>
35 <id>http://127.0.0.1/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id>
36 <link href="http://127.0.0.1/rev/a4f92ed23982be056b9852de5dfe873eaac7f0de"/>
36 <link href="http://127.0.0.1/rev/a4f92ed23982be056b9852de5dfe873eaac7f0de"/>
37 <author>
37 <author>
38 <name>test</name>
38 <name>test</name>
39 <email>&#116;&#101;&#115;&#116;</email>
39 <email>&#116;&#101;&#115;&#116;</email>
40 </author>
40 </author>
41 <updated>1970-01-01T00:00:00+00:00</updated>
41 <updated>1970-01-01T00:00:00+00:00</updated>
42 <published>1970-01-01T00:00:00+00:00</published>
42 <published>1970-01-01T00:00:00+00:00</published>
43 <content type="xhtml">
43 <content type="xhtml">
44 <div xmlns="http://127.0.0.1/1999/xhtml">
44 <div xmlns="http://127.0.0.1/1999/xhtml">
45 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
45 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
46 </div>
46 </div>
47 </content>
47 </content>
48 </entry>
48 </entry>
49 <entry>
49 <entry>
50 <title>base</title>
50 <title>base</title>
51 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
51 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
52 <link href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
52 <link href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
53 <author>
53 <author>
54 <name>test</name>
54 <name>test</name>
55 <email>&#116;&#101;&#115;&#116;</email>
55 <email>&#116;&#101;&#115;&#116;</email>
56 </author>
56 </author>
57 <updated>1970-01-01T00:00:00+00:00</updated>
57 <updated>1970-01-01T00:00:00+00:00</updated>
58 <published>1970-01-01T00:00:00+00:00</published>
58 <published>1970-01-01T00:00:00+00:00</published>
59 <content type="xhtml">
59 <content type="xhtml">
60 <div xmlns="http://127.0.0.1/1999/xhtml">
60 <div xmlns="http://127.0.0.1/1999/xhtml">
61 <pre xml:space="preserve">base</pre>
61 <pre xml:space="preserve">base</pre>
62 </div>
62 </div>
63 </content>
63 </content>
64 </entry>
64 </entry>
65
65
66 </feed>
66 </feed>
67 200 Script output follows
67 200 Script output follows
68
68
69 <?xml version="1.0" encoding="ascii"?>
69 <?xml version="1.0" encoding="ascii"?>
70 <feed xmlns="http://127.0.0.1/2005/Atom">
70 <feed xmlns="http://127.0.0.1/2005/Atom">
71 <!-- Changelog -->
71 <!-- Changelog -->
72 <id>http://127.0.0.1/</id>
72 <id>http://127.0.0.1/</id>
73 <link rel="self" href="http://127.0.0.1/atom-log"/>
73 <link rel="self" href="http://127.0.0.1/atom-log"/>
74 <link rel="alternate" href="http://127.0.0.1/"/>
74 <link rel="alternate" href="http://127.0.0.1/"/>
75 <title>test Changelog</title>
75 <title>test Changelog</title>
76 <updated>1970-01-01T00:00:00+00:00</updated>
76 <updated>1970-01-01T00:00:00+00:00</updated>
77
77
78 <entry>
78 <entry>
79 <title>branch</title>
79 <title>branch</title>
80 <id>http://127.0.0.1/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id>
80 <id>http://127.0.0.1/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id>
81 <link href="http://127.0.0.1/rev/1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe"/>
81 <link href="http://127.0.0.1/rev/1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe"/>
82 <author>
82 <author>
83 <name>test</name>
83 <name>test</name>
84 <email>&#116;&#101;&#115;&#116;</email>
84 <email>&#116;&#101;&#115;&#116;</email>
85 </author>
85 </author>
86 <updated>1970-01-01T00:00:00+00:00</updated>
86 <updated>1970-01-01T00:00:00+00:00</updated>
87 <published>1970-01-01T00:00:00+00:00</published>
87 <published>1970-01-01T00:00:00+00:00</published>
88 <content type="xhtml">
88 <content type="xhtml">
89 <div xmlns="http://127.0.0.1/1999/xhtml">
89 <div xmlns="http://127.0.0.1/1999/xhtml">
90 <pre xml:space="preserve">branch</pre>
90 <pre xml:space="preserve">branch</pre>
91 </div>
91 </div>
92 </content>
92 </content>
93 </entry>
93 </entry>
94 <entry>
94 <entry>
95 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
95 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
96 <id>http://127.0.0.1/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id>
96 <id>http://127.0.0.1/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id>
97 <link href="http://127.0.0.1/rev/a4f92ed23982be056b9852de5dfe873eaac7f0de"/>
97 <link href="http://127.0.0.1/rev/a4f92ed23982be056b9852de5dfe873eaac7f0de"/>
98 <author>
98 <author>
99 <name>test</name>
99 <name>test</name>
100 <email>&#116;&#101;&#115;&#116;</email>
100 <email>&#116;&#101;&#115;&#116;</email>
101 </author>
101 </author>
102 <updated>1970-01-01T00:00:00+00:00</updated>
102 <updated>1970-01-01T00:00:00+00:00</updated>
103 <published>1970-01-01T00:00:00+00:00</published>
103 <published>1970-01-01T00:00:00+00:00</published>
104 <content type="xhtml">
104 <content type="xhtml">
105 <div xmlns="http://127.0.0.1/1999/xhtml">
105 <div xmlns="http://127.0.0.1/1999/xhtml">
106 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
106 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
107 </div>
107 </div>
108 </content>
108 </content>
109 </entry>
109 </entry>
110 <entry>
110 <entry>
111 <title>base</title>
111 <title>base</title>
112 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
112 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
113 <link href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
113 <link href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
114 <author>
114 <author>
115 <name>test</name>
115 <name>test</name>
116 <email>&#116;&#101;&#115;&#116;</email>
116 <email>&#116;&#101;&#115;&#116;</email>
117 </author>
117 </author>
118 <updated>1970-01-01T00:00:00+00:00</updated>
118 <updated>1970-01-01T00:00:00+00:00</updated>
119 <published>1970-01-01T00:00:00+00:00</published>
119 <published>1970-01-01T00:00:00+00:00</published>
120 <content type="xhtml">
120 <content type="xhtml">
121 <div xmlns="http://127.0.0.1/1999/xhtml">
121 <div xmlns="http://127.0.0.1/1999/xhtml">
122 <pre xml:space="preserve">base</pre>
122 <pre xml:space="preserve">base</pre>
123 </div>
123 </div>
124 </content>
124 </content>
125 </entry>
125 </entry>
126
126
127 </feed>
127 </feed>
128 200 Script output follows
128 200 Script output follows
129
129
130 <?xml version="1.0" encoding="ascii"?>
130 <?xml version="1.0" encoding="ascii"?>
131 <feed xmlns="http://127.0.0.1/2005/Atom">
131 <feed xmlns="http://127.0.0.1/2005/Atom">
132 <id>http://127.0.0.1/atom-log/tip/foo</id>
132 <id>http://127.0.0.1/atom-log/tip/foo</id>
133 <link rel="self" href="http://127.0.0.1/atom-log/tip/foo"/>
133 <link rel="self" href="http://127.0.0.1/atom-log/tip/foo"/>
134 <title>test: foo history</title>
134 <title>test: foo history</title>
135 <updated>1970-01-01T00:00:00+00:00</updated>
135 <updated>1970-01-01T00:00:00+00:00</updated>
136
136
137 <entry>
137 <entry>
138 <title>base</title>
138 <title>base</title>
139 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
139 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
140 <link href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
140 <link href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
141 <author>
141 <author>
142 <name>test</name>
142 <name>test</name>
143 <email>&#116;&#101;&#115;&#116;</email>
143 <email>&#116;&#101;&#115;&#116;</email>
144 </author>
144 </author>
145 <updated>1970-01-01T00:00:00+00:00</updated>
145 <updated>1970-01-01T00:00:00+00:00</updated>
146 <published>1970-01-01T00:00:00+00:00</published>
146 <published>1970-01-01T00:00:00+00:00</published>
147 <content type="xhtml">
147 <content type="xhtml">
148 <div xmlns="http://127.0.0.1/1999/xhtml">
148 <div xmlns="http://127.0.0.1/1999/xhtml">
149 <pre xml:space="preserve">base</pre>
149 <pre xml:space="preserve">base</pre>
150 </div>
150 </div>
151 </content>
151 </content>
152 </entry>
152 </entry>
153
153
154 </feed>
154 </feed>
155 200 Script output follows
155 200 Script output follows
156
156
157 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
157 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
158 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
158 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
159 <head>
159 <head>
160 <link rel="icon" href="/static/hgicon.png" type="image/png" />
160 <link rel="icon" href="/static/hgicon.png" type="image/png" />
161 <meta name="robots" content="index, nofollow" />
161 <meta name="robots" content="index, nofollow" />
162 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
162 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
163
163
164 <title>test: log</title>
164 <title>test: log</title>
165 <link rel="alternate" type="application/atom+xml"
165 <link rel="alternate" type="application/atom+xml"
166 href="/atom-log" title="Atom feed for test" />
166 href="/atom-log" title="Atom feed for test" />
167 <link rel="alternate" type="application/rss+xml"
167 <link rel="alternate" type="application/rss+xml"
168 href="/rss-log" title="RSS feed for test" />
168 href="/rss-log" title="RSS feed for test" />
169 </head>
169 </head>
170 <body>
170 <body>
171
171
172 <div class="container">
172 <div class="container">
173 <div class="menu">
173 <div class="menu">
174 <div class="logo">
174 <div class="logo">
175 <a href="http://mercurial.selenic.com/">
175 <a href="http://mercurial.selenic.com/">
176 <img src="/static/hglogo.png" alt="mercurial" /></a>
176 <img src="/static/hglogo.png" alt="mercurial" /></a>
177 </div>
177 </div>
178 <ul>
178 <ul>
179 <li class="active">log</li>
179 <li class="active">log</li>
180 <li><a href="/graph/1d22e65f027e">graph</a></li>
180 <li><a href="/graph/1d22e65f027e">graph</a></li>
181 <li><a href="/tags">tags</a></li>
181 <li><a href="/tags">tags</a></li>
182 <li><a href="/branches">branches</a></li>
182 <li><a href="/branches">branches</a></li>
183 </ul>
183 </ul>
184 <ul>
184 <ul>
185 <li><a href="/rev/1d22e65f027e">changeset</a></li>
185 <li><a href="/rev/1d22e65f027e">changeset</a></li>
186 <li><a href="/file/1d22e65f027e">browse</a></li>
186 <li><a href="/file/1d22e65f027e">browse</a></li>
187 </ul>
187 </ul>
188 <ul>
188 <ul>
189
189
190 </ul>
190 </ul>
191 </div>
191 </div>
192
192
193 <div class="main">
193 <div class="main">
194 <h2><a href="/">test</a></h2>
194 <h2><a href="/">test</a></h2>
195 <h3>log</h3>
195 <h3>log</h3>
196
196
197 <form class="search" action="/log">
197 <form class="search" action="/log">
198
198
199 <p><input name="rev" id="search1" type="text" size="30" /></p>
199 <p><input name="rev" id="search1" type="text" size="30" /></p>
200 <div id="hint">find changesets by author, revision,
200 <div id="hint">find changesets by author, revision,
201 files, or words in the commit message</div>
201 files, or words in the commit message</div>
202 </form>
202 </form>
203
203
204 <div class="navigate">rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a> </div>
204 <div class="navigate">rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a> </div>
205
205
206 <table class="bigtable">
206 <table class="bigtable">
207 <tr>
207 <tr>
208 <th class="age">age</th>
208 <th class="age">age</th>
209 <th class="author">author</th>
209 <th class="author">author</th>
210 <th class="description">description</th>
210 <th class="description">description</th>
211 </tr>
211 </tr>
212 <tr class="parity0">
212 <tr class="parity0">
213 <td class="age">many years</td>
213 <td class="age">many years</td>
214 <td class="author">test</td>
214 <td class="author">test</td>
215 <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> </td>
215 <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> </td>
216 </tr>
216 </tr>
217 <tr class="parity1">
217 <tr class="parity1">
218 <td class="age">many years</td>
218 <td class="age">many years</td>
219 <td class="author">test</td>
219 <td class="author">test</td>
220 <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
220 <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
221 </tr>
221 </tr>
222 <tr class="parity0">
222 <tr class="parity0">
223 <td class="age">many years</td>
223 <td class="age">many years</td>
224 <td class="author">test</td>
224 <td class="author">test</td>
225 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
225 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
226 </tr>
226 </tr>
227
227
228 </table>
228 </table>
229
229
230 <div class="navigate">rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a> </div>
230 <div class="navigate">rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a> </div>
231 </div>
231 </div>
232 </div>
232 </div>
233
233
234
234
235
235
236 </body>
236 </body>
237 </html>
237 </html>
238
238
239 200 Script output follows
239 200 Script output follows
240
240
241 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
241 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
242 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
242 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
243 <head>
243 <head>
244 <link rel="icon" href="/static/hgicon.png" type="image/png" />
244 <link rel="icon" href="/static/hgicon.png" type="image/png" />
245 <meta name="robots" content="index, nofollow" />
245 <meta name="robots" content="index, nofollow" />
246 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
246 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
247
247
248 <title>test: 2ef0ac749a14</title>
248 <title>test: 2ef0ac749a14</title>
249 </head>
249 </head>
250 <body>
250 <body>
251 <div class="container">
251 <div class="container">
252 <div class="menu">
252 <div class="menu">
253 <div class="logo">
253 <div class="logo">
254 <a href="http://mercurial.selenic.com/">
254 <a href="http://mercurial.selenic.com/">
255 <img src="/static/hglogo.png" alt="mercurial" /></a>
255 <img src="/static/hglogo.png" alt="mercurial" /></a>
256 </div>
256 </div>
257 <ul>
257 <ul>
258 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
258 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
259 <li><a href="/graph/2ef0ac749a14">graph</a></li>
259 <li><a href="/graph/2ef0ac749a14">graph</a></li>
260 <li><a href="/tags">tags</a></li>
260 <li><a href="/tags">tags</a></li>
261 <li><a href="/branches">branches</a></li>
261 <li><a href="/branches">branches</a></li>
262 </ul>
262 </ul>
263 <ul>
263 <ul>
264 <li class="active">changeset</li>
264 <li class="active">changeset</li>
265 <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
265 <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
266 <li><a href="/file/2ef0ac749a14">browse</a></li>
266 <li><a href="/file/2ef0ac749a14">browse</a></li>
267 </ul>
267 </ul>
268 <ul>
268 <ul>
269
269
270 </ul>
270 </ul>
271 </div>
271 </div>
272
272
273 <div class="main">
273 <div class="main">
274
274
275 <h2><a href="/">test</a></h2>
275 <h2><a href="/">test</a></h2>
276 <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> </h3>
276 <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> </h3>
277
277
278 <form class="search" action="/log">
278 <form class="search" action="/log">
279
279
280 <p><input name="rev" id="search1" type="text" size="30" /></p>
280 <p><input name="rev" id="search1" type="text" size="30" /></p>
281 <div id="hint">find changesets by author, revision,
281 <div id="hint">find changesets by author, revision,
282 files, or words in the commit message</div>
282 files, or words in the commit message</div>
283 </form>
283 </form>
284
284
285 <div class="description">base</div>
285 <div class="description">base</div>
286
286
287 <table id="changesetEntry">
287 <table id="changesetEntry">
288 <tr>
288 <tr>
289 <th class="author">author</th>
289 <th class="author">author</th>
290 <td class="author">&#116;&#101;&#115;&#116;</td>
290 <td class="author">&#116;&#101;&#115;&#116;</td>
291 </tr>
291 </tr>
292 <tr>
292 <tr>
293 <th class="date">date</th>
293 <th class="date">date</th>
294 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td></tr>
294 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td></tr>
295 <tr>
295 <tr>
296 <th class="author">parents</th>
296 <th class="author">parents</th>
297 <td class="author"></td>
297 <td class="author"></td>
298 </tr>
298 </tr>
299 <tr>
299 <tr>
300 <th class="author">children</th>
300 <th class="author">children</th>
301 <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
301 <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
302 </tr>
302 </tr>
303 <tr>
303 <tr>
304 <th class="files">files</th>
304 <th class="files">files</th>
305 <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
305 <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
306 </tr>
306 </tr>
307 </table>
307 </table>
308
308
309 <div class="overflow">
309 <div class="overflow">
310 <div class="sourcefirst"> line diff</div>
310 <div class="sourcefirst"> line diff</div>
311
311
312 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
312 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
313 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/da/foo Thu Jan 01 00:00:00 1970 +0000
313 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/da/foo Thu Jan 01 00:00:00 1970 +0000
314 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
314 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
315 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
315 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
316 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
316 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
317 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
317 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
318 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
318 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
319 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
319 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
320 </span></pre></div>
320 </span></pre></div>
321 </div>
321 </div>
322
322
323 </div>
323 </div>
324 </div>
324 </div>
325
325
326
326
327 </body>
327 </body>
328 </html>
328 </html>
329
329
330 200 Script output follows
330 200 Script output follows
331
331
332
332
333 # HG changeset patch
333 # HG changeset patch
334 # User test
334 # User test
335 # Date 0 0
335 # Date 0 0
336 # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
336 # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
337 # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
337 # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
338 Added tag 1.0 for changeset 2ef0ac749a14
338 Added tag 1.0 for changeset 2ef0ac749a14
339
339
340 diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
340 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
341 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
341 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
342 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
342 @@ -0,0 +1,1 @@
343 @@ -0,0 +1,1 @@
343 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
344 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
344
345
345 % File-related
346 % File-related
346 200 Script output follows
347 200 Script output follows
347
348
348 foo
349 foo
349 200 Script output follows
350 200 Script output follows
350
351
351
352
352 test@0: foo
353 test@0: foo
353
354
354
355
355
356
356
357
357 200 Script output follows
358 200 Script output follows
358
359
359
360
360 drwxr-xr-x da
361 drwxr-xr-x da
361 -rw-r--r-- 45 .hgtags
362 -rw-r--r-- 45 .hgtags
362 -rw-r--r-- 4 foo
363 -rw-r--r-- 4 foo
363
364
364
365
365 200 Script output follows
366 200 Script output follows
366
367
367 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
368 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
368 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
369 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
369 <head>
370 <head>
370 <link rel="icon" href="/static/hgicon.png" type="image/png" />
371 <link rel="icon" href="/static/hgicon.png" type="image/png" />
371 <meta name="robots" content="index, nofollow" />
372 <meta name="robots" content="index, nofollow" />
372 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
373 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
373
374
374 <title>test: a4f92ed23982 foo</title>
375 <title>test: a4f92ed23982 foo</title>
375 </head>
376 </head>
376 <body>
377 <body>
377
378
378 <div class="container">
379 <div class="container">
379 <div class="menu">
380 <div class="menu">
380 <div class="logo">
381 <div class="logo">
381 <a href="http://mercurial.selenic.com/">
382 <a href="http://mercurial.selenic.com/">
382 <img src="/static/hglogo.png" alt="mercurial" /></a>
383 <img src="/static/hglogo.png" alt="mercurial" /></a>
383 </div>
384 </div>
384 <ul>
385 <ul>
385 <li><a href="/shortlog/a4f92ed23982">log</a></li>
386 <li><a href="/shortlog/a4f92ed23982">log</a></li>
386 <li><a href="/graph/a4f92ed23982">graph</a></li>
387 <li><a href="/graph/a4f92ed23982">graph</a></li>
387 <li><a href="/tags">tags</a></li>
388 <li><a href="/tags">tags</a></li>
388 <li><a href="/branches">branches</a></li>
389 <li><a href="/branches">branches</a></li>
389 </ul>
390 </ul>
390 <ul>
391 <ul>
391 <li><a href="/rev/a4f92ed23982">changeset</a></li>
392 <li><a href="/rev/a4f92ed23982">changeset</a></li>
392 <li><a href="/file/a4f92ed23982/">browse</a></li>
393 <li><a href="/file/a4f92ed23982/">browse</a></li>
393 </ul>
394 </ul>
394 <ul>
395 <ul>
395 <li class="active">file</li>
396 <li class="active">file</li>
396 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
397 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
397 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
398 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
398 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
399 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
399 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
400 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
400 </ul>
401 </ul>
401 </div>
402 </div>
402
403
403 <div class="main">
404 <div class="main">
404 <h2><a href="/">test</a></h2>
405 <h2><a href="/">test</a></h2>
405 <h3>view foo @ 1:a4f92ed23982</h3>
406 <h3>view foo @ 1:a4f92ed23982</h3>
406
407
407 <form class="search" action="/log">
408 <form class="search" action="/log">
408
409
409 <p><input name="rev" id="search1" type="text" size="30" /></p>
410 <p><input name="rev" id="search1" type="text" size="30" /></p>
410 <div id="hint">find changesets by author, revision,
411 <div id="hint">find changesets by author, revision,
411 files, or words in the commit message</div>
412 files, or words in the commit message</div>
412 </form>
413 </form>
413
414
414 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
415 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
415
416
416 <table id="changesetEntry">
417 <table id="changesetEntry">
417 <tr>
418 <tr>
418 <th class="author">author</th>
419 <th class="author">author</th>
419 <td class="author">&#116;&#101;&#115;&#116;</td>
420 <td class="author">&#116;&#101;&#115;&#116;</td>
420 </tr>
421 </tr>
421 <tr>
422 <tr>
422 <th class="date">date</th>
423 <th class="date">date</th>
423 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td>
424 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td>
424 </tr>
425 </tr>
425 <tr>
426 <tr>
426 <th class="author">parents</th>
427 <th class="author">parents</th>
427 <td class="author"></td>
428 <td class="author"></td>
428 </tr>
429 </tr>
429 <tr>
430 <tr>
430 <th class="author">children</th>
431 <th class="author">children</th>
431 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
432 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
432 </tr>
433 </tr>
433
434
434 </table>
435 </table>
435
436
436 <div class="overflow">
437 <div class="overflow">
437 <div class="sourcefirst"> line source</div>
438 <div class="sourcefirst"> line source</div>
438
439
439 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
440 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
440 </div>
441 </div>
441 <div class="sourcelast"></div>
442 <div class="sourcelast"></div>
442 </div>
443 </div>
443 </div>
444 </div>
444 </div>
445 </div>
445
446
446
447
447
448
448 </body>
449 </body>
449 </html>
450 </html>
450
451
451 200 Script output follows
452 200 Script output follows
452
453
453
454
455 diff -r 000000000000 -r a4f92ed23982 foo
454 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
456 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
455 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
457 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
456 @@ -0,0 +1,1 @@
458 @@ -0,0 +1,1 @@
457 +foo
459 +foo
458
460
459
461
460
462
461
463
462 % Overviews
464 % Overviews
463 200 Script output follows
465 200 Script output follows
464
466
465 <?xml version="1.0" encoding="ascii"?>
467 <?xml version="1.0" encoding="ascii"?>
466 <feed xmlns="http://127.0.0.1/2005/Atom">
468 <feed xmlns="http://127.0.0.1/2005/Atom">
467 <id>http://127.0.0.1/</id>
469 <id>http://127.0.0.1/</id>
468 <link rel="self" href="http://127.0.0.1/atom-tags"/>
470 <link rel="self" href="http://127.0.0.1/atom-tags"/>
469 <link rel="alternate" href="http://127.0.0.1/tags"/>
471 <link rel="alternate" href="http://127.0.0.1/tags"/>
470 <title>test: tags</title>
472 <title>test: tags</title>
471 <summary>test tag history</summary>
473 <summary>test tag history</summary>
472 <author><name>Mercurial SCM</name></author>
474 <author><name>Mercurial SCM</name></author>
473 <updated>1970-01-01T00:00:00+00:00</updated>
475 <updated>1970-01-01T00:00:00+00:00</updated>
474
476
475 <entry>
477 <entry>
476 <title>1.0</title>
478 <title>1.0</title>
477 <link rel="alternate" href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
479 <link rel="alternate" href="http://127.0.0.1/rev/2ef0ac749a14e4f57a5a822464a0902c6f7f448f"/>
478 <id>http://127.0.0.1/#tag-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
480 <id>http://127.0.0.1/#tag-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
479 <updated>1970-01-01T00:00:00+00:00</updated>
481 <updated>1970-01-01T00:00:00+00:00</updated>
480 <published>1970-01-01T00:00:00+00:00</published>
482 <published>1970-01-01T00:00:00+00:00</published>
481 <content type="text">1.0</content>
483 <content type="text">1.0</content>
482 </entry>
484 </entry>
483
485
484 </feed>
486 </feed>
485 200 Script output follows
487 200 Script output follows
486
488
487 <?xml version="1.0" encoding="ascii"?>
489 <?xml version="1.0" encoding="ascii"?>
488 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://127.0.0.1/TR/xhtml1/DTD/xhtml1-strict.dtd">
490 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://127.0.0.1/TR/xhtml1/DTD/xhtml1-strict.dtd">
489 <html xmlns="http://127.0.0.1/1999/xhtml" xml:lang="en-US" lang="en-US">
491 <html xmlns="http://127.0.0.1/1999/xhtml" xml:lang="en-US" lang="en-US">
490 <head>
492 <head>
491 <link rel="icon" href="/static/hgicon.png" type="image/png" />
493 <link rel="icon" href="/static/hgicon.png" type="image/png" />
492 <meta name="robots" content="index, nofollow"/>
494 <meta name="robots" content="index, nofollow"/>
493 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
495 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
494
496
495
497
496 <title>test: Branches</title>
498 <title>test: Branches</title>
497 <link rel="alternate" type="application/atom+xml"
499 <link rel="alternate" type="application/atom+xml"
498 href="/atom-tags" title="Atom feed for test"/>
500 href="/atom-tags" title="Atom feed for test"/>
499 <link rel="alternate" type="application/rss+xml"
501 <link rel="alternate" type="application/rss+xml"
500 href="/rss-tags" title="RSS feed for test"/>
502 href="/rss-tags" title="RSS feed for test"/>
501 </head>
503 </head>
502 <body>
504 <body>
503
505
504 <div class="page_header">
506 <div class="page_header">
505 <a href="http://127.0.0.1/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / branches
507 <a href="http://127.0.0.1/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / branches
506 </div>
508 </div>
507
509
508 <div class="page_nav">
510 <div class="page_nav">
509 <a href="/summary?style=gitweb">summary</a> |
511 <a href="/summary?style=gitweb">summary</a> |
510 <a href="/shortlog?style=gitweb">shortlog</a> |
512 <a href="/shortlog?style=gitweb">shortlog</a> |
511 <a href="/log?style=gitweb">changelog</a> |
513 <a href="/log?style=gitweb">changelog</a> |
512 <a href="/graph?style=gitweb">graph</a> |
514 <a href="/graph?style=gitweb">graph</a> |
513 <a href="/tags?style=gitweb">tags</a> |
515 <a href="/tags?style=gitweb">tags</a> |
514 branches |
516 branches |
515 <a href="/file/1d22e65f027e?style=gitweb">files</a>
517 <a href="/file/1d22e65f027e?style=gitweb">files</a>
516 <br/>
518 <br/>
517 </div>
519 </div>
518
520
519 <div class="title">&nbsp;</div>
521 <div class="title">&nbsp;</div>
520 <table cellspacing="0">
522 <table cellspacing="0">
521
523
522 <tr class="parity0">
524 <tr class="parity0">
523 <td class="age"><i>many years ago</i></td>
525 <td class="age"><i>many years ago</i></td>
524 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
526 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
525 <td class="open">stable</td>
527 <td class="open">stable</td>
526 <td class="link">
528 <td class="link">
527 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
529 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
528 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
530 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
529 <a href="/file/1d22e65f027e?style=gitweb">files</a>
531 <a href="/file/1d22e65f027e?style=gitweb">files</a>
530 </td>
532 </td>
531 </tr>
533 </tr>
532 <tr class="parity1">
534 <tr class="parity1">
533 <td class="age"><i>many years ago</i></td>
535 <td class="age"><i>many years ago</i></td>
534 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
536 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
535 <td class="inactive">default</td>
537 <td class="inactive">default</td>
536 <td class="link">
538 <td class="link">
537 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
539 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
538 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
540 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
539 <a href="/file/a4f92ed23982?style=gitweb">files</a>
541 <a href="/file/a4f92ed23982?style=gitweb">files</a>
540 </td>
542 </td>
541 </tr>
543 </tr>
542 </table>
544 </table>
543
545
544 <div class="page_footer">
546 <div class="page_footer">
545 <div class="page_footer_text">test</div>
547 <div class="page_footer_text">test</div>
546 <div class="rss_logo">
548 <div class="rss_logo">
547 <a href="/rss-log">RSS</a>
549 <a href="/rss-log">RSS</a>
548 <a href="/atom-log">Atom</a>
550 <a href="/atom-log">Atom</a>
549 </div>
551 </div>
550 <br />
552 <br />
551
553
552 </div>
554 </div>
553 </body>
555 </body>
554 </html>
556 </html>
555
557
556 200 Script output follows
558 200 Script output follows
557
559
558 <?xml version="1.0" encoding="ascii"?>
560 <?xml version="1.0" encoding="ascii"?>
559 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
561 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
560 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
562 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
561 <head>
563 <head>
562 <link rel="icon" href="/static/hgicon.png" type="image/png" />
564 <link rel="icon" href="/static/hgicon.png" type="image/png" />
563 <meta name="robots" content="index, nofollow"/>
565 <meta name="robots" content="index, nofollow"/>
564 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
566 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
565
567
566
568
567 <title>test: Summary</title>
569 <title>test: Summary</title>
568 <link rel="alternate" type="application/atom+xml"
570 <link rel="alternate" type="application/atom+xml"
569 href="/atom-log" title="Atom feed for test"/>
571 href="/atom-log" title="Atom feed for test"/>
570 <link rel="alternate" type="application/rss+xml"
572 <link rel="alternate" type="application/rss+xml"
571 href="/rss-log" title="RSS feed for test"/>
573 href="/rss-log" title="RSS feed for test"/>
572 </head>
574 </head>
573 <body>
575 <body>
574
576
575 <div class="page_header">
577 <div class="page_header">
576 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
578 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
577
579
578 <form action="/log">
580 <form action="/log">
579 <input type="hidden" name="style" value="gitweb" />
581 <input type="hidden" name="style" value="gitweb" />
580 <div class="search">
582 <div class="search">
581 <input type="text" name="rev" />
583 <input type="text" name="rev" />
582 </div>
584 </div>
583 </form>
585 </form>
584 </div>
586 </div>
585
587
586 <div class="page_nav">
588 <div class="page_nav">
587 summary |
589 summary |
588 <a href="/shortlog?style=gitweb">shortlog</a> |
590 <a href="/shortlog?style=gitweb">shortlog</a> |
589 <a href="/log?style=gitweb">changelog</a> |
591 <a href="/log?style=gitweb">changelog</a> |
590 <a href="/graph?style=gitweb">graph</a> |
592 <a href="/graph?style=gitweb">graph</a> |
591 <a href="/tags?style=gitweb">tags</a> |
593 <a href="/tags?style=gitweb">tags</a> |
592 <a href="/branches?style=gitweb">branches</a> |
594 <a href="/branches?style=gitweb">branches</a> |
593 <a href="/file/1d22e65f027e?style=gitweb">files</a>
595 <a href="/file/1d22e65f027e?style=gitweb">files</a>
594 <br/>
596 <br/>
595 </div>
597 </div>
596
598
597 <div class="title">&nbsp;</div>
599 <div class="title">&nbsp;</div>
598 <table cellspacing="0">
600 <table cellspacing="0">
599 <tr><td>description</td><td>unknown</td></tr>
601 <tr><td>description</td><td>unknown</td></tr>
600 <tr><td>owner</td><td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td></tr>
602 <tr><td>owner</td><td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td></tr>
601 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
603 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
602 </table>
604 </table>
603
605
604 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
606 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
605 <table cellspacing="0">
607 <table cellspacing="0">
606
608
607 <tr class="parity0">
609 <tr class="parity0">
608 <td class="age"><i>many years ago</i></td>
610 <td class="age"><i>many years ago</i></td>
609 <td><i>test</i></td>
611 <td><i>test</i></td>
610 <td>
612 <td>
611 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
613 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
612 <b>branch</b>
614 <b>branch</b>
613 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> </span>
615 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> </span>
614 </a>
616 </a>
615 </td>
617 </td>
616 <td class="link" nowrap>
618 <td class="link" nowrap>
617 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
619 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
618 <a href="/file/1d22e65f027e?style=gitweb">files</a>
620 <a href="/file/1d22e65f027e?style=gitweb">files</a>
619 </td>
621 </td>
620 </tr>
622 </tr>
621 <tr class="parity1">
623 <tr class="parity1">
622 <td class="age"><i>many years ago</i></td>
624 <td class="age"><i>many years ago</i></td>
623 <td><i>test</i></td>
625 <td><i>test</i></td>
624 <td>
626 <td>
625 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
627 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
626 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
628 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
627 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
629 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
628 </a>
630 </a>
629 </td>
631 </td>
630 <td class="link" nowrap>
632 <td class="link" nowrap>
631 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
633 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
632 <a href="/file/a4f92ed23982?style=gitweb">files</a>
634 <a href="/file/a4f92ed23982?style=gitweb">files</a>
633 </td>
635 </td>
634 </tr>
636 </tr>
635 <tr class="parity0">
637 <tr class="parity0">
636 <td class="age"><i>many years ago</i></td>
638 <td class="age"><i>many years ago</i></td>
637 <td><i>test</i></td>
639 <td><i>test</i></td>
638 <td>
640 <td>
639 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
641 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
640 <b>base</b>
642 <b>base</b>
641 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> </span>
643 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> </span>
642 </a>
644 </a>
643 </td>
645 </td>
644 <td class="link" nowrap>
646 <td class="link" nowrap>
645 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
647 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
646 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
648 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
647 </td>
649 </td>
648 </tr>
650 </tr>
649 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
651 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
650 </table>
652 </table>
651
653
652 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
654 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
653 <table cellspacing="0">
655 <table cellspacing="0">
654
656
655 <tr class="parity0">
657 <tr class="parity0">
656 <td class="age"><i>many years ago</i></td>
658 <td class="age"><i>many years ago</i></td>
657 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
659 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
658 <td class="link">
660 <td class="link">
659 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
661 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
660 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
662 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
661 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
663 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
662 </td>
664 </td>
663 </tr>
665 </tr>
664 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
666 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
665 </table>
667 </table>
666
668
667 <div><a class="title" href="#">branches</a></div>
669 <div><a class="title" href="#">branches</a></div>
668 <table cellspacing="0">
670 <table cellspacing="0">
669
671
670 <tr class="parity0">
672 <tr class="parity0">
671 <td class="age"><i>many years ago</i></td>
673 <td class="age"><i>many years ago</i></td>
672 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
674 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
673 <td class="">stable</td>
675 <td class="">stable</td>
674 <td class="link">
676 <td class="link">
675 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
677 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
676 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
678 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
677 <a href="/file/1d22e65f027e?style=gitweb">files</a>
679 <a href="/file/1d22e65f027e?style=gitweb">files</a>
678 </td>
680 </td>
679 </tr>
681 </tr>
680 <tr class="parity1">
682 <tr class="parity1">
681 <td class="age"><i>many years ago</i></td>
683 <td class="age"><i>many years ago</i></td>
682 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
684 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
683 <td class="">default</td>
685 <td class="">default</td>
684 <td class="link">
686 <td class="link">
685 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
687 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
686 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
688 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
687 <a href="/file/a4f92ed23982?style=gitweb">files</a>
689 <a href="/file/a4f92ed23982?style=gitweb">files</a>
688 </td>
690 </td>
689 </tr>
691 </tr>
690 <tr class="light">
692 <tr class="light">
691 <td colspan="4"><a class="list" href="#">...</a></td>
693 <td colspan="4"><a class="list" href="#">...</a></td>
692 </tr>
694 </tr>
693 </table>
695 </table>
694 <div class="page_footer">
696 <div class="page_footer">
695 <div class="page_footer_text">test</div>
697 <div class="page_footer_text">test</div>
696 <div class="rss_logo">
698 <div class="rss_logo">
697 <a href="/rss-log">RSS</a>
699 <a href="/rss-log">RSS</a>
698 <a href="/atom-log">Atom</a>
700 <a href="/atom-log">Atom</a>
699 </div>
701 </div>
700 <br />
702 <br />
701
703
702 </div>
704 </div>
703 </body>
705 </body>
704 </html>
706 </html>
705
707
706 200 Script output follows
708 200 Script output follows
707
709
708 <?xml version="1.0" encoding="ascii"?>
710 <?xml version="1.0" encoding="ascii"?>
709 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
711 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
710 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
712 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
711 <head>
713 <head>
712 <link rel="icon" href="/static/hgicon.png" type="image/png" />
714 <link rel="icon" href="/static/hgicon.png" type="image/png" />
713 <meta name="robots" content="index, nofollow"/>
715 <meta name="robots" content="index, nofollow"/>
714 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
716 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
715
717
716
718
717 <title>test: Graph</title>
719 <title>test: Graph</title>
718 <link rel="alternate" type="application/atom+xml"
720 <link rel="alternate" type="application/atom+xml"
719 href="/atom-log" title="Atom feed for test"/>
721 href="/atom-log" title="Atom feed for test"/>
720 <link rel="alternate" type="application/rss+xml"
722 <link rel="alternate" type="application/rss+xml"
721 href="/rss-log" title="RSS feed for test"/>
723 href="/rss-log" title="RSS feed for test"/>
722 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
724 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
723 </head>
725 </head>
724 <body>
726 <body>
725
727
726 <div class="page_header">
728 <div class="page_header">
727 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
729 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
728 </div>
730 </div>
729
731
730 <form action="/log">
732 <form action="/log">
731 <input type="hidden" name="style" value="gitweb" />
733 <input type="hidden" name="style" value="gitweb" />
732 <div class="search">
734 <div class="search">
733 <input type="text" name="rev" />
735 <input type="text" name="rev" />
734 </div>
736 </div>
735 </form>
737 </form>
736 <div class="page_nav">
738 <div class="page_nav">
737 <a href="/summary?style=gitweb">summary</a> |
739 <a href="/summary?style=gitweb">summary</a> |
738 <a href="/shortlog?style=gitweb">shortlog</a> |
740 <a href="/shortlog?style=gitweb">shortlog</a> |
739 <a href="/log/2?style=gitweb">changelog</a> |
741 <a href="/log/2?style=gitweb">changelog</a> |
740 graph |
742 graph |
741 <a href="/tags?style=gitweb">tags</a> |
743 <a href="/tags?style=gitweb">tags</a> |
742 <a href="/branches?style=gitweb">branches</a> |
744 <a href="/branches?style=gitweb">branches</a> |
743 <a href="/file/1d22e65f027e?style=gitweb">files</a>
745 <a href="/file/1d22e65f027e?style=gitweb">files</a>
744 <br/>
746 <br/>
745 <a href="/graph/2?style=gitweb&revcount=12">less</a>
747 <a href="/graph/2?style=gitweb&revcount=12">less</a>
746 <a href="/graph/2?style=gitweb&revcount=50">more</a>
748 <a href="/graph/2?style=gitweb&revcount=50">more</a>
747 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
749 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
748 </div>
750 </div>
749
751
750 <div class="title">&nbsp;</div>
752 <div class="title">&nbsp;</div>
751
753
752 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
754 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
753
755
754 <div id="wrapper">
756 <div id="wrapper">
755 <ul id="nodebgs"></ul>
757 <ul id="nodebgs"></ul>
756 <canvas id="graph" width="224" height="129"></canvas>
758 <canvas id="graph" width="224" height="129"></canvas>
757 <ul id="graphnodes"></ul>
759 <ul id="graphnodes"></ul>
758 </div>
760 </div>
759
761
760 <script type="text/javascript" src="/static/graph.js"></script>
762 <script type="text/javascript" src="/static/graph.js"></script>
761 <script>
763 <script>
762 <!-- hide script content
764 <!-- hide script content
763
765
764 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "many years", ["stable", true], ["tip"]], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "many years", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "many years", ["default", false], ["1.0"]]];
766 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "many years", ["stable", true], ["tip"]], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "many years", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "many years", ["default", false], ["1.0"]]];
765 var graph = new Graph();
767 var graph = new Graph();
766 graph.scale(39);
768 graph.scale(39);
767
769
768 graph.edge = function(x0, y0, x1, y1, color) {
770 graph.edge = function(x0, y0, x1, y1, color) {
769
771
770 this.setColor(color, 0.0, 0.65);
772 this.setColor(color, 0.0, 0.65);
771 this.ctx.beginPath();
773 this.ctx.beginPath();
772 this.ctx.moveTo(x0, y0);
774 this.ctx.moveTo(x0, y0);
773 this.ctx.lineTo(x1, y1);
775 this.ctx.lineTo(x1, y1);
774 this.ctx.stroke();
776 this.ctx.stroke();
775
777
776 }
778 }
777
779
778 var revlink = '<li style="_STYLE"><span class="desc">';
780 var revlink = '<li style="_STYLE"><span class="desc">';
779 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
781 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
780 revlink += '</span> _TAGS';
782 revlink += '</span> _TAGS';
781 revlink += '<span class="info">_DATE ago, by _USER</span></li>';
783 revlink += '<span class="info">_DATE ago, by _USER</span></li>';
782
784
783 graph.vertex = function(x, y, color, parity, cur) {
785 graph.vertex = function(x, y, color, parity, cur) {
784
786
785 this.ctx.beginPath();
787 this.ctx.beginPath();
786 color = this.setColor(color, 0.25, 0.75);
788 color = this.setColor(color, 0.25, 0.75);
787 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
789 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
788 this.ctx.fill();
790 this.ctx.fill();
789
791
790 var bg = '<li class="bg parity' + parity + '"></li>';
792 var bg = '<li class="bg parity' + parity + '"></li>';
791 var left = (this.columns + 1) * this.bg_height;
793 var left = (this.columns + 1) * this.bg_height;
792 var nstyle = 'padding-left: ' + left + 'px;';
794 var nstyle = 'padding-left: ' + left + 'px;';
793 var item = revlink.replace(/_STYLE/, nstyle);
795 var item = revlink.replace(/_STYLE/, nstyle);
794 item = item.replace(/_PARITY/, 'parity' + parity);
796 item = item.replace(/_PARITY/, 'parity' + parity);
795 item = item.replace(/_NODEID/, cur[0]);
797 item = item.replace(/_NODEID/, cur[0]);
796 item = item.replace(/_NODEID/, cur[0]);
798 item = item.replace(/_NODEID/, cur[0]);
797 item = item.replace(/_DESC/, cur[3]);
799 item = item.replace(/_DESC/, cur[3]);
798 item = item.replace(/_USER/, cur[4]);
800 item = item.replace(/_USER/, cur[4]);
799 item = item.replace(/_DATE/, cur[5]);
801 item = item.replace(/_DATE/, cur[5]);
800
802
801 var tagspan = '';
803 var tagspan = '';
802 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
804 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
803 tagspan = '<span class="logtags">';
805 tagspan = '<span class="logtags">';
804 if (cur[6][1]) {
806 if (cur[6][1]) {
805 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
807 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
806 tagspan += cur[6][0] + '</span> ';
808 tagspan += cur[6][0] + '</span> ';
807 } else if (!cur[6][1] && cur[6][0] != 'default') {
809 } else if (!cur[6][1] && cur[6][0] != 'default') {
808 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
810 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
809 tagspan += cur[6][0] + '</span> ';
811 tagspan += cur[6][0] + '</span> ';
810 }
812 }
811 if (cur[7].length) {
813 if (cur[7].length) {
812 for (var t in cur[7]) {
814 for (var t in cur[7]) {
813 var tag = cur[7][t];
815 var tag = cur[7][t];
814 tagspan += '<span class="tagtag">' + tag + '</span> ';
816 tagspan += '<span class="tagtag">' + tag + '</span> ';
815 }
817 }
816 }
818 }
817 tagspan += '</span>';
819 tagspan += '</span>';
818 }
820 }
819
821
820 item = item.replace(/_TAGS/, tagspan);
822 item = item.replace(/_TAGS/, tagspan);
821 return [bg, item];
823 return [bg, item];
822
824
823 }
825 }
824
826
825 graph.render(data);
827 graph.render(data);
826
828
827 // stop hiding script -->
829 // stop hiding script -->
828 </script>
830 </script>
829
831
830 <div class="page_nav">
832 <div class="page_nav">
831 <a href="/graph/2?style=gitweb&revcount=12">less</a>
833 <a href="/graph/2?style=gitweb&revcount=12">less</a>
832 <a href="/graph/2?style=gitweb&revcount=50">more</a>
834 <a href="/graph/2?style=gitweb&revcount=50">more</a>
833 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
835 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
834 </div>
836 </div>
835
837
836 <div class="page_footer">
838 <div class="page_footer">
837 <div class="page_footer_text">test</div>
839 <div class="page_footer_text">test</div>
838 <div class="rss_logo">
840 <div class="rss_logo">
839 <a href="/rss-log">RSS</a>
841 <a href="/rss-log">RSS</a>
840 <a href="/atom-log">Atom</a>
842 <a href="/atom-log">Atom</a>
841 </div>
843 </div>
842 <br />
844 <br />
843
845
844 </div>
846 </div>
845 </body>
847 </body>
846 </html>
848 </html>
847
849
848 % capabilities
850 % capabilities
849 200 Script output follows
851 200 Script output follows
850
852
851 lookup changegroupsubset branchmap unbundle=HG10GZ,HG10BZ,HG10UN% heads
853 lookup changegroupsubset branchmap unbundle=HG10GZ,HG10BZ,HG10UN% heads
852 200 Script output follows
854 200 Script output follows
853
855
854 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
856 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
855 % lookup
857 % lookup
856 200 Script output follows
858 200 Script output follows
857
859
858 0 'key'
860 0 'key'
859 % branches
861 % branches
860 200 Script output follows
862 200 Script output follows
861
863
862 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe 2ef0ac749a14e4f57a5a822464a0902c6f7f448f 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
864 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe 2ef0ac749a14e4f57a5a822464a0902c6f7f448f 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
863 % changegroup
865 % changegroup
864 200 Script output follows
866 200 Script output follows
865
867
866 x\x9c\xbdTMHUA\x14\xbe\xa8\xf9\xec\xda&\x10\x11*\xb8\x88\x81\x99\xbef\xe6\xce\xbdw\xc6\xf2a\x16E\x1b\x11[%\x98\xcc\xaf\x8f\x8c\xf7\xc0\xf7\x82
868 x\x9c\xbdTMHUA\x14\xbe\xa8\xf9\xec\xda&\x10\x11*\xb8\x88\x81\x99\xbef\xe6\xce\xbdw\xc6\xf2a\x16E\x1b\x11[%\x98\xcc\xaf\x8f\x8c\xf7\xc0\xf7\x82
867 4\x11KP2m\x95\xad*\xabE\x05AP\xd0\xc22Z\x14\xf9\x03\xb9j\xa3\x9b$\xa4MJ\xb4\x90\xc0\x9a\x9bO0\x10\xdf\x13\xa2\x81\x0f\x869g\xe6|\xe7\x9c\xef\x8ceY\xf7\xa2KO\xd2\xb7K\x16~\
869 4\x11KP2m\x95\xad*\xabE\x05AP\xd0\xc22Z\x14\xf9\x03\xb9j\xa3\x9b$\xa4MJ\xb4\x90\xc0\x9a\x9bO0\x10\xdf\x13\xa2\x81\x0f\x869g\xe6|\xe7\x9c\xef\x8ceY\xf7\xa2KO\xd2\xb7K\x16~\
868 \xe9\xad\x90w\x86\xab\x93W\x8e\xdf\xb0r\\Y\xee6(\xa2)\xf6\x95\xc6\x01\xe4\x1az\x80R\xe8kN\x98\xe7R\xa4\xa9K@\xe0!A\xb4k\xa7U*m\x03\x07\xd8\x92\x1d\xd2\xc9\xa4\x1d\xc2\xe6,\xa5\xcc+\x1f\xef\xafDgi\xef\xab\x1d\x1d\xb7\x9a\xe7[W\xfbc\x8f\xde-\xcd\xe7\xcaz\xb3\xbb\x19\xd3\x81\x10>c>\x08\x00"X\x11\xc2\x84@\xd2\xe7B*L\x00\x01P\x04R\xc3@\xbaB0\xdb8#\x83:\x83\xa2h\xbc=\xcd\xdaS\xe1Y,L\xd3\xa0\xf2\xa8\x94J:\xe6\xd8\x81Q\xe0\xe8d\xa7#\xe2,\xd1\xaeR*\xed \xa5\x01\x13\x01\xa6\x0cb\xe3;\xbe\xaf\xfcK[^wK\xe1N\xaf\xbbk\xe8B\xd1\xf4\xc1\x07\xb3\xab[\x10\xfdkmvwcB\xa6\xa4\xd4G\xc4D\xc2\x141\xad\x91\x10\x00\x08J\x81\xcb}\xee\t\xee+W\xba\x8a\x80\x90|\xd4\xa0\xd6\xa0\xd4T\xde\xe1\x9d,!\xe2\xb5\xa94\xe3\xe7\xd5\x9f\x06\x18\xcba\x03aP\xb8f\xcd\x04\x1a_\\9\xf1\xed\xe4\x9e\xe5\xa6\xd1\xd2\x9f\x03\xa7o\xae\x90H\xf3\xfb\xef\xffH3\xadk
870 \xe9\xad\x90w\x86\xab\x93W\x8e\xdf\xb0r\\Y\xee6(\xa2)\xf6\x95\xc6\x01\xe4\x1az\x80R\xe8kN\x98\xe7R\xa4\xa9K@\xe0!A\xb4k\xa7U*m\x03\x07\xd8\x92\x1d\xd2\xc9\xa4\x1d\xc2\xe6,\xa5\xcc+\x1f\xef\xafDgi\xef\xab\x1d\x1d\xb7\x9a\xe7[W\xfbc\x8f\xde-\xcd\xe7\xcaz\xb3\xbb\x19\xd3\x81\x10>c>\x08\x00"X\x11\xc2\x84@\xd2\xe7B*L\x00\x01P\x04R\xc3@\xbaB0\xdb8#\x83:\x83\xa2h\xbc=\xcd\xdaS\xe1Y,L\xd3\xa0\xf2\xa8\x94J:\xe6\xd8\x81Q\xe0\xe8d\xa7#\xe2,\xd1\xaeR*\xed \xa5\x01\x13\x01\xa6\x0cb\xe3;\xbe\xaf\xfcK[^wK\xe1N\xaf\xbbk\xe8B\xd1\xf4\xc1\x07\xb3\xab[\x10\xfdkmvwcB\xa6\xa4\xd4G\xc4D\xc2\x141\xad\x91\x10\x00\x08J\x81\xcb}\xee\t\xee+W\xba\x8a\x80\x90|\xd4\xa0\xd6\xa0\xd4T\xde\xe1\x9d,!\xe2\xb5\xa94\xe3\xe7\xd5\x9f\x06\x18\xcba\x03aP\xb8f\xcd\x04\x1a_\\9\xf1\xed\xe4\x9e\xe5\xa6\xd1\xd2\x9f\x03\xa7o\xae\x90H\xf3\xfb\xef\xffH3\xadk
869 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3\'\x859
871 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3\'\x859
870 \xa8\x80\x84S \xa5\xbd-g\x13`\xe4\xdc\xc3H^\xdf\xe2\xc0TM\xc7\xf4BO\xcf\xde\xae\xe5\xae#\x1frM(K\x97`F\x19\x16s\x05GD\xb9\x01\xc1\x00+\x8c|\x9fp\xc11\xf0\x14\x00\x9cJ\x82<\xe0\x12\x9f\xc1\x90\xd0\xf5\xc8\x19>Pr\xaa\xeaW\xf5\xc4\xae\xd1\xfc\x17\xcf\'\x13u\xb1\x9e\xcdHnC\x0e\xcc`\xc8\xa0&\xac\x0e\xf1|\x8c\x10$\xc4\x8c\xa2p\x05`\xdc\x08 \x80\xc4\xd7Rr-\x94\x10\x102\xedi;\xf3f\xf1z\x16\x86\xdb\xd8d\xe5\xe7\x8b\xf5\x8d\rzp\xb2\xfe\xac\xf5\xf2\xd3\xfe\xfckws\xedt\x96b\xd5l\x1c\x0b\x85\xb5\x170\x8f\x11\x84\xb0\x8f\x19\xa0\x00\t_\x07\x1ac\xa2\xc3\x89Z\xe7\x96\xf9 \xccNFg\xc7F\xaa\x8a+\x9a\x9cc_\x17\x1b\x17\x9e]z38<\x97+\xb5,",\xc8\xc8?\\\x91\xff\x17.~U\x96\x97\xf5%\xdeN<\x8e\xf5\x97%\xe7^\xcfL\xed~\xda\x96k\xdc->\x86\x02\x83"\x96H\xa6\xe3\xaas=-\xeb7\xe5\xda\x8f\xbc
872 \xa8\x80\x84S \xa5\xbd-g\x13`\xe4\xdc\xc3H^\xdf\xe2\xc0TM\xc7\xf4BO\xcf\xde\xae\xe5\xae#\x1frM(K\x97`F\x19\x16s\x05GD\xb9\x01\xc1\x00+\x8c|\x9fp\xc11\xf0\x14\x00\x9cJ\x82<\xe0\x12\x9f\xc1\x90\xd0\xf5\xc8\x19>Pr\xaa\xeaW\xf5\xc4\xae\xd1\xfc\x17\xcf\'\x13u\xb1\x9e\xcdHnC\x0e\xcc`\xc8\xa0&\xac\x0e\xf1|\x8c\x10$\xc4\x8c\xa2p\x05`\xdc\x08 \x80\xc4\xd7Rr-\x94\x10\x102\xedi;\xf3f\xf1z\x16\x86\xdb\xd8d\xe5\xe7\x8b\xf5\x8d\rzp\xb2\xfe\xac\xf5\xf2\xd3\xfe\xfckws\xedt\x96b\xd5l\x1c\x0b\x85\xb5\x170\x8f\x11\x84\xb0\x8f\x19\xa0\x00\t_\x07\x1ac\xa2\xc3\x89Z\xe7\x96\xf9 \xccNFg\xc7F\xaa\x8a+\x9a\x9cc_\x17\x1b\x17\x9e]z38<\x97+\xb5,",\xc8\xc8?\\\x91\xff\x17.~U\x96\x97\xf5%\xdeN<\x8e\xf5\x97%\xe7^\xcfL\xed~\xda\x96k\xdc->\x86\x02\x83"\x96H\xa6\xe3\xaas=-\xeb7\xe5\xda\x8f\xbc
871 % stream_out
873 % stream_out
872 200 Script output follows
874 200 Script output follows
873
875
874 1
876 1
875 % failing unbundle, requires POST request
877 % failing unbundle, requires POST request
876 405 Method Not Allowed
878 405 Method Not Allowed
877
879
878 0
880 0
879 push requires POST request
881 push requires POST request
880 % Static files
882 % Static files
881 200 Script output follows
883 200 Script output follows
882
884
883 a { text-decoration:none; }
885 a { text-decoration:none; }
884 .age { white-space:nowrap; }
886 .age { white-space:nowrap; }
885 .date { white-space:nowrap; }
887 .date { white-space:nowrap; }
886 .indexlinks { white-space:nowrap; }
888 .indexlinks { white-space:nowrap; }
887 .parity0 { background-color: #ddd; }
889 .parity0 { background-color: #ddd; }
888 .parity1 { background-color: #eee; }
890 .parity1 { background-color: #eee; }
889 .lineno { width: 60px; color: #aaa; font-size: smaller;
891 .lineno { width: 60px; color: #aaa; font-size: smaller;
890 text-align: right; }
892 text-align: right; }
891 .plusline { color: green; }
893 .plusline { color: green; }
892 .minusline { color: red; }
894 .minusline { color: red; }
893 .atline { color: purple; }
895 .atline { color: purple; }
894 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
896 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
895 .buttons a {
897 .buttons a {
896 background-color: #666;
898 background-color: #666;
897 padding: 2pt;
899 padding: 2pt;
898 color: white;
900 color: white;
899 font-family: sans;
901 font-family: sans;
900 font-weight: bold;
902 font-weight: bold;
901 }
903 }
902 .navigate a {
904 .navigate a {
903 background-color: #ccc;
905 background-color: #ccc;
904 padding: 2pt;
906 padding: 2pt;
905 font-family: sans;
907 font-family: sans;
906 color: black;
908 color: black;
907 }
909 }
908
910
909 .metatag {
911 .metatag {
910 background-color: #888;
912 background-color: #888;
911 color: white;
913 color: white;
912 text-align: right;
914 text-align: right;
913 }
915 }
914
916
915 /* Common */
917 /* Common */
916 pre { margin: 0; }
918 pre { margin: 0; }
917
919
918 .logo {
920 .logo {
919 float: right;
921 float: right;
920 clear: right;
922 clear: right;
921 }
923 }
922
924
923 /* Changelog/Filelog entries */
925 /* Changelog/Filelog entries */
924 .logEntry { width: 100%; }
926 .logEntry { width: 100%; }
925 .logEntry .age { width: 15%; }
927 .logEntry .age { width: 15%; }
926 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
928 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
927 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
929 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
928 .logEntry th.firstline { text-align: left; width: inherit; }
930 .logEntry th.firstline { text-align: left; width: inherit; }
929
931
930 /* Shortlog entries */
932 /* Shortlog entries */
931 .slogEntry { width: 100%; }
933 .slogEntry { width: 100%; }
932 .slogEntry .age { width: 8em; }
934 .slogEntry .age { width: 8em; }
933 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
935 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
934 .slogEntry td.author { width: 15em; }
936 .slogEntry td.author { width: 15em; }
935
937
936 /* Tag entries */
938 /* Tag entries */
937 #tagEntries { list-style: none; margin: 0; padding: 0; }
939 #tagEntries { list-style: none; margin: 0; padding: 0; }
938 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
940 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
939
941
940 /* Changeset entry */
942 /* Changeset entry */
941 #changesetEntry { }
943 #changesetEntry { }
942 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
944 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
943 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
945 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
944
946
945 /* File diff view */
947 /* File diff view */
946 #filediffEntry { }
948 #filediffEntry { }
947 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
949 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
948
950
949 /* Graph */
951 /* Graph */
950 div#wrapper {
952 div#wrapper {
951 position: relative;
953 position: relative;
952 margin: 0;
954 margin: 0;
953 padding: 0;
955 padding: 0;
954 }
956 }
955
957
956 canvas {
958 canvas {
957 position: absolute;
959 position: absolute;
958 z-index: 5;
960 z-index: 5;
959 top: -0.6em;
961 top: -0.6em;
960 margin: 0;
962 margin: 0;
961 }
963 }
962
964
963 ul#nodebgs {
965 ul#nodebgs {
964 list-style: none inside none;
966 list-style: none inside none;
965 padding: 0;
967 padding: 0;
966 margin: 0;
968 margin: 0;
967 top: -0.7em;
969 top: -0.7em;
968 }
970 }
969
971
970 ul#graphnodes li, ul#nodebgs li {
972 ul#graphnodes li, ul#nodebgs li {
971 height: 39px;
973 height: 39px;
972 }
974 }
973
975
974 ul#graphnodes {
976 ul#graphnodes {
975 position: absolute;
977 position: absolute;
976 z-index: 10;
978 z-index: 10;
977 top: -0.85em;
979 top: -0.85em;
978 list-style: none inside none;
980 list-style: none inside none;
979 padding: 0;
981 padding: 0;
980 }
982 }
981
983
982 ul#graphnodes li .info {
984 ul#graphnodes li .info {
983 display: block;
985 display: block;
984 font-size: 70%;
986 font-size: 70%;
985 position: relative;
987 position: relative;
986 top: -1px;
988 top: -1px;
987 }
989 }
988 % ERRORS ENCOUNTERED
990 % ERRORS ENCOUNTERED
@@ -1,36 +1,42
1 #!/bin/sh
1 #!/bin/sh
2
2
3 echo % setting up repo
3 echo % setting up repo
4 hg init test
4 hg init test
5 cd test
5 cd test
6 echo a > a
6 echo a > a
7 echo b > b
7 echo b > b
8 hg ci -Ama
8 hg ci -Ama
9
9
10 echo % change permissions for git diffs
10 echo % change permissions for git diffs
11 chmod 755 a
11 chmod 755 a
12 hg ci -Amb
12 hg ci -Amb
13
13
14 echo % set up hgweb
14 echo % set up hgweb
15 hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
15 hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
16 cat hg.pid >> $DAEMON_PIDS
16 cat hg.pid >> $DAEMON_PIDS
17
17
18 echo % revision
18 echo % revision
19 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
19 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
20
20
21 echo % raw revision
22 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/raw-rev/0'
23
21 echo % diff removed file
24 echo % diff removed file
22 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
25 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
23
26
24 echo % set up hgweb with git diffs
27 echo % set up hgweb with git diffs
25 "$TESTDIR/killdaemons.py"
28 "$TESTDIR/killdaemons.py"
26 hg serve --config 'diff.git=1' -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
29 hg serve --config 'diff.git=1' -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
27 cat hg.pid >> $DAEMON_PIDS
30 cat hg.pid >> $DAEMON_PIDS
28
31
29 echo % revision
32 echo % revision
30 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
33 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
31
34
35 echo % revision
36 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/raw-rev/0'
37
32 echo % diff removed file
38 echo % diff removed file
33 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
39 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
34
40
35 echo % errors
41 echo % errors
36 cat errors.log
42 cat errors.log
@@ -1,372 +1,418
1 % setting up repo
1 % setting up repo
2 adding a
2 adding a
3 adding b
3 adding b
4 % change permissions for git diffs
4 % change permissions for git diffs
5 % set up hgweb
5 % set up hgweb
6 % revision
6 % revision
7 200 Script output follows
7 200 Script output follows
8
8
9 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
9 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
10 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
10 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
11 <head>
11 <head>
12 <link rel="icon" href="/static/hgicon.png" type="image/png" />
12 <link rel="icon" href="/static/hgicon.png" type="image/png" />
13 <meta name="robots" content="index, nofollow" />
13 <meta name="robots" content="index, nofollow" />
14 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
14 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
15
15
16 <title>test: 0cd96de13884</title>
16 <title>test: 0cd96de13884</title>
17 </head>
17 </head>
18 <body>
18 <body>
19 <div class="container">
19 <div class="container">
20 <div class="menu">
20 <div class="menu">
21 <div class="logo">
21 <div class="logo">
22 <a href="http://mercurial.selenic.com/">
22 <a href="http://mercurial.selenic.com/">
23 <img src="/static/hglogo.png" alt="mercurial" /></a>
23 <img src="/static/hglogo.png" alt="mercurial" /></a>
24 </div>
24 </div>
25 <ul>
25 <ul>
26 <li><a href="/shortlog/0cd96de13884">log</a></li>
26 <li><a href="/shortlog/0cd96de13884">log</a></li>
27 <li><a href="/graph/0cd96de13884">graph</a></li>
27 <li><a href="/graph/0cd96de13884">graph</a></li>
28 <li><a href="/tags">tags</a></li>
28 <li><a href="/tags">tags</a></li>
29 <li><a href="/branches">branches</a></li>
29 <li><a href="/branches">branches</a></li>
30 </ul>
30 </ul>
31 <ul>
31 <ul>
32 <li class="active">changeset</li>
32 <li class="active">changeset</li>
33 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
33 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
34 <li><a href="/file/0cd96de13884">browse</a></li>
34 <li><a href="/file/0cd96de13884">browse</a></li>
35 </ul>
35 </ul>
36 <ul>
36 <ul>
37
37
38 </ul>
38 </ul>
39 </div>
39 </div>
40
40
41 <div class="main">
41 <div class="main">
42
42
43 <h2><a href="/">test</a></h2>
43 <h2><a href="/">test</a></h2>
44 <h3>changeset 0:0cd96de13884 </h3>
44 <h3>changeset 0:0cd96de13884 </h3>
45
45
46 <form class="search" action="/log">
46 <form class="search" action="/log">
47
47
48 <p><input name="rev" id="search1" type="text" size="30" /></p>
48 <p><input name="rev" id="search1" type="text" size="30" /></p>
49 <div id="hint">find changesets by author, revision,
49 <div id="hint">find changesets by author, revision,
50 files, or words in the commit message</div>
50 files, or words in the commit message</div>
51 </form>
51 </form>
52
52
53 <div class="description">a</div>
53 <div class="description">a</div>
54
54
55 <table id="changesetEntry">
55 <table id="changesetEntry">
56 <tr>
56 <tr>
57 <th class="author">author</th>
57 <th class="author">author</th>
58 <td class="author">&#116;&#101;&#115;&#116;</td>
58 <td class="author">&#116;&#101;&#115;&#116;</td>
59 </tr>
59 </tr>
60 <tr>
60 <tr>
61 <th class="date">date</th>
61 <th class="date">date</th>
62 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td></tr>
62 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td></tr>
63 <tr>
63 <tr>
64 <th class="author">parents</th>
64 <th class="author">parents</th>
65 <td class="author"></td>
65 <td class="author"></td>
66 </tr>
66 </tr>
67 <tr>
67 <tr>
68 <th class="author">children</th>
68 <th class="author">children</th>
69 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
69 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
70 </tr>
70 </tr>
71 <tr>
71 <tr>
72 <th class="files">files</th>
72 <th class="files">files</th>
73 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
73 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
74 </tr>
74 </tr>
75 </table>
75 </table>
76
76
77 <div class="overflow">
77 <div class="overflow">
78 <div class="sourcefirst"> line diff</div>
78 <div class="sourcefirst"> line diff</div>
79
79
80 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
80 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
81 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
81 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
82 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
82 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
83 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
83 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
84 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
84 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
85 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/b Thu Jan 01 00:00:00 1970 +0000
85 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/b Thu Jan 01 00:00:00 1970 +0000
86 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
86 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
87 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+b
87 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+b
88 </span></pre></div>
88 </span></pre></div>
89 </div>
89 </div>
90
90
91 </div>
91 </div>
92 </div>
92 </div>
93
93
94
94
95 </body>
95 </body>
96 </html>
96 </html>
97
97
98 % raw revision
99 200 Script output follows
100
101
102 # HG changeset patch
103 # User test
104 # Date 0 0
105 # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
106
107 a
108
109 diff -r 000000000000 -r 0cd96de13884 a
110 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
111 +++ b/a Thu Jan 01 00:00:00 1970 +0000
112 @@ -0,0 +1,1 @@
113 +a
114 diff -r 000000000000 -r 0cd96de13884 b
115 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
116 +++ b/b Thu Jan 01 00:00:00 1970 +0000
117 @@ -0,0 +1,1 @@
118 +b
119
98 % diff removed file
120 % diff removed file
99 200 Script output follows
121 200 Script output follows
100
122
101 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
123 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
102 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
124 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
103 <head>
125 <head>
104 <link rel="icon" href="/static/hgicon.png" type="image/png" />
126 <link rel="icon" href="/static/hgicon.png" type="image/png" />
105 <meta name="robots" content="index, nofollow" />
127 <meta name="robots" content="index, nofollow" />
106 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
128 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
107
129
108 <title>test: a diff</title>
130 <title>test: a diff</title>
109 </head>
131 </head>
110 <body>
132 <body>
111
133
112 <div class="container">
134 <div class="container">
113 <div class="menu">
135 <div class="menu">
114 <div class="logo">
136 <div class="logo">
115 <a href="http://mercurial.selenic.com/">
137 <a href="http://mercurial.selenic.com/">
116 <img src="/static/hglogo.png" alt="mercurial" /></a>
138 <img src="/static/hglogo.png" alt="mercurial" /></a>
117 </div>
139 </div>
118 <ul>
140 <ul>
119 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
141 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
120 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
142 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
121 <li><a href="/tags">tags</a></li>
143 <li><a href="/tags">tags</a></li>
122 <li><a href="/branches">branches</a></li>
144 <li><a href="/branches">branches</a></li>
123 </ul>
145 </ul>
124 <ul>
146 <ul>
125 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
147 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
126 <li><a href="/file/78e4ebad7cdf">browse</a></li>
148 <li><a href="/file/78e4ebad7cdf">browse</a></li>
127 </ul>
149 </ul>
128 <ul>
150 <ul>
129 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
151 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
130 <li class="active">diff</li>
152 <li class="active">diff</li>
131 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
153 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
132 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
154 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
133 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
155 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
134 </ul>
156 </ul>
135 </div>
157 </div>
136
158
137 <div class="main">
159 <div class="main">
138 <h2><a href="/">test</a></h2>
160 <h2><a href="/">test</a></h2>
139 <h3>diff a @ 1:78e4ebad7cdf</h3>
161 <h3>diff a @ 1:78e4ebad7cdf</h3>
140
162
141 <form class="search" action="/log">
163 <form class="search" action="/log">
142 <p></p>
164 <p></p>
143 <p><input name="rev" id="search1" type="text" size="30" /></p>
165 <p><input name="rev" id="search1" type="text" size="30" /></p>
144 <div id="hint">find changesets by author, revision,
166 <div id="hint">find changesets by author, revision,
145 files, or words in the commit message</div>
167 files, or words in the commit message</div>
146 </form>
168 </form>
147
169
148 <div class="description">b</div>
170 <div class="description">b</div>
149
171
150 <table id="changesetEntry">
172 <table id="changesetEntry">
151 <tr>
173 <tr>
152 <th>author</th>
174 <th>author</th>
153 <td>&#116;&#101;&#115;&#116;</td>
175 <td>&#116;&#101;&#115;&#116;</td>
154 </tr>
176 </tr>
155 <tr>
177 <tr>
156 <th>date</th>
178 <th>date</th>
157 <td>Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td>
179 <td>Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td>
158 </tr>
180 </tr>
159 <tr>
181 <tr>
160 <th>parents</th>
182 <th>parents</th>
161 <td></td>
183 <td></td>
162 </tr>
184 </tr>
163 <tr>
185 <tr>
164 <th>children</th>
186 <th>children</th>
165 <td></td>
187 <td></td>
166 </tr>
188 </tr>
167
189
168 </table>
190 </table>
169
191
170 <div class="overflow">
192 <div class="overflow">
171 <div class="sourcefirst"> line diff</div>
193 <div class="sourcefirst"> line diff</div>
172
194
173 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
195 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
174 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
196 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
175 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
197 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
176 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
198 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
177 </span></pre></div>
199 </span></pre></div>
178 </div>
200 </div>
179 </div>
201 </div>
180 </div>
202 </div>
181
203
182
204
183
205
184 </body>
206 </body>
185 </html>
207 </html>
186
208
187 % set up hgweb with git diffs
209 % set up hgweb with git diffs
188 % revision
210 % revision
189 200 Script output follows
211 200 Script output follows
190
212
191 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
213 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
192 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
214 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
193 <head>
215 <head>
194 <link rel="icon" href="/static/hgicon.png" type="image/png" />
216 <link rel="icon" href="/static/hgicon.png" type="image/png" />
195 <meta name="robots" content="index, nofollow" />
217 <meta name="robots" content="index, nofollow" />
196 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
218 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
197
219
198 <title>test: 0cd96de13884</title>
220 <title>test: 0cd96de13884</title>
199 </head>
221 </head>
200 <body>
222 <body>
201 <div class="container">
223 <div class="container">
202 <div class="menu">
224 <div class="menu">
203 <div class="logo">
225 <div class="logo">
204 <a href="http://mercurial.selenic.com/">
226 <a href="http://mercurial.selenic.com/">
205 <img src="/static/hglogo.png" alt="mercurial" /></a>
227 <img src="/static/hglogo.png" alt="mercurial" /></a>
206 </div>
228 </div>
207 <ul>
229 <ul>
208 <li><a href="/shortlog/0cd96de13884">log</a></li>
230 <li><a href="/shortlog/0cd96de13884">log</a></li>
209 <li><a href="/graph/0cd96de13884">graph</a></li>
231 <li><a href="/graph/0cd96de13884">graph</a></li>
210 <li><a href="/tags">tags</a></li>
232 <li><a href="/tags">tags</a></li>
211 <li><a href="/branches">branches</a></li>
233 <li><a href="/branches">branches</a></li>
212 </ul>
234 </ul>
213 <ul>
235 <ul>
214 <li class="active">changeset</li>
236 <li class="active">changeset</li>
215 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
237 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
216 <li><a href="/file/0cd96de13884">browse</a></li>
238 <li><a href="/file/0cd96de13884">browse</a></li>
217 </ul>
239 </ul>
218 <ul>
240 <ul>
219
241
220 </ul>
242 </ul>
221 </div>
243 </div>
222
244
223 <div class="main">
245 <div class="main">
224
246
225 <h2><a href="/">test</a></h2>
247 <h2><a href="/">test</a></h2>
226 <h3>changeset 0:0cd96de13884 </h3>
248 <h3>changeset 0:0cd96de13884 </h3>
227
249
228 <form class="search" action="/log">
250 <form class="search" action="/log">
229
251
230 <p><input name="rev" id="search1" type="text" size="30" /></p>
252 <p><input name="rev" id="search1" type="text" size="30" /></p>
231 <div id="hint">find changesets by author, revision,
253 <div id="hint">find changesets by author, revision,
232 files, or words in the commit message</div>
254 files, or words in the commit message</div>
233 </form>
255 </form>
234
256
235 <div class="description">a</div>
257 <div class="description">a</div>
236
258
237 <table id="changesetEntry">
259 <table id="changesetEntry">
238 <tr>
260 <tr>
239 <th class="author">author</th>
261 <th class="author">author</th>
240 <td class="author">&#116;&#101;&#115;&#116;</td>
262 <td class="author">&#116;&#101;&#115;&#116;</td>
241 </tr>
263 </tr>
242 <tr>
264 <tr>
243 <th class="date">date</th>
265 <th class="date">date</th>
244 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td></tr>
266 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td></tr>
245 <tr>
267 <tr>
246 <th class="author">parents</th>
268 <th class="author">parents</th>
247 <td class="author"></td>
269 <td class="author"></td>
248 </tr>
270 </tr>
249 <tr>
271 <tr>
250 <th class="author">children</th>
272 <th class="author">children</th>
251 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
273 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
252 </tr>
274 </tr>
253 <tr>
275 <tr>
254 <th class="files">files</th>
276 <th class="files">files</th>
255 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
277 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
256 </tr>
278 </tr>
257 </table>
279 </table>
258
280
259 <div class="overflow">
281 <div class="overflow">
260 <div class="sourcefirst"> line diff</div>
282 <div class="sourcefirst"> line diff</div>
261
283
262 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100644
284 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100644
263 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
285 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
264 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
286 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
265 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
287 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
266 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
288 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
267 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> new file mode 100644
289 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> new file mode 100644
268 <a href="#l2.2" id="l2.2"> 2.2</a> <span class="minusline">--- /dev/null
290 <a href="#l2.2" id="l2.2"> 2.2</a> <span class="minusline">--- /dev/null
269 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="plusline">+++ b/b
291 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="plusline">+++ b/b
270 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="atline">@@ -0,0 +1,1 @@
292 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="atline">@@ -0,0 +1,1 @@
271 </span><a href="#l2.5" id="l2.5"> 2.5</a> <span class="plusline">+b
293 </span><a href="#l2.5" id="l2.5"> 2.5</a> <span class="plusline">+b
272 </span></pre></div>
294 </span></pre></div>
273 </div>
295 </div>
274
296
275 </div>
297 </div>
276 </div>
298 </div>
277
299
278
300
279 </body>
301 </body>
280 </html>
302 </html>
281
303
304 % revision
305 200 Script output follows
306
307
308 # HG changeset patch
309 # User test
310 # Date 0 0
311 # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
312
313 a
314
315 diff --git a/a b/a
316 new file mode 100644
317 --- /dev/null
318 +++ b/a
319 @@ -0,0 +1,1 @@
320 +a
321 diff --git a/b b/b
322 new file mode 100644
323 --- /dev/null
324 +++ b/b
325 @@ -0,0 +1,1 @@
326 +b
327
282 % diff removed file
328 % diff removed file
283 200 Script output follows
329 200 Script output follows
284
330
285 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
331 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
286 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
332 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
287 <head>
333 <head>
288 <link rel="icon" href="/static/hgicon.png" type="image/png" />
334 <link rel="icon" href="/static/hgicon.png" type="image/png" />
289 <meta name="robots" content="index, nofollow" />
335 <meta name="robots" content="index, nofollow" />
290 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
336 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
291
337
292 <title>test: a diff</title>
338 <title>test: a diff</title>
293 </head>
339 </head>
294 <body>
340 <body>
295
341
296 <div class="container">
342 <div class="container">
297 <div class="menu">
343 <div class="menu">
298 <div class="logo">
344 <div class="logo">
299 <a href="http://mercurial.selenic.com/">
345 <a href="http://mercurial.selenic.com/">
300 <img src="/static/hglogo.png" alt="mercurial" /></a>
346 <img src="/static/hglogo.png" alt="mercurial" /></a>
301 </div>
347 </div>
302 <ul>
348 <ul>
303 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
349 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
304 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
350 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
305 <li><a href="/tags">tags</a></li>
351 <li><a href="/tags">tags</a></li>
306 <li><a href="/branches">branches</a></li>
352 <li><a href="/branches">branches</a></li>
307 </ul>
353 </ul>
308 <ul>
354 <ul>
309 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
355 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
310 <li><a href="/file/78e4ebad7cdf">browse</a></li>
356 <li><a href="/file/78e4ebad7cdf">browse</a></li>
311 </ul>
357 </ul>
312 <ul>
358 <ul>
313 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
359 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
314 <li class="active">diff</li>
360 <li class="active">diff</li>
315 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
361 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
316 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
362 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
317 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
363 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
318 </ul>
364 </ul>
319 </div>
365 </div>
320
366
321 <div class="main">
367 <div class="main">
322 <h2><a href="/">test</a></h2>
368 <h2><a href="/">test</a></h2>
323 <h3>diff a @ 1:78e4ebad7cdf</h3>
369 <h3>diff a @ 1:78e4ebad7cdf</h3>
324
370
325 <form class="search" action="/log">
371 <form class="search" action="/log">
326 <p></p>
372 <p></p>
327 <p><input name="rev" id="search1" type="text" size="30" /></p>
373 <p><input name="rev" id="search1" type="text" size="30" /></p>
328 <div id="hint">find changesets by author, revision,
374 <div id="hint">find changesets by author, revision,
329 files, or words in the commit message</div>
375 files, or words in the commit message</div>
330 </form>
376 </form>
331
377
332 <div class="description">b</div>
378 <div class="description">b</div>
333
379
334 <table id="changesetEntry">
380 <table id="changesetEntry">
335 <tr>
381 <tr>
336 <th>author</th>
382 <th>author</th>
337 <td>&#116;&#101;&#115;&#116;</td>
383 <td>&#116;&#101;&#115;&#116;</td>
338 </tr>
384 </tr>
339 <tr>
385 <tr>
340 <th>date</th>
386 <th>date</th>
341 <td>Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td>
387 <td>Thu Jan 01 00:00:00 1970 +0000 (many years ago)</td>
342 </tr>
388 </tr>
343 <tr>
389 <tr>
344 <th>parents</th>
390 <th>parents</th>
345 <td></td>
391 <td></td>
346 </tr>
392 </tr>
347 <tr>
393 <tr>
348 <th>children</th>
394 <th>children</th>
349 <td></td>
395 <td></td>
350 </tr>
396 </tr>
351
397
352 </table>
398 </table>
353
399
354 <div class="overflow">
400 <div class="overflow">
355 <div class="sourcefirst"> line diff</div>
401 <div class="sourcefirst"> line diff</div>
356
402
357 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100755
403 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100755
358 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
404 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
359 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
405 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
360 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
406 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
361 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
407 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
362 </span></pre></div>
408 </span></pre></div>
363 </div>
409 </div>
364 </div>
410 </div>
365 </div>
411 </div>
366
412
367
413
368
414
369 </body>
415 </body>
370 </html>
416 </html>
371
417
372 % errors
418 % errors
@@ -1,442 +1,444
1 % hg kwdemo
1 % hg kwdemo
2 [extensions]
2 [extensions]
3 hgext.keyword =
3 hgext.keyword =
4 [keyword]
4 [keyword]
5 * =
5 * =
6 b = ignore
6 b = ignore
7 demo.txt =
7 demo.txt =
8 [keywordmaps]
8 [keywordmaps]
9 RCSFile = {file|basename},v
9 RCSFile = {file|basename},v
10 Author = {author|user}
10 Author = {author|user}
11 Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
11 Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
12 Source = {root}/{file},v
12 Source = {root}/{file},v
13 Date = {date|utcdate}
13 Date = {date|utcdate}
14 Id = {file|basename},v {node|short} {date|utcdate} {author|user}
14 Id = {file|basename},v {node|short} {date|utcdate} {author|user}
15 Revision = {node|short}
15 Revision = {node|short}
16 $RCSFile: demo.txt,v $
16 $RCSFile: demo.txt,v $
17 $Author: test $
17 $Author: test $
18 $Header: /TMP/demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
18 $Header: /TMP/demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
19 $Source: /TMP/demo.txt,v $
19 $Source: /TMP/demo.txt,v $
20 $Date: 2000/00/00 00:00:00 $
20 $Date: 2000/00/00 00:00:00 $
21 $Id: demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
21 $Id: demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
22 $Revision: xxxxxxxxxxxx $
22 $Revision: xxxxxxxxxxxx $
23 [extensions]
23 [extensions]
24 hgext.keyword =
24 hgext.keyword =
25 [keyword]
25 [keyword]
26 * =
26 * =
27 b = ignore
27 b = ignore
28 demo.txt =
28 demo.txt =
29 [keywordmaps]
29 [keywordmaps]
30 Branch = {branches}
30 Branch = {branches}
31 $Branch: demobranch $
31 $Branch: demobranch $
32 % kwshrink should exit silently in empty/invalid repo
32 % kwshrink should exit silently in empty/invalid repo
33 pulling from test-keyword.hg
33 pulling from test-keyword.hg
34 requesting all changes
34 requesting all changes
35 adding changesets
35 adding changesets
36 adding manifests
36 adding manifests
37 adding file changes
37 adding file changes
38 added 1 changesets with 1 changes to 1 files
38 added 1 changesets with 1 changes to 1 files
39 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
39 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
40 % cat
40 % cat
41 expand $Id$
41 expand $Id$
42 do not process $Id:
42 do not process $Id:
43 xxx $
43 xxx $
44 ignore $Id$
44 ignore $Id$
45 % addremove
45 % addremove
46 adding a
46 adding a
47 adding b
47 adding b
48 % status
48 % status
49 A a
49 A a
50 A b
50 A b
51 % default keyword expansion including commit hook
51 % default keyword expansion including commit hook
52 % interrupted commit should not change state or run commit hook
52 % interrupted commit should not change state or run commit hook
53 abort: empty commit message
53 abort: empty commit message
54 % status
54 % status
55 A a
55 A a
56 A b
56 A b
57 % commit
57 % commit
58 a
58 a
59 b
59 b
60 overwriting a expanding keywords
60 overwriting a expanding keywords
61 running hook commit.test: cp a hooktest
61 running hook commit.test: cp a hooktest
62 committed changeset 1:ef63ca68695bc9495032c6fda1350c71e6d256e9
62 committed changeset 1:ef63ca68695bc9495032c6fda1350c71e6d256e9
63 % status
63 % status
64 ? hooktest
64 ? hooktest
65 % identify
65 % identify
66 ef63ca68695b
66 ef63ca68695b
67 % cat
67 % cat
68 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
68 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
69 do not process $Id:
69 do not process $Id:
70 xxx $
70 xxx $
71 ignore $Id$
71 ignore $Id$
72 % hg cat
72 % hg cat
73 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
73 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
74 do not process $Id:
74 do not process $Id:
75 xxx $
75 xxx $
76 ignore $Id$
76 ignore $Id$
77 a
77 a
78 % diff a hooktest
78 % diff a hooktest
79 % removing commit hook from config
79 % removing commit hook from config
80 % bundle
80 % bundle
81 2 changesets found
81 2 changesets found
82 % notify on pull to check whether keywords stay as is in email
82 % notify on pull to check whether keywords stay as is in email
83 % ie. if patch.diff wrapper acts as it should
83 % ie. if patch.diff wrapper acts as it should
84 % pull from bundle
84 % pull from bundle
85 pulling from ../kw.hg
85 pulling from ../kw.hg
86 requesting all changes
86 requesting all changes
87 adding changesets
87 adding changesets
88 adding manifests
88 adding manifests
89 adding file changes
89 adding file changes
90 added 2 changesets with 3 changes to 3 files
90 added 2 changesets with 3 changes to 3 files
91
91
92 diff -r 000000000000 -r a2392c293916 sym
92 diff -r 000000000000 -r a2392c293916 sym
93 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
93 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
94 +++ b/sym Sat Feb 09 20:25:47 2008 +0100
94 +++ b/sym Sat Feb 09 20:25:47 2008 +0100
95 @@ -0,0 +1,1 @@
95 @@ -0,0 +1,1 @@
96 +a
96 +a
97 \ No newline at end of file
97 \ No newline at end of file
98
98
99 diff -r a2392c293916 -r ef63ca68695b a
99 diff -r a2392c293916 -r ef63ca68695b a
100 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
100 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
101 +++ b/a Thu Jan 01 00:00:00 1970 +0000
101 +++ b/a Thu Jan 01 00:00:00 1970 +0000
102 @@ -0,0 +1,3 @@
102 @@ -0,0 +1,3 @@
103 +expand $Id$
103 +expand $Id$
104 +do not process $Id:
104 +do not process $Id:
105 +xxx $
105 +xxx $
106 diff -r a2392c293916 -r ef63ca68695b b
106 diff -r a2392c293916 -r ef63ca68695b b
107 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
107 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
108 +++ b/b Thu Jan 01 00:00:00 1970 +0000
108 +++ b/b Thu Jan 01 00:00:00 1970 +0000
109 @@ -0,0 +1,1 @@
109 @@ -0,0 +1,1 @@
110 +ignore $Id$
110 +ignore $Id$
111 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
111 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 % remove notify config
112 % remove notify config
113 % touch
113 % touch
114 % status
114 % status
115 % update
115 % update
116 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
116 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
117 % cat
117 % cat
118 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
118 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
119 do not process $Id:
119 do not process $Id:
120 xxx $
120 xxx $
121 ignore $Id$
121 ignore $Id$
122 % check whether expansion is filewise
122 % check whether expansion is filewise
123 % commit c
123 % commit c
124 adding c
124 adding c
125 % force expansion
125 % force expansion
126 overwriting a expanding keywords
126 overwriting a expanding keywords
127 overwriting c expanding keywords
127 overwriting c expanding keywords
128 % compare changenodes in a c
128 % compare changenodes in a c
129 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
129 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
130 do not process $Id:
130 do not process $Id:
131 xxx $
131 xxx $
132 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
132 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
133 tests for different changenodes
133 tests for different changenodes
134 % qinit -c
134 % qinit -c
135 % qimport
135 % qimport
136 % qcommit
136 % qcommit
137 % keywords should not be expanded in patch
137 % keywords should not be expanded in patch
138 # HG changeset patch
138 # HG changeset patch
139 # User User Name <user@example.com>
139 # User User Name <user@example.com>
140 # Date 1 0
140 # Date 1 0
141 # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
141 # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
142 # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
142 # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
143 cndiff
143 cndiff
144
144
145 diff -r ef63ca68695b -r 40a904bbbe4c c
145 diff -r ef63ca68695b -r 40a904bbbe4c c
146 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
146 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
147 +++ b/c Thu Jan 01 00:00:01 1970 +0000
147 +++ b/c Thu Jan 01 00:00:01 1970 +0000
148 @@ -0,0 +1,2 @@
148 @@ -0,0 +1,2 @@
149 +$Id$
149 +$Id$
150 +tests for different changenodes
150 +tests for different changenodes
151 % qpop
151 % qpop
152 popping mqtest.diff
152 popping mqtest.diff
153 patch queue now empty
153 patch queue now empty
154 % qgoto - should imply qpush
154 % qgoto - should imply qpush
155 applying mqtest.diff
155 applying mqtest.diff
156 now at: mqtest.diff
156 now at: mqtest.diff
157 % cat
157 % cat
158 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
158 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
159 tests for different changenodes
159 tests for different changenodes
160 % qpop and move on
160 % qpop and move on
161 popping mqtest.diff
161 popping mqtest.diff
162 patch queue now empty
162 patch queue now empty
163 % copy
163 % copy
164 % kwfiles added
164 % kwfiles added
165 a
165 a
166 c
166 c
167 % commit
167 % commit
168 c
168 c
169 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
169 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
170 overwriting c expanding keywords
170 overwriting c expanding keywords
171 committed changeset 2:e22d299ac0c2bd8897b3df5114374b9e4d4ca62f
171 committed changeset 2:e22d299ac0c2bd8897b3df5114374b9e4d4ca62f
172 % cat a c
172 % cat a c
173 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
173 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
174 do not process $Id:
174 do not process $Id:
175 xxx $
175 xxx $
176 expand $Id: c,v e22d299ac0c2 1970/01/01 00:00:01 user $
176 expand $Id: c,v e22d299ac0c2 1970/01/01 00:00:01 user $
177 do not process $Id:
177 do not process $Id:
178 xxx $
178 xxx $
179 % touch copied c
179 % touch copied c
180 % status
180 % status
181 % kwfiles
181 % kwfiles
182 a
182 a
183 c
183 c
184 % diff --rev
184 % diff --rev
185 diff -r ef63ca68695b c
185 diff -r ef63ca68695b c
186 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
186 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
187 @@ -0,0 +1,3 @@
187 @@ -0,0 +1,3 @@
188 +expand $Id$
188 +expand $Id$
189 +do not process $Id:
189 +do not process $Id:
190 +xxx $
190 +xxx $
191 % rollback
191 % rollback
192 rolling back last transaction
192 rolling back last transaction
193 % status
193 % status
194 A c
194 A c
195 % update -C
195 % update -C
196 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
196 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
197 % custom keyword expansion
197 % custom keyword expansion
198 % try with kwdemo
198 % try with kwdemo
199 [extensions]
199 [extensions]
200 hgext.keyword =
200 hgext.keyword =
201 [keyword]
201 [keyword]
202 * =
202 * =
203 b = ignore
203 b = ignore
204 demo.txt =
204 demo.txt =
205 [keywordmaps]
205 [keywordmaps]
206 Xinfo = {author}: {desc}
206 Xinfo = {author}: {desc}
207 $Xinfo: test: hg keyword config and expansion example $
207 $Xinfo: test: hg keyword config and expansion example $
208 % cat
208 % cat
209 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
209 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
210 do not process $Id:
210 do not process $Id:
211 xxx $
211 xxx $
212 ignore $Id$
212 ignore $Id$
213 % hg cat
213 % hg cat
214 expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
214 expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
215 do not process $Id:
215 do not process $Id:
216 xxx $
216 xxx $
217 ignore $Id$
217 ignore $Id$
218 a
218 a
219 % interrupted commit should not change state
219 % interrupted commit should not change state
220 abort: empty commit message
220 abort: empty commit message
221 % status
221 % status
222 M a
222 M a
223 ? c
223 ? c
224 ? log
224 ? log
225 % commit
225 % commit
226 a
226 a
227 overwriting a expanding keywords
227 overwriting a expanding keywords
228 committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83
228 committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83
229 % status
229 % status
230 ? c
230 ? c
231 % verify
231 % verify
232 checking changesets
232 checking changesets
233 checking manifests
233 checking manifests
234 crosschecking files in changesets and manifests
234 crosschecking files in changesets and manifests
235 checking files
235 checking files
236 3 files, 3 changesets, 4 total revisions
236 3 files, 3 changesets, 4 total revisions
237 % cat
237 % cat
238 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
238 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
239 do not process $Id:
239 do not process $Id:
240 xxx $
240 xxx $
241 $Xinfo: User Name <user@example.com>: firstline $
241 $Xinfo: User Name <user@example.com>: firstline $
242 ignore $Id$
242 ignore $Id$
243 % hg cat
243 % hg cat
244 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
244 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
245 do not process $Id:
245 do not process $Id:
246 xxx $
246 xxx $
247 $Xinfo: User Name <user@example.com>: firstline $
247 $Xinfo: User Name <user@example.com>: firstline $
248 ignore $Id$
248 ignore $Id$
249 a
249 a
250 % annotate
250 % annotate
251 1: expand $Id$
251 1: expand $Id$
252 1: do not process $Id:
252 1: do not process $Id:
253 1: xxx $
253 1: xxx $
254 2: $Xinfo$
254 2: $Xinfo$
255 % remove
255 % remove
256 committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012
256 committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012
257 % status
257 % status
258 ? c
258 ? c
259 % rollback
259 % rollback
260 rolling back last transaction
260 rolling back last transaction
261 % status
261 % status
262 R a
262 R a
263 ? c
263 ? c
264 % revert a
264 % revert a
265 % cat a
265 % cat a
266 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
266 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
267 do not process $Id:
267 do not process $Id:
268 xxx $
268 xxx $
269 $Xinfo: User Name <user@example.com>: firstline $
269 $Xinfo: User Name <user@example.com>: firstline $
270 % clone to test incoming
270 % clone to test incoming
271 requesting all changes
271 requesting all changes
272 adding changesets
272 adding changesets
273 adding manifests
273 adding manifests
274 adding file changes
274 adding file changes
275 added 2 changesets with 3 changes to 3 files
275 added 2 changesets with 3 changes to 3 files
276 updating working directory
276 updating working directory
277 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
277 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
278 % incoming
278 % incoming
279 comparing with test-keyword/Test
279 comparing with test-keyword/Test
280 searching for changes
280 searching for changes
281 changeset: 2:bb948857c743
281 changeset: 2:bb948857c743
282 tag: tip
282 tag: tip
283 user: User Name <user@example.com>
283 user: User Name <user@example.com>
284 date: Thu Jan 01 00:00:02 1970 +0000
284 date: Thu Jan 01 00:00:02 1970 +0000
285 summary: firstline
285 summary: firstline
286
286
287 % commit rejecttest
287 % commit rejecttest
288 a
288 a
289 overwriting a expanding keywords
289 overwriting a expanding keywords
290 committed changeset 2:85e279d709ffc28c9fdd1b868570985fc3d87082
290 committed changeset 2:85e279d709ffc28c9fdd1b868570985fc3d87082
291 % export
291 % export
292 % import
292 % import
293 applying ../rejecttest.diff
293 applying ../rejecttest.diff
294 % cat
294 % cat
295 expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
295 expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
296 do not process $Id: rejecttest
296 do not process $Id: rejecttest
297 xxx $
297 xxx $
298 $Xinfo: User Name <user@example.com>: rejects? $
298 $Xinfo: User Name <user@example.com>: rejects? $
299 ignore $Id$
299 ignore $Id$
300
300
301 % rollback
301 % rollback
302 rolling back last transaction
302 rolling back last transaction
303 % clean update
303 % clean update
304 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
304 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
305 % kwexpand/kwshrink on selected files
305 % kwexpand/kwshrink on selected files
306 % copy a x/a
306 % copy a x/a
307 % kwexpand a
307 % kwexpand a
308 overwriting a expanding keywords
308 overwriting a expanding keywords
309 % kwexpand x/a should abort
309 % kwexpand x/a should abort
310 abort: outstanding uncommitted changes
310 abort: outstanding uncommitted changes
311 x/a
311 x/a
312 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
312 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
313 overwriting x/a expanding keywords
313 overwriting x/a expanding keywords
314 committed changeset 3:cfa68229c1167443337266ebac453c73b1d5d16e
314 committed changeset 3:cfa68229c1167443337266ebac453c73b1d5d16e
315 % cat a
315 % cat a
316 expand $Id: x/a cfa68229c116 Thu, 01 Jan 1970 00:00:03 +0000 user $
316 expand $Id: x/a cfa68229c116 Thu, 01 Jan 1970 00:00:03 +0000 user $
317 do not process $Id:
317 do not process $Id:
318 xxx $
318 xxx $
319 $Xinfo: User Name <user@example.com>: xa $
319 $Xinfo: User Name <user@example.com>: xa $
320 % kwshrink a inside directory x
320 % kwshrink a inside directory x
321 overwriting x/a shrinking keywords
321 overwriting x/a shrinking keywords
322 % cat a
322 % cat a
323 expand $Id$
323 expand $Id$
324 do not process $Id:
324 do not process $Id:
325 xxx $
325 xxx $
326 $Xinfo$
326 $Xinfo$
327 % kwexpand nonexistent
327 % kwexpand nonexistent
328 nonexistent:
328 nonexistent:
329 % hg serve
329 % hg serve
330 % expansion
330 % expansion
331 % hgweb file
331 % hgweb file
332 200 Script output follows
332 200 Script output follows
333
333
334 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
334 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
335 do not process $Id:
335 do not process $Id:
336 xxx $
336 xxx $
337 $Xinfo: User Name <user@example.com>: firstline $
337 $Xinfo: User Name <user@example.com>: firstline $
338 % no expansion
338 % no expansion
339 % hgweb annotate
339 % hgweb annotate
340 200 Script output follows
340 200 Script output follows
341
341
342
342
343 user@1: expand $Id$
343 user@1: expand $Id$
344 user@1: do not process $Id:
344 user@1: do not process $Id:
345 user@1: xxx $
345 user@1: xxx $
346 user@2: $Xinfo$
346 user@2: $Xinfo$
347
347
348
348
349
349
350
350
351 % hgweb changeset
351 % hgweb changeset
352 200 Script output follows
352 200 Script output follows
353
353
354
354
355 # HG changeset patch
355 # HG changeset patch
356 # User User Name <user@example.com>
356 # User User Name <user@example.com>
357 # Date 3 0
357 # Date 3 0
358 # Node ID cfa68229c1167443337266ebac453c73b1d5d16e
358 # Node ID cfa68229c1167443337266ebac453c73b1d5d16e
359 # Parent bb948857c743469b22bbf51f7ec8112279ca5d83
359 # Parent bb948857c743469b22bbf51f7ec8112279ca5d83
360 xa
360 xa
361
361
362 diff -r bb948857c743 -r cfa68229c116 x/a
362 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
363 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
363 +++ b/x/a Thu Jan 01 00:00:03 1970 +0000
364 +++ b/x/a Thu Jan 01 00:00:03 1970 +0000
364 @@ -0,0 +1,4 @@
365 @@ -0,0 +1,4 @@
365 +expand $Id$
366 +expand $Id$
366 +do not process $Id:
367 +do not process $Id:
367 +xxx $
368 +xxx $
368 +$Xinfo$
369 +$Xinfo$
369
370
370 % hgweb filediff
371 % hgweb filediff
371 200 Script output follows
372 200 Script output follows
372
373
373
374
375 diff -r ef63ca68695b -r bb948857c743 a
374 --- a/a Thu Jan 01 00:00:00 1970 +0000
376 --- a/a Thu Jan 01 00:00:00 1970 +0000
375 +++ b/a Thu Jan 01 00:00:02 1970 +0000
377 +++ b/a Thu Jan 01 00:00:02 1970 +0000
376 @@ -1,3 +1,4 @@
378 @@ -1,3 +1,4 @@
377 expand $Id$
379 expand $Id$
378 do not process $Id:
380 do not process $Id:
379 xxx $
381 xxx $
380 +$Xinfo$
382 +$Xinfo$
381
383
382
384
383
385
384
386
385 % errors encountered
387 % errors encountered
386 % merge/resolve
388 % merge/resolve
387 % simplemerge
389 % simplemerge
388 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
390 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
389 created new head
391 created new head
390 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
392 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
391 (branch merge, don't forget to commit)
393 (branch merge, don't forget to commit)
392 $Id: m 8731e1dadc99 Thu, 01 Jan 1970 00:00:00 +0000 test $
394 $Id: m 8731e1dadc99 Thu, 01 Jan 1970 00:00:00 +0000 test $
393 foo
395 foo
394 % conflict
396 % conflict
395 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
397 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
396 created new head
398 created new head
397 merging m
399 merging m
398 warning: conflicts during merge.
400 warning: conflicts during merge.
399 merging m failed!
401 merging m failed!
400 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
402 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
401 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
403 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
402 % keyword stays outside conflict zone
404 % keyword stays outside conflict zone
403 $Id$
405 $Id$
404 <<<<<<< local
406 <<<<<<< local
405 bar
407 bar
406 =======
408 =======
407 foo
409 foo
408 >>>>>>> other
410 >>>>>>> other
409 % resolve to local
411 % resolve to local
410 $Id: m 43dfd2854b5b Thu, 01 Jan 1970 00:00:00 +0000 test $
412 $Id: m 43dfd2854b5b Thu, 01 Jan 1970 00:00:00 +0000 test $
411 bar
413 bar
412 % switch off expansion
414 % switch off expansion
413 % kwshrink with unknown file u
415 % kwshrink with unknown file u
414 overwriting a shrinking keywords
416 overwriting a shrinking keywords
415 overwriting m shrinking keywords
417 overwriting m shrinking keywords
416 overwriting x/a shrinking keywords
418 overwriting x/a shrinking keywords
417 % cat
419 % cat
418 expand $Id$
420 expand $Id$
419 do not process $Id:
421 do not process $Id:
420 xxx $
422 xxx $
421 $Xinfo$
423 $Xinfo$
422 ignore $Id$
424 ignore $Id$
423 % hg cat
425 % hg cat
424 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
426 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
425 do not process $Id:
427 do not process $Id:
426 xxx $
428 xxx $
427 $Xinfo: User Name <user@example.com>: firstline $
429 $Xinfo: User Name <user@example.com>: firstline $
428 ignore $Id$
430 ignore $Id$
429 a
431 a
430 % cat
432 % cat
431 expand $Id$
433 expand $Id$
432 do not process $Id:
434 do not process $Id:
433 xxx $
435 xxx $
434 $Xinfo$
436 $Xinfo$
435 ignore $Id$
437 ignore $Id$
436 % hg cat
438 % hg cat
437 expand $Id$
439 expand $Id$
438 do not process $Id:
440 do not process $Id:
439 xxx $
441 xxx $
440 $Xinfo$
442 $Xinfo$
441 ignore $Id$
443 ignore $Id$
442 a
444 a
General Comments 0
You need to be logged in to leave comments. Login now