##// END OF EJS Templates
hgweb: make graph page size equal to shortlog
Dirkjan Ochtman -
r10245:207b94f6 default
parent child Browse files
Show More
@@ -1,698 +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 style = web.config('web', 'style', 'paper')
239 style = web.config('web', 'style', 'paper')
240 if 'style' in req.form:
240 if 'style' in req.form:
241 style = req.form['style'][0]
241 style = req.form['style'][0]
242
242
243 diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
243 diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
244 return tmpl('changeset',
244 return tmpl('changeset',
245 diff=diffs,
245 diff=diffs,
246 rev=ctx.rev(),
246 rev=ctx.rev(),
247 node=ctx.hex(),
247 node=ctx.hex(),
248 parent=webutil.parents(ctx),
248 parent=webutil.parents(ctx),
249 child=webutil.children(ctx),
249 child=webutil.children(ctx),
250 changesettag=showtags,
250 changesettag=showtags,
251 changesetbranch=showbranch,
251 changesetbranch=showbranch,
252 author=ctx.user(),
252 author=ctx.user(),
253 desc=ctx.description(),
253 desc=ctx.description(),
254 date=ctx.date(),
254 date=ctx.date(),
255 files=files,
255 files=files,
256 archives=web.archivelist(ctx.hex()),
256 archives=web.archivelist(ctx.hex()),
257 tags=webutil.nodetagsdict(web.repo, ctx.node()),
257 tags=webutil.nodetagsdict(web.repo, ctx.node()),
258 branch=webutil.nodebranchnodefault(ctx),
258 branch=webutil.nodebranchnodefault(ctx),
259 inbranch=webutil.nodeinbranch(web.repo, ctx),
259 inbranch=webutil.nodeinbranch(web.repo, ctx),
260 branches=webutil.nodebranchdict(web.repo, ctx))
260 branches=webutil.nodebranchdict(web.repo, ctx))
261
261
262 rev = changeset
262 rev = changeset
263
263
264 def manifest(web, req, tmpl):
264 def manifest(web, req, tmpl):
265 ctx = webutil.changectx(web.repo, req)
265 ctx = webutil.changectx(web.repo, req)
266 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
266 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
267 mf = ctx.manifest()
267 mf = ctx.manifest()
268 node = ctx.node()
268 node = ctx.node()
269
269
270 files = {}
270 files = {}
271 dirs = {}
271 dirs = {}
272 parity = paritygen(web.stripecount)
272 parity = paritygen(web.stripecount)
273
273
274 if path and path[-1] != "/":
274 if path and path[-1] != "/":
275 path += "/"
275 path += "/"
276 l = len(path)
276 l = len(path)
277 abspath = "/" + path
277 abspath = "/" + path
278
278
279 for f, n in mf.iteritems():
279 for f, n in mf.iteritems():
280 if f[:l] != path:
280 if f[:l] != path:
281 continue
281 continue
282 remain = f[l:]
282 remain = f[l:]
283 elements = remain.split('/')
283 elements = remain.split('/')
284 if len(elements) == 1:
284 if len(elements) == 1:
285 files[remain] = f
285 files[remain] = f
286 else:
286 else:
287 h = dirs # need to retain ref to dirs (root)
287 h = dirs # need to retain ref to dirs (root)
288 for elem in elements[0:-1]:
288 for elem in elements[0:-1]:
289 if elem not in h:
289 if elem not in h:
290 h[elem] = {}
290 h[elem] = {}
291 h = h[elem]
291 h = h[elem]
292 if len(h) > 1:
292 if len(h) > 1:
293 break
293 break
294 h[None] = None # denotes files present
294 h[None] = None # denotes files present
295
295
296 if mf and not files and not dirs:
296 if mf and not files and not dirs:
297 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
297 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
298
298
299 def filelist(**map):
299 def filelist(**map):
300 for f in sorted(files):
300 for f in sorted(files):
301 full = files[f]
301 full = files[f]
302
302
303 fctx = ctx.filectx(full)
303 fctx = ctx.filectx(full)
304 yield {"file": full,
304 yield {"file": full,
305 "parity": parity.next(),
305 "parity": parity.next(),
306 "basename": f,
306 "basename": f,
307 "date": fctx.date(),
307 "date": fctx.date(),
308 "size": fctx.size(),
308 "size": fctx.size(),
309 "permissions": mf.flags(full)}
309 "permissions": mf.flags(full)}
310
310
311 def dirlist(**map):
311 def dirlist(**map):
312 for d in sorted(dirs):
312 for d in sorted(dirs):
313
313
314 emptydirs = []
314 emptydirs = []
315 h = dirs[d]
315 h = dirs[d]
316 while isinstance(h, dict) and len(h) == 1:
316 while isinstance(h, dict) and len(h) == 1:
317 k,v = h.items()[0]
317 k,v = h.items()[0]
318 if v:
318 if v:
319 emptydirs.append(k)
319 emptydirs.append(k)
320 h = v
320 h = v
321
321
322 path = "%s%s" % (abspath, d)
322 path = "%s%s" % (abspath, d)
323 yield {"parity": parity.next(),
323 yield {"parity": parity.next(),
324 "path": path,
324 "path": path,
325 "emptydirs": "/".join(emptydirs),
325 "emptydirs": "/".join(emptydirs),
326 "basename": d}
326 "basename": d}
327
327
328 return tmpl("manifest",
328 return tmpl("manifest",
329 rev=ctx.rev(),
329 rev=ctx.rev(),
330 node=hex(node),
330 node=hex(node),
331 path=abspath,
331 path=abspath,
332 up=webutil.up(abspath),
332 up=webutil.up(abspath),
333 upparity=parity.next(),
333 upparity=parity.next(),
334 fentries=filelist,
334 fentries=filelist,
335 dentries=dirlist,
335 dentries=dirlist,
336 archives=web.archivelist(hex(node)),
336 archives=web.archivelist(hex(node)),
337 tags=webutil.nodetagsdict(web.repo, node),
337 tags=webutil.nodetagsdict(web.repo, node),
338 inbranch=webutil.nodeinbranch(web.repo, ctx),
338 inbranch=webutil.nodeinbranch(web.repo, ctx),
339 branches=webutil.nodebranchdict(web.repo, ctx))
339 branches=webutil.nodebranchdict(web.repo, ctx))
340
340
341 def tags(web, req, tmpl):
341 def tags(web, req, tmpl):
342 i = web.repo.tagslist()
342 i = web.repo.tagslist()
343 i.reverse()
343 i.reverse()
344 parity = paritygen(web.stripecount)
344 parity = paritygen(web.stripecount)
345
345
346 def entries(notip=False, limit=0, **map):
346 def entries(notip=False, limit=0, **map):
347 count = 0
347 count = 0
348 for k, n in i:
348 for k, n in i:
349 if notip and k == "tip":
349 if notip and k == "tip":
350 continue
350 continue
351 if limit > 0 and count >= limit:
351 if limit > 0 and count >= limit:
352 continue
352 continue
353 count = count + 1
353 count = count + 1
354 yield {"parity": parity.next(),
354 yield {"parity": parity.next(),
355 "tag": k,
355 "tag": k,
356 "date": web.repo[n].date(),
356 "date": web.repo[n].date(),
357 "node": hex(n)}
357 "node": hex(n)}
358
358
359 return tmpl("tags",
359 return tmpl("tags",
360 node=hex(web.repo.changelog.tip()),
360 node=hex(web.repo.changelog.tip()),
361 entries=lambda **x: entries(False,0, **x),
361 entries=lambda **x: entries(False,0, **x),
362 entriesnotip=lambda **x: entries(True,0, **x),
362 entriesnotip=lambda **x: entries(True,0, **x),
363 latestentry=lambda **x: entries(True,1, **x))
363 latestentry=lambda **x: entries(True,1, **x))
364
364
365 def branches(web, req, tmpl):
365 def branches(web, req, tmpl):
366 b = web.repo.branchtags()
366 b = web.repo.branchtags()
367 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())
368 heads = web.repo.heads()
368 heads = web.repo.heads()
369 parity = paritygen(web.stripecount)
369 parity = paritygen(web.stripecount)
370 sortkey = lambda ctx: ('close' not in ctx.extra(), ctx.rev())
370 sortkey = lambda ctx: ('close' not in ctx.extra(), ctx.rev())
371
371
372 def entries(limit, **map):
372 def entries(limit, **map):
373 count = 0
373 count = 0
374 for ctx in sorted(tips, key=sortkey, reverse=True):
374 for ctx in sorted(tips, key=sortkey, reverse=True):
375 if limit > 0 and count >= limit:
375 if limit > 0 and count >= limit:
376 return
376 return
377 count += 1
377 count += 1
378 if ctx.node() not in heads:
378 if ctx.node() not in heads:
379 status = 'inactive'
379 status = 'inactive'
380 elif not web.repo.branchheads(ctx.branch()):
380 elif not web.repo.branchheads(ctx.branch()):
381 status = 'closed'
381 status = 'closed'
382 else:
382 else:
383 status = 'open'
383 status = 'open'
384 yield {'parity': parity.next(),
384 yield {'parity': parity.next(),
385 'branch': ctx.branch(),
385 'branch': ctx.branch(),
386 'status': status,
386 'status': status,
387 'node': ctx.hex(),
387 'node': ctx.hex(),
388 'date': ctx.date()}
388 'date': ctx.date()}
389
389
390 return tmpl('branches', node=hex(web.repo.changelog.tip()),
390 return tmpl('branches', node=hex(web.repo.changelog.tip()),
391 entries=lambda **x: entries(0, **x),
391 entries=lambda **x: entries(0, **x),
392 latestentry=lambda **x: entries(1, **x))
392 latestentry=lambda **x: entries(1, **x))
393
393
394 def summary(web, req, tmpl):
394 def summary(web, req, tmpl):
395 i = web.repo.tagslist()
395 i = web.repo.tagslist()
396 i.reverse()
396 i.reverse()
397
397
398 def tagentries(**map):
398 def tagentries(**map):
399 parity = paritygen(web.stripecount)
399 parity = paritygen(web.stripecount)
400 count = 0
400 count = 0
401 for k, n in i:
401 for k, n in i:
402 if k == "tip": # skip tip
402 if k == "tip": # skip tip
403 continue
403 continue
404
404
405 count += 1
405 count += 1
406 if count > 10: # limit to 10 tags
406 if count > 10: # limit to 10 tags
407 break
407 break
408
408
409 yield tmpl("tagentry",
409 yield tmpl("tagentry",
410 parity=parity.next(),
410 parity=parity.next(),
411 tag=k,
411 tag=k,
412 node=hex(n),
412 node=hex(n),
413 date=web.repo[n].date())
413 date=web.repo[n].date())
414
414
415 def branches(**map):
415 def branches(**map):
416 parity = paritygen(web.stripecount)
416 parity = paritygen(web.stripecount)
417
417
418 b = web.repo.branchtags()
418 b = web.repo.branchtags()
419 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()]
420 for r,n,t in sorted(l):
420 for r,n,t in sorted(l):
421 yield {'parity': parity.next(),
421 yield {'parity': parity.next(),
422 'branch': t,
422 'branch': t,
423 'node': hex(n),
423 'node': hex(n),
424 'date': web.repo[n].date()}
424 'date': web.repo[n].date()}
425
425
426 def changelist(**map):
426 def changelist(**map):
427 parity = paritygen(web.stripecount, offset=start-end)
427 parity = paritygen(web.stripecount, offset=start-end)
428 l = [] # build a list in forward order for efficiency
428 l = [] # build a list in forward order for efficiency
429 for i in xrange(start, end):
429 for i in xrange(start, end):
430 ctx = web.repo[i]
430 ctx = web.repo[i]
431 n = ctx.node()
431 n = ctx.node()
432 hn = hex(n)
432 hn = hex(n)
433
433
434 l.insert(0, tmpl(
434 l.insert(0, tmpl(
435 'shortlogentry',
435 'shortlogentry',
436 parity=parity.next(),
436 parity=parity.next(),
437 author=ctx.user(),
437 author=ctx.user(),
438 desc=ctx.description(),
438 desc=ctx.description(),
439 date=ctx.date(),
439 date=ctx.date(),
440 rev=i,
440 rev=i,
441 node=hn,
441 node=hn,
442 tags=webutil.nodetagsdict(web.repo, n),
442 tags=webutil.nodetagsdict(web.repo, n),
443 inbranch=webutil.nodeinbranch(web.repo, ctx),
443 inbranch=webutil.nodeinbranch(web.repo, ctx),
444 branches=webutil.nodebranchdict(web.repo, ctx)))
444 branches=webutil.nodebranchdict(web.repo, ctx)))
445
445
446 yield l
446 yield l
447
447
448 cl = web.repo.changelog
448 cl = web.repo.changelog
449 count = len(cl)
449 count = len(cl)
450 start = max(0, count - web.maxchanges)
450 start = max(0, count - web.maxchanges)
451 end = min(count, start + web.maxchanges)
451 end = min(count, start + web.maxchanges)
452
452
453 return tmpl("summary",
453 return tmpl("summary",
454 desc=web.config("web", "description", "unknown"),
454 desc=web.config("web", "description", "unknown"),
455 owner=get_contact(web.config) or "unknown",
455 owner=get_contact(web.config) or "unknown",
456 lastchange=cl.read(cl.tip())[2],
456 lastchange=cl.read(cl.tip())[2],
457 tags=tagentries,
457 tags=tagentries,
458 branches=branches,
458 branches=branches,
459 shortlog=changelist,
459 shortlog=changelist,
460 node=hex(cl.tip()),
460 node=hex(cl.tip()),
461 archives=web.archivelist("tip"))
461 archives=web.archivelist("tip"))
462
462
463 def filediff(web, req, tmpl):
463 def filediff(web, req, tmpl):
464 fctx, ctx = None, None
464 fctx, ctx = None, None
465 try:
465 try:
466 fctx = webutil.filectx(web.repo, req)
466 fctx = webutil.filectx(web.repo, req)
467 except LookupError:
467 except LookupError:
468 ctx = webutil.changectx(web.repo, req)
468 ctx = webutil.changectx(web.repo, req)
469 path = webutil.cleanpath(web.repo, req.form['file'][0])
469 path = webutil.cleanpath(web.repo, req.form['file'][0])
470 if path not in ctx.files():
470 if path not in ctx.files():
471 raise
471 raise
472
472
473 if fctx is not None:
473 if fctx is not None:
474 n = fctx.node()
474 n = fctx.node()
475 path = fctx.path()
475 path = fctx.path()
476 else:
476 else:
477 n = ctx.node()
477 n = ctx.node()
478 # path already defined in except clause
478 # path already defined in except clause
479
479
480 parity = paritygen(web.stripecount)
480 parity = paritygen(web.stripecount)
481 style = web.config('web', 'style', 'paper')
481 style = web.config('web', 'style', 'paper')
482 if 'style' in req.form:
482 if 'style' in req.form:
483 style = req.form['style'][0]
483 style = req.form['style'][0]
484
484
485 diffs = webutil.diffs(web.repo, tmpl, fctx or ctx, [path], parity, style)
485 diffs = webutil.diffs(web.repo, tmpl, fctx or ctx, [path], parity, style)
486 rename = fctx and webutil.renamelink(fctx) or []
486 rename = fctx and webutil.renamelink(fctx) or []
487 ctx = fctx and fctx or ctx
487 ctx = fctx and fctx or ctx
488 return tmpl("filediff",
488 return tmpl("filediff",
489 file=path,
489 file=path,
490 node=hex(n),
490 node=hex(n),
491 rev=ctx.rev(),
491 rev=ctx.rev(),
492 date=ctx.date(),
492 date=ctx.date(),
493 desc=ctx.description(),
493 desc=ctx.description(),
494 author=ctx.user(),
494 author=ctx.user(),
495 rename=rename,
495 rename=rename,
496 branch=webutil.nodebranchnodefault(ctx),
496 branch=webutil.nodebranchnodefault(ctx),
497 parent=webutil.parents(ctx),
497 parent=webutil.parents(ctx),
498 child=webutil.children(ctx),
498 child=webutil.children(ctx),
499 diff=diffs)
499 diff=diffs)
500
500
501 diff = filediff
501 diff = filediff
502
502
503 def annotate(web, req, tmpl):
503 def annotate(web, req, tmpl):
504 fctx = webutil.filectx(web.repo, req)
504 fctx = webutil.filectx(web.repo, req)
505 f = fctx.path()
505 f = fctx.path()
506 parity = paritygen(web.stripecount)
506 parity = paritygen(web.stripecount)
507
507
508 def annotate(**map):
508 def annotate(**map):
509 last = None
509 last = None
510 if binary(fctx.data()):
510 if binary(fctx.data()):
511 mt = (mimetypes.guess_type(fctx.path())[0]
511 mt = (mimetypes.guess_type(fctx.path())[0]
512 or 'application/octet-stream')
512 or 'application/octet-stream')
513 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
513 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
514 '(binary:%s)' % mt)])
514 '(binary:%s)' % mt)])
515 else:
515 else:
516 lines = enumerate(fctx.annotate(follow=True, linenumber=True))
516 lines = enumerate(fctx.annotate(follow=True, linenumber=True))
517 for lineno, ((f, targetline), l) in lines:
517 for lineno, ((f, targetline), l) in lines:
518 fnode = f.filenode()
518 fnode = f.filenode()
519
519
520 if last != fnode:
520 if last != fnode:
521 last = fnode
521 last = fnode
522
522
523 yield {"parity": parity.next(),
523 yield {"parity": parity.next(),
524 "node": hex(f.node()),
524 "node": hex(f.node()),
525 "rev": f.rev(),
525 "rev": f.rev(),
526 "author": f.user(),
526 "author": f.user(),
527 "desc": f.description(),
527 "desc": f.description(),
528 "file": f.path(),
528 "file": f.path(),
529 "targetline": targetline,
529 "targetline": targetline,
530 "line": l,
530 "line": l,
531 "lineid": "l%d" % (lineno + 1),
531 "lineid": "l%d" % (lineno + 1),
532 "linenumber": "% 6d" % (lineno + 1)}
532 "linenumber": "% 6d" % (lineno + 1)}
533
533
534 return tmpl("fileannotate",
534 return tmpl("fileannotate",
535 file=f,
535 file=f,
536 annotate=annotate,
536 annotate=annotate,
537 path=webutil.up(f),
537 path=webutil.up(f),
538 rev=fctx.rev(),
538 rev=fctx.rev(),
539 node=hex(fctx.node()),
539 node=hex(fctx.node()),
540 author=fctx.user(),
540 author=fctx.user(),
541 date=fctx.date(),
541 date=fctx.date(),
542 desc=fctx.description(),
542 desc=fctx.description(),
543 rename=webutil.renamelink(fctx),
543 rename=webutil.renamelink(fctx),
544 branch=webutil.nodebranchnodefault(fctx),
544 branch=webutil.nodebranchnodefault(fctx),
545 parent=webutil.parents(fctx),
545 parent=webutil.parents(fctx),
546 child=webutil.children(fctx),
546 child=webutil.children(fctx),
547 permissions=fctx.manifest().flags(f))
547 permissions=fctx.manifest().flags(f))
548
548
549 def filelog(web, req, tmpl):
549 def filelog(web, req, tmpl):
550
550
551 try:
551 try:
552 fctx = webutil.filectx(web.repo, req)
552 fctx = webutil.filectx(web.repo, req)
553 f = fctx.path()
553 f = fctx.path()
554 fl = fctx.filelog()
554 fl = fctx.filelog()
555 except error.LookupError:
555 except error.LookupError:
556 f = webutil.cleanpath(web.repo, req.form['file'][0])
556 f = webutil.cleanpath(web.repo, req.form['file'][0])
557 fl = web.repo.file(f)
557 fl = web.repo.file(f)
558 numrevs = len(fl)
558 numrevs = len(fl)
559 if not numrevs: # file doesn't exist at all
559 if not numrevs: # file doesn't exist at all
560 raise
560 raise
561 rev = webutil.changectx(web.repo, req).rev()
561 rev = webutil.changectx(web.repo, req).rev()
562 first = fl.linkrev(0)
562 first = fl.linkrev(0)
563 if rev < first: # current rev is from before file existed
563 if rev < first: # current rev is from before file existed
564 raise
564 raise
565 frev = numrevs - 1
565 frev = numrevs - 1
566 while fl.linkrev(frev) > rev:
566 while fl.linkrev(frev) > rev:
567 frev -= 1
567 frev -= 1
568 fctx = web.repo.filectx(f, fl.linkrev(frev))
568 fctx = web.repo.filectx(f, fl.linkrev(frev))
569
569
570 count = fctx.filerev() + 1
570 count = fctx.filerev() + 1
571 pagelen = web.maxshortchanges
571 pagelen = web.maxshortchanges
572 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
573 end = min(count, start + pagelen) # last rev on this page
573 end = min(count, start + pagelen) # last rev on this page
574 parity = paritygen(web.stripecount, offset=start-end)
574 parity = paritygen(web.stripecount, offset=start-end)
575
575
576 def entries(limit=0, **map):
576 def entries(limit=0, **map):
577 l = []
577 l = []
578
578
579 repo = web.repo
579 repo = web.repo
580 for i in xrange(start, end):
580 for i in xrange(start, end):
581 iterfctx = fctx.filectx(i)
581 iterfctx = fctx.filectx(i)
582
582
583 l.insert(0, {"parity": parity.next(),
583 l.insert(0, {"parity": parity.next(),
584 "filerev": i,
584 "filerev": i,
585 "file": f,
585 "file": f,
586 "node": hex(iterfctx.node()),
586 "node": hex(iterfctx.node()),
587 "author": iterfctx.user(),
587 "author": iterfctx.user(),
588 "date": iterfctx.date(),
588 "date": iterfctx.date(),
589 "rename": webutil.renamelink(iterfctx),
589 "rename": webutil.renamelink(iterfctx),
590 "parent": webutil.parents(iterfctx),
590 "parent": webutil.parents(iterfctx),
591 "child": webutil.children(iterfctx),
591 "child": webutil.children(iterfctx),
592 "desc": iterfctx.description(),
592 "desc": iterfctx.description(),
593 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
593 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
594 "branch": webutil.nodebranchnodefault(iterfctx),
594 "branch": webutil.nodebranchnodefault(iterfctx),
595 "inbranch": webutil.nodeinbranch(repo, iterfctx),
595 "inbranch": webutil.nodeinbranch(repo, iterfctx),
596 "branches": webutil.nodebranchdict(repo, iterfctx)})
596 "branches": webutil.nodebranchdict(repo, iterfctx)})
597
597
598 if limit > 0:
598 if limit > 0:
599 l = l[:limit]
599 l = l[:limit]
600
600
601 for e in l:
601 for e in l:
602 yield e
602 yield e
603
603
604 nodefunc = lambda x: fctx.filectx(fileid=x)
604 nodefunc = lambda x: fctx.filectx(fileid=x)
605 nav = webutil.revnavgen(end - 1, pagelen, count, nodefunc)
605 nav = webutil.revnavgen(end - 1, pagelen, count, nodefunc)
606 return tmpl("filelog", file=f, node=hex(fctx.node()), nav=nav,
606 return tmpl("filelog", file=f, node=hex(fctx.node()), nav=nav,
607 entries=lambda **x: entries(limit=0, **x),
607 entries=lambda **x: entries(limit=0, **x),
608 latestentry=lambda **x: entries(limit=1, **x))
608 latestentry=lambda **x: entries(limit=1, **x))
609
609
610
610
611 def archive(web, req, tmpl):
611 def archive(web, req, tmpl):
612 type_ = req.form.get('type', [None])[0]
612 type_ = req.form.get('type', [None])[0]
613 allowed = web.configlist("web", "allow_archive")
613 allowed = web.configlist("web", "allow_archive")
614 key = req.form['node'][0]
614 key = req.form['node'][0]
615
615
616 if type_ not in web.archives:
616 if type_ not in web.archives:
617 msg = 'Unsupported archive type: %s' % type_
617 msg = 'Unsupported archive type: %s' % type_
618 raise ErrorResponse(HTTP_NOT_FOUND, msg)
618 raise ErrorResponse(HTTP_NOT_FOUND, msg)
619
619
620 if not ((type_ in allowed or
620 if not ((type_ in allowed or
621 web.configbool("web", "allow" + type_, False))):
621 web.configbool("web", "allow" + type_, False))):
622 msg = 'Archive type not allowed: %s' % type_
622 msg = 'Archive type not allowed: %s' % type_
623 raise ErrorResponse(HTTP_FORBIDDEN, msg)
623 raise ErrorResponse(HTTP_FORBIDDEN, msg)
624
624
625 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
625 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
626 cnode = web.repo.lookup(key)
626 cnode = web.repo.lookup(key)
627 arch_version = key
627 arch_version = key
628 if cnode == key or key == 'tip':
628 if cnode == key or key == 'tip':
629 arch_version = short(cnode)
629 arch_version = short(cnode)
630 name = "%s-%s" % (reponame, arch_version)
630 name = "%s-%s" % (reponame, arch_version)
631 mimetype, artype, extension, encoding = web.archive_specs[type_]
631 mimetype, artype, extension, encoding = web.archive_specs[type_]
632 headers = [
632 headers = [
633 ('Content-Type', mimetype),
633 ('Content-Type', mimetype),
634 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
634 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
635 ]
635 ]
636 if encoding:
636 if encoding:
637 headers.append(('Content-Encoding', encoding))
637 headers.append(('Content-Encoding', encoding))
638 req.header(headers)
638 req.header(headers)
639 req.respond(HTTP_OK)
639 req.respond(HTTP_OK)
640 archival.archive(web.repo, req, cnode, artype, prefix=name)
640 archival.archive(web.repo, req, cnode, artype, prefix=name)
641 return []
641 return []
642
642
643
643
644 def static(web, req, tmpl):
644 def static(web, req, tmpl):
645 fname = req.form['file'][0]
645 fname = req.form['file'][0]
646 # 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
647 # readable by the user running the CGI script
647 # readable by the user running the CGI script
648 static = web.config("web", "static", None, untrusted=False)
648 static = web.config("web", "static", None, untrusted=False)
649 if not static:
649 if not static:
650 tp = web.templatepath or templater.templatepath()
650 tp = web.templatepath or templater.templatepath()
651 if isinstance(tp, str):
651 if isinstance(tp, str):
652 tp = [tp]
652 tp = [tp]
653 static = [os.path.join(p, 'static') for p in tp]
653 static = [os.path.join(p, 'static') for p in tp]
654 return [staticfile(static, fname, req)]
654 return [staticfile(static, fname, req)]
655
655
656 def graph(web, req, tmpl):
656 def graph(web, req, tmpl):
657
657 rev = webutil.changectx(web.repo, req).rev()
658 rev = webutil.changectx(web.repo, req).rev()
658 bg_height = 39
659 bg_height = 39
659
660 revcount = web.maxshortchanges
660 revcount = 25
661 if 'revcount' in req.form:
661 if 'revcount' in req.form:
662 revcount = int(req.form.get('revcount', [revcount])[0])
662 revcount = int(req.form.get('revcount', [revcount])[0])
663 tmpl.defaults['sessionvars']['revcount'] = revcount
663 tmpl.defaults['sessionvars']['revcount'] = revcount
664
664
665 lessvars = copy.copy(tmpl.defaults['sessionvars'])
665 lessvars = copy.copy(tmpl.defaults['sessionvars'])
666 lessvars['revcount'] = revcount / 2
666 lessvars['revcount'] = revcount / 2
667 morevars = copy.copy(tmpl.defaults['sessionvars'])
667 morevars = copy.copy(tmpl.defaults['sessionvars'])
668 morevars['revcount'] = revcount * 2
668 morevars['revcount'] = revcount * 2
669
669
670 max_rev = len(web.repo) - 1
670 max_rev = len(web.repo) - 1
671 revcount = min(max_rev, revcount)
671 revcount = min(max_rev, revcount)
672 revnode = web.repo.changelog.node(rev)
672 revnode = web.repo.changelog.node(rev)
673 revnode_hex = hex(revnode)
673 revnode_hex = hex(revnode)
674 uprev = min(max_rev, rev + revcount)
674 uprev = min(max_rev, rev + revcount)
675 downrev = max(0, rev - revcount)
675 downrev = max(0, rev - revcount)
676 count = len(web.repo)
676 count = len(web.repo)
677 changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx)
677 changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx)
678
678
679 dag = graphmod.revisions(web.repo, rev, downrev)
679 dag = graphmod.revisions(web.repo, rev, downrev)
680 tree = list(graphmod.colored(dag))
680 tree = list(graphmod.colored(dag))
681 canvasheight = (len(tree) + 1) * bg_height - 27;
681 canvasheight = (len(tree) + 1) * bg_height - 27;
682 data = []
682 data = []
683 for (id, type, ctx, vtx, edges) in tree:
683 for (id, type, ctx, vtx, edges) in tree:
684 if type != graphmod.CHANGESET:
684 if type != graphmod.CHANGESET:
685 continue
685 continue
686 node = short(ctx.node())
686 node = short(ctx.node())
687 age = templatefilters.age(ctx.date())
687 age = templatefilters.age(ctx.date())
688 desc = templatefilters.firstline(ctx.description())
688 desc = templatefilters.firstline(ctx.description())
689 desc = cgi.escape(templatefilters.nonempty(desc))
689 desc = cgi.escape(templatefilters.nonempty(desc))
690 user = cgi.escape(templatefilters.person(ctx.user()))
690 user = cgi.escape(templatefilters.person(ctx.user()))
691 branch = ctx.branch()
691 branch = ctx.branch()
692 branch = branch, web.repo.branchtags().get(branch) == ctx.node()
692 branch = branch, web.repo.branchtags().get(branch) == ctx.node()
693 data.append((node, vtx, edges, desc, user, age, branch, ctx.tags()))
693 data.append((node, vtx, edges, desc, user, age, branch, ctx.tags()))
694
694
695 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
695 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
696 lessvars=lessvars, morevars=morevars, downrev=downrev,
696 lessvars=lessvars, morevars=morevars, downrev=downrev,
697 canvasheight=canvasheight, jsdata=data, bg_height=bg_height,
697 canvasheight=canvasheight, jsdata=data, bg_height=bg_height,
698 node=revnode_hex, changenav=changenav)
698 node=revnode_hex, changenav=changenav)
@@ -1,906 +1,906
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/1d22e65f027e"/>
20 <link href="http://127.0.0.1/rev/1d22e65f027e"/>
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/a4f92ed23982"/>
36 <link href="http://127.0.0.1/rev/a4f92ed23982"/>
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/2ef0ac749a14"/>
52 <link href="http://127.0.0.1/rev/2ef0ac749a14"/>
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/1d22e65f027e"/>
81 <link href="http://127.0.0.1/rev/1d22e65f027e"/>
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/a4f92ed23982"/>
97 <link href="http://127.0.0.1/rev/a4f92ed23982"/>
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/2ef0ac749a14"/>
113 <link href="http://127.0.0.1/rev/2ef0ac749a14"/>
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/2ef0ac749a14"/>
140 <link href="http://127.0.0.1/rev/2ef0ac749a14"/>
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">1970-01-01</td>
213 <td class="age">1970-01-01</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">1970-01-01</td>
218 <td class="age">1970-01-01</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">1970-01-01</td>
223 <td class="age">1970-01-01</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 (1970-01-01)</td></tr>
294 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</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 diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
341 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
341 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
342 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
342 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
343 @@ -0,0 +1,1 @@
343 @@ -0,0 +1,1 @@
344 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
344 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
345
345
346 % File-related
346 % File-related
347 200 Script output follows
347 200 Script output follows
348
348
349 foo
349 foo
350 200 Script output follows
350 200 Script output follows
351
351
352
352
353 test@0: foo
353 test@0: foo
354
354
355
355
356
356
357
357
358 200 Script output follows
358 200 Script output follows
359
359
360
360
361 drwxr-xr-x da
361 drwxr-xr-x da
362 -rw-r--r-- 45 .hgtags
362 -rw-r--r-- 45 .hgtags
363 -rw-r--r-- 4 foo
363 -rw-r--r-- 4 foo
364
364
365
365
366 200 Script output follows
366 200 Script output follows
367
367
368 <!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">
369 <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">
370 <head>
370 <head>
371 <link rel="icon" href="/static/hgicon.png" type="image/png" />
371 <link rel="icon" href="/static/hgicon.png" type="image/png" />
372 <meta name="robots" content="index, nofollow" />
372 <meta name="robots" content="index, nofollow" />
373 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
373 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
374
374
375 <title>test: a4f92ed23982 foo</title>
375 <title>test: a4f92ed23982 foo</title>
376 </head>
376 </head>
377 <body>
377 <body>
378
378
379 <div class="container">
379 <div class="container">
380 <div class="menu">
380 <div class="menu">
381 <div class="logo">
381 <div class="logo">
382 <a href="http://mercurial.selenic.com/">
382 <a href="http://mercurial.selenic.com/">
383 <img src="/static/hglogo.png" alt="mercurial" /></a>
383 <img src="/static/hglogo.png" alt="mercurial" /></a>
384 </div>
384 </div>
385 <ul>
385 <ul>
386 <li><a href="/shortlog/a4f92ed23982">log</a></li>
386 <li><a href="/shortlog/a4f92ed23982">log</a></li>
387 <li><a href="/graph/a4f92ed23982">graph</a></li>
387 <li><a href="/graph/a4f92ed23982">graph</a></li>
388 <li><a href="/tags">tags</a></li>
388 <li><a href="/tags">tags</a></li>
389 <li><a href="/branches">branches</a></li>
389 <li><a href="/branches">branches</a></li>
390 </ul>
390 </ul>
391 <ul>
391 <ul>
392 <li><a href="/rev/a4f92ed23982">changeset</a></li>
392 <li><a href="/rev/a4f92ed23982">changeset</a></li>
393 <li><a href="/file/a4f92ed23982/">browse</a></li>
393 <li><a href="/file/a4f92ed23982/">browse</a></li>
394 </ul>
394 </ul>
395 <ul>
395 <ul>
396 <li class="active">file</li>
396 <li class="active">file</li>
397 <li><a href="/file/tip/foo">latest</a></li>
397 <li><a href="/file/tip/foo">latest</a></li>
398 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
398 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
399 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
399 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
400 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
400 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
401 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
401 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
402 </ul>
402 </ul>
403 </div>
403 </div>
404
404
405 <div class="main">
405 <div class="main">
406 <h2><a href="/">test</a></h2>
406 <h2><a href="/">test</a></h2>
407 <h3>view foo @ 1:a4f92ed23982</h3>
407 <h3>view foo @ 1:a4f92ed23982</h3>
408
408
409 <form class="search" action="/log">
409 <form class="search" action="/log">
410
410
411 <p><input name="rev" id="search1" type="text" size="30" /></p>
411 <p><input name="rev" id="search1" type="text" size="30" /></p>
412 <div id="hint">find changesets by author, revision,
412 <div id="hint">find changesets by author, revision,
413 files, or words in the commit message</div>
413 files, or words in the commit message</div>
414 </form>
414 </form>
415
415
416 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
416 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
417
417
418 <table id="changesetEntry">
418 <table id="changesetEntry">
419 <tr>
419 <tr>
420 <th class="author">author</th>
420 <th class="author">author</th>
421 <td class="author">&#116;&#101;&#115;&#116;</td>
421 <td class="author">&#116;&#101;&#115;&#116;</td>
422 </tr>
422 </tr>
423 <tr>
423 <tr>
424 <th class="date">date</th>
424 <th class="date">date</th>
425 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
425 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
426 </tr>
426 </tr>
427 <tr>
427 <tr>
428 <th class="author">parents</th>
428 <th class="author">parents</th>
429 <td class="author"></td>
429 <td class="author"></td>
430 </tr>
430 </tr>
431 <tr>
431 <tr>
432 <th class="author">children</th>
432 <th class="author">children</th>
433 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
433 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
434 </tr>
434 </tr>
435
435
436 </table>
436 </table>
437
437
438 <div class="overflow">
438 <div class="overflow">
439 <div class="sourcefirst"> line source</div>
439 <div class="sourcefirst"> line source</div>
440
440
441 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
441 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
442 </div>
442 </div>
443 <div class="sourcelast"></div>
443 <div class="sourcelast"></div>
444 </div>
444 </div>
445 </div>
445 </div>
446 </div>
446 </div>
447
447
448
448
449
449
450 </body>
450 </body>
451 </html>
451 </html>
452
452
453 200 Script output follows
453 200 Script output follows
454
454
455
455
456 diff -r 000000000000 -r a4f92ed23982 foo
456 diff -r 000000000000 -r a4f92ed23982 foo
457 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
457 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
458 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
458 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
459 @@ -0,0 +1,1 @@
459 @@ -0,0 +1,1 @@
460 +foo
460 +foo
461
461
462
462
463
463
464
464
465 % Overviews
465 % Overviews
466 200 Script output follows
466 200 Script output follows
467
467
468 tip 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
468 tip 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
469 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
469 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
470 200 Script output follows
470 200 Script output follows
471
471
472 stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe open
472 stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe open
473 default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
473 default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
474 200 Script output follows
474 200 Script output follows
475
475
476 <?xml version="1.0" encoding="ascii"?>
476 <?xml version="1.0" encoding="ascii"?>
477 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
477 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
478 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
478 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
479 <head>
479 <head>
480 <link rel="icon" href="/static/hgicon.png" type="image/png" />
480 <link rel="icon" href="/static/hgicon.png" type="image/png" />
481 <meta name="robots" content="index, nofollow"/>
481 <meta name="robots" content="index, nofollow"/>
482 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
482 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
483
483
484
484
485 <title>test: Summary</title>
485 <title>test: Summary</title>
486 <link rel="alternate" type="application/atom+xml"
486 <link rel="alternate" type="application/atom+xml"
487 href="/atom-log" title="Atom feed for test"/>
487 href="/atom-log" title="Atom feed for test"/>
488 <link rel="alternate" type="application/rss+xml"
488 <link rel="alternate" type="application/rss+xml"
489 href="/rss-log" title="RSS feed for test"/>
489 href="/rss-log" title="RSS feed for test"/>
490 </head>
490 </head>
491 <body>
491 <body>
492
492
493 <div class="page_header">
493 <div class="page_header">
494 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
494 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
495
495
496 <form action="/log">
496 <form action="/log">
497 <input type="hidden" name="style" value="gitweb" />
497 <input type="hidden" name="style" value="gitweb" />
498 <div class="search">
498 <div class="search">
499 <input type="text" name="rev" />
499 <input type="text" name="rev" />
500 </div>
500 </div>
501 </form>
501 </form>
502 </div>
502 </div>
503
503
504 <div class="page_nav">
504 <div class="page_nav">
505 summary |
505 summary |
506 <a href="/shortlog?style=gitweb">shortlog</a> |
506 <a href="/shortlog?style=gitweb">shortlog</a> |
507 <a href="/log?style=gitweb">changelog</a> |
507 <a href="/log?style=gitweb">changelog</a> |
508 <a href="/graph?style=gitweb">graph</a> |
508 <a href="/graph?style=gitweb">graph</a> |
509 <a href="/tags?style=gitweb">tags</a> |
509 <a href="/tags?style=gitweb">tags</a> |
510 <a href="/branches?style=gitweb">branches</a> |
510 <a href="/branches?style=gitweb">branches</a> |
511 <a href="/file/1d22e65f027e?style=gitweb">files</a>
511 <a href="/file/1d22e65f027e?style=gitweb">files</a>
512 <br/>
512 <br/>
513 </div>
513 </div>
514
514
515 <div class="title">&nbsp;</div>
515 <div class="title">&nbsp;</div>
516 <table cellspacing="0">
516 <table cellspacing="0">
517 <tr><td>description</td><td>unknown</td></tr>
517 <tr><td>description</td><td>unknown</td></tr>
518 <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>
518 <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>
519 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
519 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
520 </table>
520 </table>
521
521
522 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
522 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
523 <table cellspacing="0">
523 <table cellspacing="0">
524
524
525 <tr class="parity0">
525 <tr class="parity0">
526 <td class="age"><i>1970-01-01</i></td>
526 <td class="age"><i>1970-01-01</i></td>
527 <td><i>test</i></td>
527 <td><i>test</i></td>
528 <td>
528 <td>
529 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
529 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
530 <b>branch</b>
530 <b>branch</b>
531 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> </span>
531 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> </span>
532 </a>
532 </a>
533 </td>
533 </td>
534 <td class="link" nowrap>
534 <td class="link" nowrap>
535 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
535 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
536 <a href="/file/1d22e65f027e?style=gitweb">files</a>
536 <a href="/file/1d22e65f027e?style=gitweb">files</a>
537 </td>
537 </td>
538 </tr>
538 </tr>
539 <tr class="parity1">
539 <tr class="parity1">
540 <td class="age"><i>1970-01-01</i></td>
540 <td class="age"><i>1970-01-01</i></td>
541 <td><i>test</i></td>
541 <td><i>test</i></td>
542 <td>
542 <td>
543 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
543 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
544 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
544 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
545 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
545 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
546 </a>
546 </a>
547 </td>
547 </td>
548 <td class="link" nowrap>
548 <td class="link" nowrap>
549 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
549 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
550 <a href="/file/a4f92ed23982?style=gitweb">files</a>
550 <a href="/file/a4f92ed23982?style=gitweb">files</a>
551 </td>
551 </td>
552 </tr>
552 </tr>
553 <tr class="parity0">
553 <tr class="parity0">
554 <td class="age"><i>1970-01-01</i></td>
554 <td class="age"><i>1970-01-01</i></td>
555 <td><i>test</i></td>
555 <td><i>test</i></td>
556 <td>
556 <td>
557 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
557 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
558 <b>base</b>
558 <b>base</b>
559 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> </span>
559 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> </span>
560 </a>
560 </a>
561 </td>
561 </td>
562 <td class="link" nowrap>
562 <td class="link" nowrap>
563 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
563 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
564 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
564 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
565 </td>
565 </td>
566 </tr>
566 </tr>
567 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
567 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
568 </table>
568 </table>
569
569
570 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
570 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
571 <table cellspacing="0">
571 <table cellspacing="0">
572
572
573 <tr class="parity0">
573 <tr class="parity0">
574 <td class="age"><i>1970-01-01</i></td>
574 <td class="age"><i>1970-01-01</i></td>
575 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
575 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
576 <td class="link">
576 <td class="link">
577 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
577 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
578 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
578 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
579 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
579 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
580 </td>
580 </td>
581 </tr>
581 </tr>
582 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
582 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
583 </table>
583 </table>
584
584
585 <div><a class="title" href="#">branches</a></div>
585 <div><a class="title" href="#">branches</a></div>
586 <table cellspacing="0">
586 <table cellspacing="0">
587
587
588 <tr class="parity0">
588 <tr class="parity0">
589 <td class="age"><i>1970-01-01</i></td>
589 <td class="age"><i>1970-01-01</i></td>
590 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
590 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
591 <td class="">stable</td>
591 <td class="">stable</td>
592 <td class="link">
592 <td class="link">
593 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
593 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
594 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
594 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
595 <a href="/file/1d22e65f027e?style=gitweb">files</a>
595 <a href="/file/1d22e65f027e?style=gitweb">files</a>
596 </td>
596 </td>
597 </tr>
597 </tr>
598 <tr class="parity1">
598 <tr class="parity1">
599 <td class="age"><i>1970-01-01</i></td>
599 <td class="age"><i>1970-01-01</i></td>
600 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
600 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
601 <td class="">default</td>
601 <td class="">default</td>
602 <td class="link">
602 <td class="link">
603 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
603 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
604 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
604 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
605 <a href="/file/a4f92ed23982?style=gitweb">files</a>
605 <a href="/file/a4f92ed23982?style=gitweb">files</a>
606 </td>
606 </td>
607 </tr>
607 </tr>
608 <tr class="light">
608 <tr class="light">
609 <td colspan="4"><a class="list" href="#">...</a></td>
609 <td colspan="4"><a class="list" href="#">...</a></td>
610 </tr>
610 </tr>
611 </table>
611 </table>
612 <div class="page_footer">
612 <div class="page_footer">
613 <div class="page_footer_text">test</div>
613 <div class="page_footer_text">test</div>
614 <div class="rss_logo">
614 <div class="rss_logo">
615 <a href="/rss-log">RSS</a>
615 <a href="/rss-log">RSS</a>
616 <a href="/atom-log">Atom</a>
616 <a href="/atom-log">Atom</a>
617 </div>
617 </div>
618 <br />
618 <br />
619
619
620 </div>
620 </div>
621 </body>
621 </body>
622 </html>
622 </html>
623
623
624 200 Script output follows
624 200 Script output follows
625
625
626 <?xml version="1.0" encoding="ascii"?>
626 <?xml version="1.0" encoding="ascii"?>
627 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
627 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
628 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
628 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
629 <head>
629 <head>
630 <link rel="icon" href="/static/hgicon.png" type="image/png" />
630 <link rel="icon" href="/static/hgicon.png" type="image/png" />
631 <meta name="robots" content="index, nofollow"/>
631 <meta name="robots" content="index, nofollow"/>
632 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
632 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
633
633
634
634
635 <title>test: Graph</title>
635 <title>test: Graph</title>
636 <link rel="alternate" type="application/atom+xml"
636 <link rel="alternate" type="application/atom+xml"
637 href="/atom-log" title="Atom feed for test"/>
637 href="/atom-log" title="Atom feed for test"/>
638 <link rel="alternate" type="application/rss+xml"
638 <link rel="alternate" type="application/rss+xml"
639 href="/rss-log" title="RSS feed for test"/>
639 href="/rss-log" title="RSS feed for test"/>
640 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
640 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
641 </head>
641 </head>
642 <body>
642 <body>
643
643
644 <div class="page_header">
644 <div class="page_header">
645 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
645 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
646 </div>
646 </div>
647
647
648 <form action="/log">
648 <form action="/log">
649 <input type="hidden" name="style" value="gitweb" />
649 <input type="hidden" name="style" value="gitweb" />
650 <div class="search">
650 <div class="search">
651 <input type="text" name="rev" />
651 <input type="text" name="rev" />
652 </div>
652 </div>
653 </form>
653 </form>
654 <div class="page_nav">
654 <div class="page_nav">
655 <a href="/summary?style=gitweb">summary</a> |
655 <a href="/summary?style=gitweb">summary</a> |
656 <a href="/shortlog?style=gitweb">shortlog</a> |
656 <a href="/shortlog?style=gitweb">shortlog</a> |
657 <a href="/log/2?style=gitweb">changelog</a> |
657 <a href="/log/2?style=gitweb">changelog</a> |
658 graph |
658 graph |
659 <a href="/tags?style=gitweb">tags</a> |
659 <a href="/tags?style=gitweb">tags</a> |
660 <a href="/branches?style=gitweb">branches</a> |
660 <a href="/branches?style=gitweb">branches</a> |
661 <a href="/file/1d22e65f027e?style=gitweb">files</a>
661 <a href="/file/1d22e65f027e?style=gitweb">files</a>
662 <br/>
662 <br/>
663 <a href="/graph/2?style=gitweb&revcount=12">less</a>
663 <a href="/graph/2?style=gitweb&revcount=30">less</a>
664 <a href="/graph/2?style=gitweb&revcount=50">more</a>
664 <a href="/graph/2?style=gitweb&revcount=120">more</a>
665 | <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/>
665 | <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/>
666 </div>
666 </div>
667
667
668 <div class="title">&nbsp;</div>
668 <div class="title">&nbsp;</div>
669
669
670 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
670 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
671
671
672 <div id="wrapper">
672 <div id="wrapper">
673 <ul id="nodebgs"></ul>
673 <ul id="nodebgs"></ul>
674 <canvas id="graph" width="224" height="129"></canvas>
674 <canvas id="graph" width="224" height="129"></canvas>
675 <ul id="graphnodes"></ul>
675 <ul id="graphnodes"></ul>
676 </div>
676 </div>
677
677
678 <script type="text/javascript" src="/static/graph.js"></script>
678 <script type="text/javascript" src="/static/graph.js"></script>
679 <script>
679 <script>
680 <!-- hide script content
680 <!-- hide script content
681
681
682 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", true], ["tip"]], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]];
682 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", true], ["tip"]], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]];
683 var graph = new Graph();
683 var graph = new Graph();
684 graph.scale(39);
684 graph.scale(39);
685
685
686 graph.edge = function(x0, y0, x1, y1, color) {
686 graph.edge = function(x0, y0, x1, y1, color) {
687
687
688 this.setColor(color, 0.0, 0.65);
688 this.setColor(color, 0.0, 0.65);
689 this.ctx.beginPath();
689 this.ctx.beginPath();
690 this.ctx.moveTo(x0, y0);
690 this.ctx.moveTo(x0, y0);
691 this.ctx.lineTo(x1, y1);
691 this.ctx.lineTo(x1, y1);
692 this.ctx.stroke();
692 this.ctx.stroke();
693
693
694 }
694 }
695
695
696 var revlink = '<li style="_STYLE"><span class="desc">';
696 var revlink = '<li style="_STYLE"><span class="desc">';
697 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
697 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
698 revlink += '</span> _TAGS';
698 revlink += '</span> _TAGS';
699 revlink += '<span class="info">_DATE ago, by _USER</span></li>';
699 revlink += '<span class="info">_DATE ago, by _USER</span></li>';
700
700
701 graph.vertex = function(x, y, color, parity, cur) {
701 graph.vertex = function(x, y, color, parity, cur) {
702
702
703 this.ctx.beginPath();
703 this.ctx.beginPath();
704 color = this.setColor(color, 0.25, 0.75);
704 color = this.setColor(color, 0.25, 0.75);
705 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
705 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
706 this.ctx.fill();
706 this.ctx.fill();
707
707
708 var bg = '<li class="bg parity' + parity + '"></li>';
708 var bg = '<li class="bg parity' + parity + '"></li>';
709 var left = (this.columns + 1) * this.bg_height;
709 var left = (this.columns + 1) * this.bg_height;
710 var nstyle = 'padding-left: ' + left + 'px;';
710 var nstyle = 'padding-left: ' + left + 'px;';
711 var item = revlink.replace(/_STYLE/, nstyle);
711 var item = revlink.replace(/_STYLE/, nstyle);
712 item = item.replace(/_PARITY/, 'parity' + parity);
712 item = item.replace(/_PARITY/, 'parity' + parity);
713 item = item.replace(/_NODEID/, cur[0]);
713 item = item.replace(/_NODEID/, cur[0]);
714 item = item.replace(/_NODEID/, cur[0]);
714 item = item.replace(/_NODEID/, cur[0]);
715 item = item.replace(/_DESC/, cur[3]);
715 item = item.replace(/_DESC/, cur[3]);
716 item = item.replace(/_USER/, cur[4]);
716 item = item.replace(/_USER/, cur[4]);
717 item = item.replace(/_DATE/, cur[5]);
717 item = item.replace(/_DATE/, cur[5]);
718
718
719 var tagspan = '';
719 var tagspan = '';
720 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
720 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
721 tagspan = '<span class="logtags">';
721 tagspan = '<span class="logtags">';
722 if (cur[6][1]) {
722 if (cur[6][1]) {
723 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
723 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
724 tagspan += cur[6][0] + '</span> ';
724 tagspan += cur[6][0] + '</span> ';
725 } else if (!cur[6][1] && cur[6][0] != 'default') {
725 } else if (!cur[6][1] && cur[6][0] != 'default') {
726 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
726 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
727 tagspan += cur[6][0] + '</span> ';
727 tagspan += cur[6][0] + '</span> ';
728 }
728 }
729 if (cur[7].length) {
729 if (cur[7].length) {
730 for (var t in cur[7]) {
730 for (var t in cur[7]) {
731 var tag = cur[7][t];
731 var tag = cur[7][t];
732 tagspan += '<span class="tagtag">' + tag + '</span> ';
732 tagspan += '<span class="tagtag">' + tag + '</span> ';
733 }
733 }
734 }
734 }
735 tagspan += '</span>';
735 tagspan += '</span>';
736 }
736 }
737
737
738 item = item.replace(/_TAGS/, tagspan);
738 item = item.replace(/_TAGS/, tagspan);
739 return [bg, item];
739 return [bg, item];
740
740
741 }
741 }
742
742
743 graph.render(data);
743 graph.render(data);
744
744
745 // stop hiding script -->
745 // stop hiding script -->
746 </script>
746 </script>
747
747
748 <div class="page_nav">
748 <div class="page_nav">
749 <a href="/graph/2?style=gitweb&revcount=12">less</a>
749 <a href="/graph/2?style=gitweb&revcount=30">less</a>
750 <a href="/graph/2?style=gitweb&revcount=50">more</a>
750 <a href="/graph/2?style=gitweb&revcount=120">more</a>
751 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
751 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
752 </div>
752 </div>
753
753
754 <div class="page_footer">
754 <div class="page_footer">
755 <div class="page_footer_text">test</div>
755 <div class="page_footer_text">test</div>
756 <div class="rss_logo">
756 <div class="rss_logo">
757 <a href="/rss-log">RSS</a>
757 <a href="/rss-log">RSS</a>
758 <a href="/atom-log">Atom</a>
758 <a href="/atom-log">Atom</a>
759 </div>
759 </div>
760 <br />
760 <br />
761
761
762 </div>
762 </div>
763 </body>
763 </body>
764 </html>
764 </html>
765
765
766 % capabilities
766 % capabilities
767 200 Script output follows
767 200 Script output follows
768
768
769 lookup changegroupsubset branchmap unbundle=HG10GZ,HG10BZ,HG10UN% heads
769 lookup changegroupsubset branchmap unbundle=HG10GZ,HG10BZ,HG10UN% heads
770 200 Script output follows
770 200 Script output follows
771
771
772 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
772 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
773 % lookup
773 % lookup
774 200 Script output follows
774 200 Script output follows
775
775
776 0 'key'
776 0 'key'
777 % branches
777 % branches
778 200 Script output follows
778 200 Script output follows
779
779
780 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe 2ef0ac749a14e4f57a5a822464a0902c6f7f448f 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
780 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe 2ef0ac749a14e4f57a5a822464a0902c6f7f448f 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
781 % changegroup
781 % changegroup
782 200 Script output follows
782 200 Script output follows
783
783
784 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
784 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
785 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~\
785 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~\
786 \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
786 \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
787 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3\'\x859
787 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3\'\x859
788 \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
788 \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
789 % stream_out
789 % stream_out
790 200 Script output follows
790 200 Script output follows
791
791
792 1
792 1
793 % failing unbundle, requires POST request
793 % failing unbundle, requires POST request
794 405 push requires POST request
794 405 push requires POST request
795
795
796 0
796 0
797 push requires POST request
797 push requires POST request
798 % Static files
798 % Static files
799 200 Script output follows
799 200 Script output follows
800
800
801 a { text-decoration:none; }
801 a { text-decoration:none; }
802 .age { white-space:nowrap; }
802 .age { white-space:nowrap; }
803 .date { white-space:nowrap; }
803 .date { white-space:nowrap; }
804 .indexlinks { white-space:nowrap; }
804 .indexlinks { white-space:nowrap; }
805 .parity0 { background-color: #ddd; }
805 .parity0 { background-color: #ddd; }
806 .parity1 { background-color: #eee; }
806 .parity1 { background-color: #eee; }
807 .lineno { width: 60px; color: #aaa; font-size: smaller;
807 .lineno { width: 60px; color: #aaa; font-size: smaller;
808 text-align: right; }
808 text-align: right; }
809 .plusline { color: green; }
809 .plusline { color: green; }
810 .minusline { color: red; }
810 .minusline { color: red; }
811 .atline { color: purple; }
811 .atline { color: purple; }
812 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
812 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
813 .buttons a {
813 .buttons a {
814 background-color: #666;
814 background-color: #666;
815 padding: 2pt;
815 padding: 2pt;
816 color: white;
816 color: white;
817 font-family: sans;
817 font-family: sans;
818 font-weight: bold;
818 font-weight: bold;
819 }
819 }
820 .navigate a {
820 .navigate a {
821 background-color: #ccc;
821 background-color: #ccc;
822 padding: 2pt;
822 padding: 2pt;
823 font-family: sans;
823 font-family: sans;
824 color: black;
824 color: black;
825 }
825 }
826
826
827 .metatag {
827 .metatag {
828 background-color: #888;
828 background-color: #888;
829 color: white;
829 color: white;
830 text-align: right;
830 text-align: right;
831 }
831 }
832
832
833 /* Common */
833 /* Common */
834 pre { margin: 0; }
834 pre { margin: 0; }
835
835
836 .logo {
836 .logo {
837 float: right;
837 float: right;
838 clear: right;
838 clear: right;
839 }
839 }
840
840
841 /* Changelog/Filelog entries */
841 /* Changelog/Filelog entries */
842 .logEntry { width: 100%; }
842 .logEntry { width: 100%; }
843 .logEntry .age { width: 15%; }
843 .logEntry .age { width: 15%; }
844 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
844 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
845 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
845 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
846 .logEntry th.firstline { text-align: left; width: inherit; }
846 .logEntry th.firstline { text-align: left; width: inherit; }
847
847
848 /* Shortlog entries */
848 /* Shortlog entries */
849 .slogEntry { width: 100%; }
849 .slogEntry { width: 100%; }
850 .slogEntry .age { width: 8em; }
850 .slogEntry .age { width: 8em; }
851 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
851 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
852 .slogEntry td.author { width: 15em; }
852 .slogEntry td.author { width: 15em; }
853
853
854 /* Tag entries */
854 /* Tag entries */
855 #tagEntries { list-style: none; margin: 0; padding: 0; }
855 #tagEntries { list-style: none; margin: 0; padding: 0; }
856 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
856 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
857
857
858 /* Changeset entry */
858 /* Changeset entry */
859 #changesetEntry { }
859 #changesetEntry { }
860 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
860 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
861 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
861 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
862
862
863 /* File diff view */
863 /* File diff view */
864 #filediffEntry { }
864 #filediffEntry { }
865 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
865 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
866
866
867 /* Graph */
867 /* Graph */
868 div#wrapper {
868 div#wrapper {
869 position: relative;
869 position: relative;
870 margin: 0;
870 margin: 0;
871 padding: 0;
871 padding: 0;
872 }
872 }
873
873
874 canvas {
874 canvas {
875 position: absolute;
875 position: absolute;
876 z-index: 5;
876 z-index: 5;
877 top: -0.6em;
877 top: -0.6em;
878 margin: 0;
878 margin: 0;
879 }
879 }
880
880
881 ul#nodebgs {
881 ul#nodebgs {
882 list-style: none inside none;
882 list-style: none inside none;
883 padding: 0;
883 padding: 0;
884 margin: 0;
884 margin: 0;
885 top: -0.7em;
885 top: -0.7em;
886 }
886 }
887
887
888 ul#graphnodes li, ul#nodebgs li {
888 ul#graphnodes li, ul#nodebgs li {
889 height: 39px;
889 height: 39px;
890 }
890 }
891
891
892 ul#graphnodes {
892 ul#graphnodes {
893 position: absolute;
893 position: absolute;
894 z-index: 10;
894 z-index: 10;
895 top: -0.85em;
895 top: -0.85em;
896 list-style: none inside none;
896 list-style: none inside none;
897 padding: 0;
897 padding: 0;
898 }
898 }
899
899
900 ul#graphnodes li .info {
900 ul#graphnodes li .info {
901 display: block;
901 display: block;
902 font-size: 70%;
902 font-size: 70%;
903 position: relative;
903 position: relative;
904 top: -1px;
904 top: -1px;
905 }
905 }
906 % ERRORS ENCOUNTERED
906 % ERRORS ENCOUNTERED
@@ -1,348 +1,348
1 200 Script output follows
1 200 Script output follows
2
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
4 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
5 <head>
5 <head>
6 <link rel="icon" href="/static/hgicon.png" type="image/png" />
6 <link rel="icon" href="/static/hgicon.png" type="image/png" />
7 <meta name="robots" content="index, nofollow" />
7 <meta name="robots" content="index, nofollow" />
8 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
8 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
9
9
10 <title>test: log</title>
10 <title>test: log</title>
11 <link rel="alternate" type="application/atom+xml"
11 <link rel="alternate" type="application/atom+xml"
12 href="/atom-log" title="Atom feed for test" />
12 href="/atom-log" title="Atom feed for test" />
13 <link rel="alternate" type="application/rss+xml"
13 <link rel="alternate" type="application/rss+xml"
14 href="/rss-log" title="RSS feed for test" />
14 href="/rss-log" title="RSS feed for test" />
15 </head>
15 </head>
16 <body>
16 <body>
17
17
18 <div class="container">
18 <div class="container">
19 <div class="menu">
19 <div class="menu">
20 <div class="logo">
20 <div class="logo">
21 <a href="http://mercurial.selenic.com/">
21 <a href="http://mercurial.selenic.com/">
22 <img src="/static/hglogo.png" alt="mercurial" /></a>
22 <img src="/static/hglogo.png" alt="mercurial" /></a>
23 </div>
23 </div>
24 <ul>
24 <ul>
25 <li class="active">log</li>
25 <li class="active">log</li>
26 <li><a href="/graph/000000000000">graph</a></li>
26 <li><a href="/graph/000000000000">graph</a></li>
27 <li><a href="/tags">tags</a></li>
27 <li><a href="/tags">tags</a></li>
28 <li><a href="/branches">branches</a></li>
28 <li><a href="/branches">branches</a></li>
29 </ul>
29 </ul>
30 <ul>
30 <ul>
31 <li><a href="/rev/000000000000">changeset</a></li>
31 <li><a href="/rev/000000000000">changeset</a></li>
32 <li><a href="/file/000000000000">browse</a></li>
32 <li><a href="/file/000000000000">browse</a></li>
33 </ul>
33 </ul>
34 <ul>
34 <ul>
35
35
36 </ul>
36 </ul>
37 </div>
37 </div>
38
38
39 <div class="main">
39 <div class="main">
40 <h2><a href="/">test</a></h2>
40 <h2><a href="/">test</a></h2>
41 <h3>log</h3>
41 <h3>log</h3>
42
42
43 <form class="search" action="/log">
43 <form class="search" action="/log">
44
44
45 <p><input name="rev" id="search1" type="text" size="30" /></p>
45 <p><input name="rev" id="search1" type="text" size="30" /></p>
46 <div id="hint">find changesets by author, revision,
46 <div id="hint">find changesets by author, revision,
47 files, or words in the commit message</div>
47 files, or words in the commit message</div>
48 </form>
48 </form>
49
49
50 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
50 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
51
51
52 <table class="bigtable">
52 <table class="bigtable">
53 <tr>
53 <tr>
54 <th class="age">age</th>
54 <th class="age">age</th>
55 <th class="author">author</th>
55 <th class="author">author</th>
56 <th class="description">description</th>
56 <th class="description">description</th>
57 </tr>
57 </tr>
58
58
59 </table>
59 </table>
60
60
61 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
61 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
62 </div>
62 </div>
63 </div>
63 </div>
64
64
65
65
66
66
67 </body>
67 </body>
68 </html>
68 </html>
69
69
70 200 Script output follows
70 200 Script output follows
71
71
72 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
72 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
73 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
73 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
74 <head>
74 <head>
75 <link rel="icon" href="/static/hgicon.png" type="image/png" />
75 <link rel="icon" href="/static/hgicon.png" type="image/png" />
76 <meta name="robots" content="index, nofollow" />
76 <meta name="robots" content="index, nofollow" />
77 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
77 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
78
78
79 <title>test: log</title>
79 <title>test: log</title>
80 <link rel="alternate" type="application/atom+xml"
80 <link rel="alternate" type="application/atom+xml"
81 href="/atom-log" title="Atom feed for test" />
81 href="/atom-log" title="Atom feed for test" />
82 <link rel="alternate" type="application/rss+xml"
82 <link rel="alternate" type="application/rss+xml"
83 href="/rss-log" title="RSS feed for test" />
83 href="/rss-log" title="RSS feed for test" />
84 </head>
84 </head>
85 <body>
85 <body>
86
86
87 <div class="container">
87 <div class="container">
88 <div class="menu">
88 <div class="menu">
89 <div class="logo">
89 <div class="logo">
90 <a href="http://mercurial.selenic.com/">
90 <a href="http://mercurial.selenic.com/">
91 <img src="/static/hglogo.png" alt="mercurial" /></a>
91 <img src="/static/hglogo.png" alt="mercurial" /></a>
92 </div>
92 </div>
93 <ul>
93 <ul>
94 <li class="active">log</li>
94 <li class="active">log</li>
95 <li><a href="/graph/000000000000">graph</a></li>
95 <li><a href="/graph/000000000000">graph</a></li>
96 <li><a href="/tags">tags</a></li>
96 <li><a href="/tags">tags</a></li>
97 <li><a href="/branches">branches</a></li>
97 <li><a href="/branches">branches</a></li>
98 </ul>
98 </ul>
99 <ul>
99 <ul>
100 <li><a href="/rev/000000000000">changeset</a></li>
100 <li><a href="/rev/000000000000">changeset</a></li>
101 <li><a href="/file/000000000000">browse</a></li>
101 <li><a href="/file/000000000000">browse</a></li>
102 </ul>
102 </ul>
103 <ul>
103 <ul>
104
104
105 </ul>
105 </ul>
106 </div>
106 </div>
107
107
108 <div class="main">
108 <div class="main">
109 <h2><a href="/">test</a></h2>
109 <h2><a href="/">test</a></h2>
110 <h3>log</h3>
110 <h3>log</h3>
111
111
112 <form class="search" action="/log">
112 <form class="search" action="/log">
113
113
114 <p><input name="rev" id="search1" type="text" size="30" /></p>
114 <p><input name="rev" id="search1" type="text" size="30" /></p>
115 <div id="hint">find changesets by author, revision,
115 <div id="hint">find changesets by author, revision,
116 files, or words in the commit message</div>
116 files, or words in the commit message</div>
117 </form>
117 </form>
118
118
119 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
119 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
120
120
121 <table class="bigtable">
121 <table class="bigtable">
122 <tr>
122 <tr>
123 <th class="age">age</th>
123 <th class="age">age</th>
124 <th class="author">author</th>
124 <th class="author">author</th>
125 <th class="description">description</th>
125 <th class="description">description</th>
126 </tr>
126 </tr>
127
127
128 </table>
128 </table>
129
129
130 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
130 <div class="navigate">rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a> </div>
131 </div>
131 </div>
132 </div>
132 </div>
133
133
134
134
135
135
136 </body>
136 </body>
137 </html>
137 </html>
138
138
139 200 Script output follows
139 200 Script output follows
140
140
141 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
141 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
142 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
142 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
143 <head>
143 <head>
144 <link rel="icon" href="/static/hgicon.png" type="image/png" />
144 <link rel="icon" href="/static/hgicon.png" type="image/png" />
145 <meta name="robots" content="index, nofollow" />
145 <meta name="robots" content="index, nofollow" />
146 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
146 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
147
147
148 <title>test: revision graph</title>
148 <title>test: revision graph</title>
149 <link rel="alternate" type="application/atom+xml"
149 <link rel="alternate" type="application/atom+xml"
150 href="/atom-log" title="Atom feed for test: log" />
150 href="/atom-log" title="Atom feed for test: log" />
151 <link rel="alternate" type="application/rss+xml"
151 <link rel="alternate" type="application/rss+xml"
152 href="/rss-log" title="RSS feed for test: log" />
152 href="/rss-log" title="RSS feed for test: log" />
153 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
153 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
154 </head>
154 </head>
155 <body>
155 <body>
156
156
157 <div class="container">
157 <div class="container">
158 <div class="menu">
158 <div class="menu">
159 <div class="logo">
159 <div class="logo">
160 <a href="http://mercurial.selenic.com/">
160 <a href="http://mercurial.selenic.com/">
161 <img src="/static/hglogo.png" alt="mercurial" /></a>
161 <img src="/static/hglogo.png" alt="mercurial" /></a>
162 </div>
162 </div>
163 <ul>
163 <ul>
164 <li><a href="/shortlog/000000000000">log</a></li>
164 <li><a href="/shortlog/000000000000">log</a></li>
165 <li class="active">graph</li>
165 <li class="active">graph</li>
166 <li><a href="/tags">tags</a></li>
166 <li><a href="/tags">tags</a></li>
167 <li><a href="/branches">branches</a></li>
167 <li><a href="/branches">branches</a></li>
168 </ul>
168 </ul>
169 <ul>
169 <ul>
170 <li><a href="/rev/000000000000">changeset</a></li>
170 <li><a href="/rev/000000000000">changeset</a></li>
171 <li><a href="/file/000000000000">browse</a></li>
171 <li><a href="/file/000000000000">browse</a></li>
172 </ul>
172 </ul>
173 </div>
173 </div>
174
174
175 <div class="main">
175 <div class="main">
176 <h2><a href="/">test</a></h2>
176 <h2><a href="/">test</a></h2>
177 <h3>graph</h3>
177 <h3>graph</h3>
178
178
179 <form class="search" action="/log">
179 <form class="search" action="/log">
180
180
181 <p><input name="rev" id="search1" type="text" size="30" /></p>
181 <p><input name="rev" id="search1" type="text" size="30" /></p>
182 <div id="hint">find changesets by author, revision,
182 <div id="hint">find changesets by author, revision,
183 files, or words in the commit message</div>
183 files, or words in the commit message</div>
184 </form>
184 </form>
185
185
186 <div class="navigate">
186 <div class="navigate">
187 <a href="/graph/-1?revcount=12">less</a>
187 <a href="/graph/-1?revcount=30">less</a>
188 <a href="/graph/-1?revcount=50">more</a>
188 <a href="/graph/-1?revcount=120">more</a>
189 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
189 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
190 </div>
190 </div>
191
191
192 <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
192 <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
193
193
194 <div id="wrapper">
194 <div id="wrapper">
195 <ul id="nodebgs"></ul>
195 <ul id="nodebgs"></ul>
196 <canvas id="graph" width="224" height="12"></canvas>
196 <canvas id="graph" width="224" height="12"></canvas>
197 <ul id="graphnodes"></ul>
197 <ul id="graphnodes"></ul>
198 </div>
198 </div>
199
199
200 <script type="text/javascript" src="/static/graph.js"></script>
200 <script type="text/javascript" src="/static/graph.js"></script>
201 <script type="text/javascript">
201 <script type="text/javascript">
202 <!-- hide script content
202 <!-- hide script content
203
203
204 var data = [];
204 var data = [];
205 var graph = new Graph();
205 var graph = new Graph();
206 graph.scale(39);
206 graph.scale(39);
207
207
208 graph.edge = function(x0, y0, x1, y1, color) {
208 graph.edge = function(x0, y0, x1, y1, color) {
209
209
210 this.setColor(color, 0.0, 0.65);
210 this.setColor(color, 0.0, 0.65);
211 this.ctx.beginPath();
211 this.ctx.beginPath();
212 this.ctx.moveTo(x0, y0);
212 this.ctx.moveTo(x0, y0);
213 this.ctx.lineTo(x1, y1);
213 this.ctx.lineTo(x1, y1);
214 this.ctx.stroke();
214 this.ctx.stroke();
215
215
216 }
216 }
217
217
218 var revlink = '<li style="_STYLE"><span class="desc">';
218 var revlink = '<li style="_STYLE"><span class="desc">';
219 revlink += '<a href="/rev/_NODEID" title="_NODEID">_DESC</a>';
219 revlink += '<a href="/rev/_NODEID" title="_NODEID">_DESC</a>';
220 revlink += '</span>_TAGS<span class="info">_DATE ago, by _USER</span></li>';
220 revlink += '</span>_TAGS<span class="info">_DATE ago, by _USER</span></li>';
221
221
222 graph.vertex = function(x, y, color, parity, cur) {
222 graph.vertex = function(x, y, color, parity, cur) {
223
223
224 this.ctx.beginPath();
224 this.ctx.beginPath();
225 color = this.setColor(color, 0.25, 0.75);
225 color = this.setColor(color, 0.25, 0.75);
226 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
226 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
227 this.ctx.fill();
227 this.ctx.fill();
228
228
229 var bg = '<li class="bg parity' + parity + '"></li>';
229 var bg = '<li class="bg parity' + parity + '"></li>';
230 var left = (this.columns + 1) * this.bg_height;
230 var left = (this.columns + 1) * this.bg_height;
231 var nstyle = 'padding-left: ' + left + 'px;';
231 var nstyle = 'padding-left: ' + left + 'px;';
232 var item = revlink.replace(/_STYLE/, nstyle);
232 var item = revlink.replace(/_STYLE/, nstyle);
233 item = item.replace(/_PARITY/, 'parity' + parity);
233 item = item.replace(/_PARITY/, 'parity' + parity);
234 item = item.replace(/_NODEID/, cur[0]);
234 item = item.replace(/_NODEID/, cur[0]);
235 item = item.replace(/_NODEID/, cur[0]);
235 item = item.replace(/_NODEID/, cur[0]);
236 item = item.replace(/_DESC/, cur[3]);
236 item = item.replace(/_DESC/, cur[3]);
237 item = item.replace(/_USER/, cur[4]);
237 item = item.replace(/_USER/, cur[4]);
238 item = item.replace(/_DATE/, cur[5]);
238 item = item.replace(/_DATE/, cur[5]);
239
239
240 var tagspan = '';
240 var tagspan = '';
241 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
241 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
242 tagspan = '<span class="logtags">';
242 tagspan = '<span class="logtags">';
243 if (cur[6][1]) {
243 if (cur[6][1]) {
244 tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
244 tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
245 tagspan += cur[6][0] + '</span> ';
245 tagspan += cur[6][0] + '</span> ';
246 } else if (!cur[6][1] && cur[6][0] != 'default') {
246 } else if (!cur[6][1] && cur[6][0] != 'default') {
247 tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
247 tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
248 tagspan += cur[6][0] + '</span> ';
248 tagspan += cur[6][0] + '</span> ';
249 }
249 }
250 if (cur[7].length) {
250 if (cur[7].length) {
251 for (var t in cur[7]) {
251 for (var t in cur[7]) {
252 var tag = cur[7][t];
252 var tag = cur[7][t];
253 tagspan += '<span class="tag">' + tag + '</span> ';
253 tagspan += '<span class="tag">' + tag + '</span> ';
254 }
254 }
255 }
255 }
256 tagspan += '</span>';
256 tagspan += '</span>';
257 }
257 }
258
258
259 item = item.replace(/_TAGS/, tagspan);
259 item = item.replace(/_TAGS/, tagspan);
260 return [bg, item];
260 return [bg, item];
261
261
262 }
262 }
263
263
264 graph.render(data);
264 graph.render(data);
265
265
266 // stop hiding script -->
266 // stop hiding script -->
267 </script>
267 </script>
268
268
269 <div class="navigate">
269 <div class="navigate">
270 <a href="/graph/-1?revcount=12">less</a>
270 <a href="/graph/-1?revcount=30">less</a>
271 <a href="/graph/-1?revcount=50">more</a>
271 <a href="/graph/-1?revcount=120">more</a>
272 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
272 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
273 </div>
273 </div>
274
274
275 </div>
275 </div>
276 </div>
276 </div>
277
277
278
278
279
279
280 </body>
280 </body>
281 </html>
281 </html>
282
282
283 200 Script output follows
283 200 Script output follows
284
284
285 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
285 <!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">
286 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
287 <head>
287 <head>
288 <link rel="icon" href="/static/hgicon.png" type="image/png" />
288 <link rel="icon" href="/static/hgicon.png" type="image/png" />
289 <meta name="robots" content="index, nofollow" />
289 <meta name="robots" content="index, nofollow" />
290 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
290 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
291
291
292 <title>test: 000000000000 /</title>
292 <title>test: 000000000000 /</title>
293 </head>
293 </head>
294 <body>
294 <body>
295
295
296 <div class="container">
296 <div class="container">
297 <div class="menu">
297 <div class="menu">
298 <div class="logo">
298 <div class="logo">
299 <a href="http://mercurial.selenic.com/">
299 <a href="http://mercurial.selenic.com/">
300 <img src="/static/hglogo.png" alt="mercurial" /></a>
300 <img src="/static/hglogo.png" alt="mercurial" /></a>
301 </div>
301 </div>
302 <ul>
302 <ul>
303 <li><a href="/shortlog/000000000000">log</a></li>
303 <li><a href="/shortlog/000000000000">log</a></li>
304 <li><a href="/graph/000000000000">graph</a></li>
304 <li><a href="/graph/000000000000">graph</a></li>
305 <li><a href="/tags">tags</a></li>
305 <li><a href="/tags">tags</a></li>
306 <li><a href="/branches">branches</a></li>
306 <li><a href="/branches">branches</a></li>
307 </ul>
307 </ul>
308 <ul>
308 <ul>
309 <li><a href="/rev/000000000000">changeset</a></li>
309 <li><a href="/rev/000000000000">changeset</a></li>
310 <li class="active">browse</li>
310 <li class="active">browse</li>
311 </ul>
311 </ul>
312 <ul>
312 <ul>
313
313
314 </ul>
314 </ul>
315 </div>
315 </div>
316
316
317 <div class="main">
317 <div class="main">
318 <h2><a href="/">test</a></h2>
318 <h2><a href="/">test</a></h2>
319 <h3>directory / @ -1:000000000000 <span class="tag">tip</span> </h3>
319 <h3>directory / @ -1:000000000000 <span class="tag">tip</span> </h3>
320
320
321 <form class="search" action="/log">
321 <form class="search" action="/log">
322
322
323 <p><input name="rev" id="search1" type="text" size="30" /></p>
323 <p><input name="rev" id="search1" type="text" size="30" /></p>
324 <div id="hint">find changesets by author, revision,
324 <div id="hint">find changesets by author, revision,
325 files, or words in the commit message</div>
325 files, or words in the commit message</div>
326 </form>
326 </form>
327
327
328 <table class="bigtable">
328 <table class="bigtable">
329 <tr>
329 <tr>
330 <th class="name">name</th>
330 <th class="name">name</th>
331 <th class="size">size</th>
331 <th class="size">size</th>
332 <th class="permissions">permissions</th>
332 <th class="permissions">permissions</th>
333 </tr>
333 </tr>
334 <tr class="fileline parity0">
334 <tr class="fileline parity0">
335 <td class="name"><a href="/file/000000000000/">[up]</a></td>
335 <td class="name"><a href="/file/000000000000/">[up]</a></td>
336 <td class="size"></td>
336 <td class="size"></td>
337 <td class="permissions">drwxr-xr-x</td>
337 <td class="permissions">drwxr-xr-x</td>
338 </tr>
338 </tr>
339
339
340
340
341 </table>
341 </table>
342 </div>
342 </div>
343 </div>
343 </div>
344
344
345
345
346 </body>
346 </body>
347 </html>
347 </html>
348
348
General Comments 0
You need to be logged in to leave comments. Login now