##// END OF EJS Templates
hgweb: add separate page with bookmarks listing
Alexander Solovyov -
r13597:38c9837b stable
parent child Browse files
Show More
@@ -0,0 +1,49 b''
1 {header}
2 <title>{repo|escape}: bookmarks</title>
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-bookmarks" title="Atom feed for {repo|escape}: bookmarks" />
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-bookmarks" title="RSS feed for {repo|escape}: bookmarks" />
7 </head>
8 <body>
9
10 <div class="container">
11 <div class="menu">
12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 </div>
16 <ul>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 <li class="active">bookmarks</li>
21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 </ul>
23 <ul>
24 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
25 </ul>
26 </div>
27
28 <div class="main">
29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
30 <h3>bookmarks</h3>
31
32 <form class="search" action="{url}log">
33 {sessionvars%hiddenformentry}
34 <p><input name="rev" id="search1" type="text" size="30" /></p>
35 <div id="hint">find changesets by author, revision,
36 files, or words in the commit message</div>
37 </form>
38
39 <table class="bigtable">
40 <tr>
41 <th>bookmark</th>
42 <th>node</th>
43 </tr>
44 {entries%bookmarkentry}
45 </table>
46 </div>
47 </div>
48
49 {footer}
@@ -1,789 +1,814 b''
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 or any later version.
6 # GNU General Public License version 2 or any later version.
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, encoding, archival, templater, templatefilters
10 from mercurial import error, encoding, 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 from mercurial import help as helpmod
16 from mercurial import help as helpmod
17 from mercurial.i18n import _
17 from mercurial.i18n import _
18
18
19 # __all__ is populated with the allowed commands. Be sure to add to it if
19 # __all__ is populated with the allowed commands. Be sure to add to it if
20 # you're adding a new command, or the new command won't work.
20 # you're adding a new command, or the new command won't work.
21
21
22 __all__ = [
22 __all__ = [
23 'log', 'rawfile', 'file', 'changelog', 'shortlog', 'changeset', 'rev',
23 'log', 'rawfile', 'file', 'changelog', 'shortlog', 'changeset', 'rev',
24 'manifest', 'tags', 'branches', 'summary', 'filediff', 'diff', 'annotate',
24 'manifest', 'tags', 'bookmarks', 'branches', 'summary', 'filediff', 'diff',
25 'filelog', 'archive', 'static', 'graph', 'help',
25 'annotate', 'filelog', 'archive', 'static', 'graph', 'help',
26 ]
26 ]
27
27
28 def log(web, req, tmpl):
28 def log(web, req, tmpl):
29 if 'file' in req.form and req.form['file'][0]:
29 if 'file' in req.form and req.form['file'][0]:
30 return filelog(web, req, tmpl)
30 return filelog(web, req, tmpl)
31 else:
31 else:
32 return changelog(web, req, tmpl)
32 return changelog(web, req, tmpl)
33
33
34 def rawfile(web, req, tmpl):
34 def rawfile(web, req, tmpl):
35 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
35 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
36 if not path:
36 if not path:
37 content = manifest(web, req, tmpl)
37 content = manifest(web, req, tmpl)
38 req.respond(HTTP_OK, web.ctype)
38 req.respond(HTTP_OK, web.ctype)
39 return content
39 return content
40
40
41 try:
41 try:
42 fctx = webutil.filectx(web.repo, req)
42 fctx = webutil.filectx(web.repo, req)
43 except error.LookupError, inst:
43 except error.LookupError, inst:
44 try:
44 try:
45 content = manifest(web, req, tmpl)
45 content = manifest(web, req, tmpl)
46 req.respond(HTTP_OK, web.ctype)
46 req.respond(HTTP_OK, web.ctype)
47 return content
47 return content
48 except ErrorResponse:
48 except ErrorResponse:
49 raise inst
49 raise inst
50
50
51 path = fctx.path()
51 path = fctx.path()
52 text = fctx.data()
52 text = fctx.data()
53 mt = mimetypes.guess_type(path)[0]
53 mt = mimetypes.guess_type(path)[0]
54 if mt is None:
54 if mt is None:
55 mt = binary(text) and 'application/octet-stream' or 'text/plain'
55 mt = binary(text) and 'application/octet-stream' or 'text/plain'
56 if mt.startswith('text/'):
56 if mt.startswith('text/'):
57 mt += '; charset="%s"' % encoding.encoding
57 mt += '; charset="%s"' % encoding.encoding
58
58
59 req.respond(HTTP_OK, mt, path, len(text))
59 req.respond(HTTP_OK, mt, path, len(text))
60 return [text]
60 return [text]
61
61
62 def _filerevision(web, tmpl, fctx):
62 def _filerevision(web, tmpl, fctx):
63 f = fctx.path()
63 f = fctx.path()
64 text = fctx.data()
64 text = fctx.data()
65 parity = paritygen(web.stripecount)
65 parity = paritygen(web.stripecount)
66
66
67 if binary(text):
67 if binary(text):
68 mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
68 mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
69 text = '(binary:%s)' % mt
69 text = '(binary:%s)' % mt
70
70
71 def lines():
71 def lines():
72 for lineno, t in enumerate(text.splitlines(True)):
72 for lineno, t in enumerate(text.splitlines(True)):
73 yield {"line": t,
73 yield {"line": t,
74 "lineid": "l%d" % (lineno + 1),
74 "lineid": "l%d" % (lineno + 1),
75 "linenumber": "% 6d" % (lineno + 1),
75 "linenumber": "% 6d" % (lineno + 1),
76 "parity": parity.next()}
76 "parity": parity.next()}
77
77
78 return tmpl("filerevision",
78 return tmpl("filerevision",
79 file=f,
79 file=f,
80 path=webutil.up(f),
80 path=webutil.up(f),
81 text=lines(),
81 text=lines(),
82 rev=fctx.rev(),
82 rev=fctx.rev(),
83 node=hex(fctx.node()),
83 node=hex(fctx.node()),
84 author=fctx.user(),
84 author=fctx.user(),
85 date=fctx.date(),
85 date=fctx.date(),
86 desc=fctx.description(),
86 desc=fctx.description(),
87 branch=webutil.nodebranchnodefault(fctx),
87 branch=webutil.nodebranchnodefault(fctx),
88 parent=webutil.parents(fctx),
88 parent=webutil.parents(fctx),
89 child=webutil.children(fctx),
89 child=webutil.children(fctx),
90 rename=webutil.renamelink(fctx),
90 rename=webutil.renamelink(fctx),
91 permissions=fctx.manifest().flags(f))
91 permissions=fctx.manifest().flags(f))
92
92
93 def file(web, req, tmpl):
93 def file(web, req, tmpl):
94 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
94 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
95 if not path:
95 if not path:
96 return manifest(web, req, tmpl)
96 return manifest(web, req, tmpl)
97 try:
97 try:
98 return _filerevision(web, tmpl, webutil.filectx(web.repo, req))
98 return _filerevision(web, tmpl, webutil.filectx(web.repo, req))
99 except error.LookupError, inst:
99 except error.LookupError, inst:
100 try:
100 try:
101 return manifest(web, req, tmpl)
101 return manifest(web, req, tmpl)
102 except ErrorResponse:
102 except ErrorResponse:
103 raise inst
103 raise inst
104
104
105 def _search(web, req, tmpl):
105 def _search(web, req, tmpl):
106
106
107 query = req.form['rev'][0]
107 query = req.form['rev'][0]
108 revcount = web.maxchanges
108 revcount = web.maxchanges
109 if 'revcount' in req.form:
109 if 'revcount' in req.form:
110 revcount = int(req.form.get('revcount', [revcount])[0])
110 revcount = int(req.form.get('revcount', [revcount])[0])
111 tmpl.defaults['sessionvars']['revcount'] = revcount
111 tmpl.defaults['sessionvars']['revcount'] = revcount
112
112
113 lessvars = copy.copy(tmpl.defaults['sessionvars'])
113 lessvars = copy.copy(tmpl.defaults['sessionvars'])
114 lessvars['revcount'] = revcount / 2
114 lessvars['revcount'] = revcount / 2
115 lessvars['rev'] = query
115 lessvars['rev'] = query
116 morevars = copy.copy(tmpl.defaults['sessionvars'])
116 morevars = copy.copy(tmpl.defaults['sessionvars'])
117 morevars['revcount'] = revcount * 2
117 morevars['revcount'] = revcount * 2
118 morevars['rev'] = query
118 morevars['rev'] = query
119
119
120 def changelist(**map):
120 def changelist(**map):
121 count = 0
121 count = 0
122 qw = query.lower().split()
122 qw = query.lower().split()
123
123
124 def revgen():
124 def revgen():
125 for i in xrange(len(web.repo) - 1, 0, -100):
125 for i in xrange(len(web.repo) - 1, 0, -100):
126 l = []
126 l = []
127 for j in xrange(max(0, i - 100), i + 1):
127 for j in xrange(max(0, i - 100), i + 1):
128 ctx = web.repo[j]
128 ctx = web.repo[j]
129 l.append(ctx)
129 l.append(ctx)
130 l.reverse()
130 l.reverse()
131 for e in l:
131 for e in l:
132 yield e
132 yield e
133
133
134 for ctx in revgen():
134 for ctx in revgen():
135 miss = 0
135 miss = 0
136 for q in qw:
136 for q in qw:
137 if not (q in ctx.user().lower() or
137 if not (q in ctx.user().lower() or
138 q in ctx.description().lower() or
138 q in ctx.description().lower() or
139 q in " ".join(ctx.files()).lower()):
139 q in " ".join(ctx.files()).lower()):
140 miss = 1
140 miss = 1
141 break
141 break
142 if miss:
142 if miss:
143 continue
143 continue
144
144
145 count += 1
145 count += 1
146 n = ctx.node()
146 n = ctx.node()
147 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
147 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
148 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
148 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
149
149
150 yield tmpl('searchentry',
150 yield tmpl('searchentry',
151 parity=parity.next(),
151 parity=parity.next(),
152 author=ctx.user(),
152 author=ctx.user(),
153 parent=webutil.parents(ctx),
153 parent=webutil.parents(ctx),
154 child=webutil.children(ctx),
154 child=webutil.children(ctx),
155 changelogtag=showtags,
155 changelogtag=showtags,
156 desc=ctx.description(),
156 desc=ctx.description(),
157 date=ctx.date(),
157 date=ctx.date(),
158 files=files,
158 files=files,
159 rev=ctx.rev(),
159 rev=ctx.rev(),
160 node=hex(n),
160 node=hex(n),
161 tags=webutil.nodetagsdict(web.repo, n),
161 tags=webutil.nodetagsdict(web.repo, n),
162 inbranch=webutil.nodeinbranch(web.repo, ctx),
162 inbranch=webutil.nodeinbranch(web.repo, ctx),
163 branches=webutil.nodebranchdict(web.repo, ctx))
163 branches=webutil.nodebranchdict(web.repo, ctx))
164
164
165 if count >= revcount:
165 if count >= revcount:
166 break
166 break
167
167
168 tip = web.repo['tip']
168 tip = web.repo['tip']
169 parity = paritygen(web.stripecount)
169 parity = paritygen(web.stripecount)
170
170
171 return tmpl('search', query=query, node=tip.hex(),
171 return tmpl('search', query=query, node=tip.hex(),
172 entries=changelist, archives=web.archivelist("tip"),
172 entries=changelist, archives=web.archivelist("tip"),
173 morevars=morevars, lessvars=lessvars)
173 morevars=morevars, lessvars=lessvars)
174
174
175 def changelog(web, req, tmpl, shortlog=False):
175 def changelog(web, req, tmpl, shortlog=False):
176
176
177 if 'node' in req.form:
177 if 'node' in req.form:
178 ctx = webutil.changectx(web.repo, req)
178 ctx = webutil.changectx(web.repo, req)
179 else:
179 else:
180 if 'rev' in req.form:
180 if 'rev' in req.form:
181 hi = req.form['rev'][0]
181 hi = req.form['rev'][0]
182 else:
182 else:
183 hi = len(web.repo) - 1
183 hi = len(web.repo) - 1
184 try:
184 try:
185 ctx = web.repo[hi]
185 ctx = web.repo[hi]
186 except error.RepoError:
186 except error.RepoError:
187 return _search(web, req, tmpl) # XXX redirect to 404 page?
187 return _search(web, req, tmpl) # XXX redirect to 404 page?
188
188
189 def changelist(limit=0, **map):
189 def changelist(limit=0, **map):
190 l = [] # build a list in forward order for efficiency
190 l = [] # build a list in forward order for efficiency
191 for i in xrange(start, end):
191 for i in xrange(start, end):
192 ctx = web.repo[i]
192 ctx = web.repo[i]
193 n = ctx.node()
193 n = ctx.node()
194 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
194 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
195 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
195 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
196
196
197 l.insert(0, {"parity": parity.next(),
197 l.insert(0, {"parity": parity.next(),
198 "author": ctx.user(),
198 "author": ctx.user(),
199 "parent": webutil.parents(ctx, i - 1),
199 "parent": webutil.parents(ctx, i - 1),
200 "child": webutil.children(ctx, i + 1),
200 "child": webutil.children(ctx, i + 1),
201 "changelogtag": showtags,
201 "changelogtag": showtags,
202 "desc": ctx.description(),
202 "desc": ctx.description(),
203 "date": ctx.date(),
203 "date": ctx.date(),
204 "files": files,
204 "files": files,
205 "rev": i,
205 "rev": i,
206 "node": hex(n),
206 "node": hex(n),
207 "tags": webutil.nodetagsdict(web.repo, n),
207 "tags": webutil.nodetagsdict(web.repo, n),
208 "bookmarks": webutil.nodebookmarksdict(web.repo, n),
208 "bookmarks": webutil.nodebookmarksdict(web.repo, n),
209 "inbranch": webutil.nodeinbranch(web.repo, ctx),
209 "inbranch": webutil.nodeinbranch(web.repo, ctx),
210 "branches": webutil.nodebranchdict(web.repo, ctx)
210 "branches": webutil.nodebranchdict(web.repo, ctx)
211 })
211 })
212
212
213 if limit > 0:
213 if limit > 0:
214 l = l[:limit]
214 l = l[:limit]
215
215
216 for e in l:
216 for e in l:
217 yield e
217 yield e
218
218
219 revcount = shortlog and web.maxshortchanges or web.maxchanges
219 revcount = shortlog and web.maxshortchanges or web.maxchanges
220 if 'revcount' in req.form:
220 if 'revcount' in req.form:
221 revcount = int(req.form.get('revcount', [revcount])[0])
221 revcount = int(req.form.get('revcount', [revcount])[0])
222 tmpl.defaults['sessionvars']['revcount'] = revcount
222 tmpl.defaults['sessionvars']['revcount'] = revcount
223
223
224 lessvars = copy.copy(tmpl.defaults['sessionvars'])
224 lessvars = copy.copy(tmpl.defaults['sessionvars'])
225 lessvars['revcount'] = revcount / 2
225 lessvars['revcount'] = revcount / 2
226 morevars = copy.copy(tmpl.defaults['sessionvars'])
226 morevars = copy.copy(tmpl.defaults['sessionvars'])
227 morevars['revcount'] = revcount * 2
227 morevars['revcount'] = revcount * 2
228
228
229 count = len(web.repo)
229 count = len(web.repo)
230 pos = ctx.rev()
230 pos = ctx.rev()
231 start = max(0, pos - revcount + 1)
231 start = max(0, pos - revcount + 1)
232 end = min(count, start + revcount)
232 end = min(count, start + revcount)
233 pos = end - 1
233 pos = end - 1
234 parity = paritygen(web.stripecount, offset=start - end)
234 parity = paritygen(web.stripecount, offset=start - end)
235
235
236 changenav = webutil.revnavgen(pos, revcount, count, web.repo.changectx)
236 changenav = webutil.revnavgen(pos, revcount, count, web.repo.changectx)
237
237
238 return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
238 return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
239 node=hex(ctx.node()), rev=pos, changesets=count,
239 node=hex(ctx.node()), rev=pos, changesets=count,
240 entries=lambda **x: changelist(limit=0,**x),
240 entries=lambda **x: changelist(limit=0,**x),
241 latestentry=lambda **x: changelist(limit=1,**x),
241 latestentry=lambda **x: changelist(limit=1,**x),
242 archives=web.archivelist("tip"), revcount=revcount,
242 archives=web.archivelist("tip"), revcount=revcount,
243 morevars=morevars, lessvars=lessvars)
243 morevars=morevars, lessvars=lessvars)
244
244
245 def shortlog(web, req, tmpl):
245 def shortlog(web, req, tmpl):
246 return changelog(web, req, tmpl, shortlog = True)
246 return changelog(web, req, tmpl, shortlog = True)
247
247
248 def changeset(web, req, tmpl):
248 def changeset(web, req, tmpl):
249 ctx = webutil.changectx(web.repo, req)
249 ctx = webutil.changectx(web.repo, req)
250 showtags = webutil.showtag(web.repo, tmpl, 'changesettag', ctx.node())
250 showtags = webutil.showtag(web.repo, tmpl, 'changesettag', ctx.node())
251 showbookmarks = webutil.showbookmark(web.repo, tmpl, 'changesetbookmark',
251 showbookmarks = webutil.showbookmark(web.repo, tmpl, 'changesetbookmark',
252 ctx.node())
252 ctx.node())
253 showbranch = webutil.nodebranchnodefault(ctx)
253 showbranch = webutil.nodebranchnodefault(ctx)
254
254
255 files = []
255 files = []
256 parity = paritygen(web.stripecount)
256 parity = paritygen(web.stripecount)
257 for f in ctx.files():
257 for f in ctx.files():
258 template = f in ctx and 'filenodelink' or 'filenolink'
258 template = f in ctx and 'filenodelink' or 'filenolink'
259 files.append(tmpl(template,
259 files.append(tmpl(template,
260 node=ctx.hex(), file=f,
260 node=ctx.hex(), file=f,
261 parity=parity.next()))
261 parity=parity.next()))
262
262
263 parity = paritygen(web.stripecount)
263 parity = paritygen(web.stripecount)
264 style = web.config('web', 'style', 'paper')
264 style = web.config('web', 'style', 'paper')
265 if 'style' in req.form:
265 if 'style' in req.form:
266 style = req.form['style'][0]
266 style = req.form['style'][0]
267
267
268 diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
268 diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
269 return tmpl('changeset',
269 return tmpl('changeset',
270 diff=diffs,
270 diff=diffs,
271 rev=ctx.rev(),
271 rev=ctx.rev(),
272 node=ctx.hex(),
272 node=ctx.hex(),
273 parent=webutil.parents(ctx),
273 parent=webutil.parents(ctx),
274 child=webutil.children(ctx),
274 child=webutil.children(ctx),
275 changesettag=showtags,
275 changesettag=showtags,
276 changesetbookmark=showbookmarks,
276 changesetbookmark=showbookmarks,
277 changesetbranch=showbranch,
277 changesetbranch=showbranch,
278 author=ctx.user(),
278 author=ctx.user(),
279 desc=ctx.description(),
279 desc=ctx.description(),
280 date=ctx.date(),
280 date=ctx.date(),
281 files=files,
281 files=files,
282 archives=web.archivelist(ctx.hex()),
282 archives=web.archivelist(ctx.hex()),
283 tags=webutil.nodetagsdict(web.repo, ctx.node()),
283 tags=webutil.nodetagsdict(web.repo, ctx.node()),
284 bookmarks=webutil.nodebookmarksdict(web.repo, ctx.node()),
284 bookmarks=webutil.nodebookmarksdict(web.repo, ctx.node()),
285 branch=webutil.nodebranchnodefault(ctx),
285 branch=webutil.nodebranchnodefault(ctx),
286 inbranch=webutil.nodeinbranch(web.repo, ctx),
286 inbranch=webutil.nodeinbranch(web.repo, ctx),
287 branches=webutil.nodebranchdict(web.repo, ctx))
287 branches=webutil.nodebranchdict(web.repo, ctx))
288
288
289 rev = changeset
289 rev = changeset
290
290
291 def manifest(web, req, tmpl):
291 def manifest(web, req, tmpl):
292 ctx = webutil.changectx(web.repo, req)
292 ctx = webutil.changectx(web.repo, req)
293 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
293 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
294 mf = ctx.manifest()
294 mf = ctx.manifest()
295 node = ctx.node()
295 node = ctx.node()
296
296
297 files = {}
297 files = {}
298 dirs = {}
298 dirs = {}
299 parity = paritygen(web.stripecount)
299 parity = paritygen(web.stripecount)
300
300
301 if path and path[-1] != "/":
301 if path and path[-1] != "/":
302 path += "/"
302 path += "/"
303 l = len(path)
303 l = len(path)
304 abspath = "/" + path
304 abspath = "/" + path
305
305
306 for f, n in mf.iteritems():
306 for f, n in mf.iteritems():
307 if f[:l] != path:
307 if f[:l] != path:
308 continue
308 continue
309 remain = f[l:]
309 remain = f[l:]
310 elements = remain.split('/')
310 elements = remain.split('/')
311 if len(elements) == 1:
311 if len(elements) == 1:
312 files[remain] = f
312 files[remain] = f
313 else:
313 else:
314 h = dirs # need to retain ref to dirs (root)
314 h = dirs # need to retain ref to dirs (root)
315 for elem in elements[0:-1]:
315 for elem in elements[0:-1]:
316 if elem not in h:
316 if elem not in h:
317 h[elem] = {}
317 h[elem] = {}
318 h = h[elem]
318 h = h[elem]
319 if len(h) > 1:
319 if len(h) > 1:
320 break
320 break
321 h[None] = None # denotes files present
321 h[None] = None # denotes files present
322
322
323 if mf and not files and not dirs:
323 if mf and not files and not dirs:
324 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
324 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
325
325
326 def filelist(**map):
326 def filelist(**map):
327 for f in sorted(files):
327 for f in sorted(files):
328 full = files[f]
328 full = files[f]
329
329
330 fctx = ctx.filectx(full)
330 fctx = ctx.filectx(full)
331 yield {"file": full,
331 yield {"file": full,
332 "parity": parity.next(),
332 "parity": parity.next(),
333 "basename": f,
333 "basename": f,
334 "date": fctx.date(),
334 "date": fctx.date(),
335 "size": fctx.size(),
335 "size": fctx.size(),
336 "permissions": mf.flags(full)}
336 "permissions": mf.flags(full)}
337
337
338 def dirlist(**map):
338 def dirlist(**map):
339 for d in sorted(dirs):
339 for d in sorted(dirs):
340
340
341 emptydirs = []
341 emptydirs = []
342 h = dirs[d]
342 h = dirs[d]
343 while isinstance(h, dict) and len(h) == 1:
343 while isinstance(h, dict) and len(h) == 1:
344 k, v = h.items()[0]
344 k, v = h.items()[0]
345 if v:
345 if v:
346 emptydirs.append(k)
346 emptydirs.append(k)
347 h = v
347 h = v
348
348
349 path = "%s%s" % (abspath, d)
349 path = "%s%s" % (abspath, d)
350 yield {"parity": parity.next(),
350 yield {"parity": parity.next(),
351 "path": path,
351 "path": path,
352 "emptydirs": "/".join(emptydirs),
352 "emptydirs": "/".join(emptydirs),
353 "basename": d}
353 "basename": d}
354
354
355 return tmpl("manifest",
355 return tmpl("manifest",
356 rev=ctx.rev(),
356 rev=ctx.rev(),
357 node=hex(node),
357 node=hex(node),
358 path=abspath,
358 path=abspath,
359 up=webutil.up(abspath),
359 up=webutil.up(abspath),
360 upparity=parity.next(),
360 upparity=parity.next(),
361 fentries=filelist,
361 fentries=filelist,
362 dentries=dirlist,
362 dentries=dirlist,
363 archives=web.archivelist(hex(node)),
363 archives=web.archivelist(hex(node)),
364 tags=webutil.nodetagsdict(web.repo, node),
364 tags=webutil.nodetagsdict(web.repo, node),
365 inbranch=webutil.nodeinbranch(web.repo, ctx),
365 inbranch=webutil.nodeinbranch(web.repo, ctx),
366 branches=webutil.nodebranchdict(web.repo, ctx))
366 branches=webutil.nodebranchdict(web.repo, ctx))
367
367
368 def tags(web, req, tmpl):
368 def tags(web, req, tmpl):
369 i = web.repo.tagslist()
369 i = web.repo.tagslist()
370 i.reverse()
370 i.reverse()
371 parity = paritygen(web.stripecount)
371 parity = paritygen(web.stripecount)
372
372
373 def entries(notip=False, limit=0, **map):
373 def entries(notip=False, limit=0, **map):
374 count = 0
374 count = 0
375 for k, n in i:
375 for k, n in i:
376 if notip and k == "tip":
376 if notip and k == "tip":
377 continue
377 continue
378 if limit > 0 and count >= limit:
378 if limit > 0 and count >= limit:
379 continue
379 continue
380 count = count + 1
380 count = count + 1
381 yield {"parity": parity.next(),
381 yield {"parity": parity.next(),
382 "tag": k,
382 "tag": k,
383 "date": web.repo[n].date(),
383 "date": web.repo[n].date(),
384 "node": hex(n)}
384 "node": hex(n)}
385
385
386 return tmpl("tags",
386 return tmpl("tags",
387 node=hex(web.repo.changelog.tip()),
387 node=hex(web.repo.changelog.tip()),
388 entries=lambda **x: entries(False, 0, **x),
388 entries=lambda **x: entries(False, 0, **x),
389 entriesnotip=lambda **x: entries(True, 0, **x),
389 entriesnotip=lambda **x: entries(True, 0, **x),
390 latestentry=lambda **x: entries(True, 1, **x))
390 latestentry=lambda **x: entries(True, 1, **x))
391
391
392 def bookmarks(web, req, tmpl):
393 i = web.repo._bookmarks.items()
394 i.reverse()
395 parity = paritygen(web.stripecount)
396
397 def entries(notip=False, limit=0, **map):
398 count = 0
399 for k, n in i:
400 if notip and k == "tip":
401 continue
402 if limit > 0 and count >= limit:
403 continue
404 count = count + 1
405 yield {"parity": parity.next(),
406 "bookmark": k,
407 "date": web.repo[n].date(),
408 "node": hex(n)}
409
410 return tmpl("bookmarks",
411 node=hex(web.repo.changelog.tip()),
412 entries=lambda **x: entries(False, 0, **x),
413 entriesnotip=lambda **x: entries(True, 0, **x),
414 latestentry=lambda **x: entries(True, 1, **x))
415
392 def branches(web, req, tmpl):
416 def branches(web, req, tmpl):
393 tips = (web.repo[n] for t, n in web.repo.branchtags().iteritems())
417 tips = (web.repo[n] for t, n in web.repo.branchtags().iteritems())
394 heads = web.repo.heads()
418 heads = web.repo.heads()
395 parity = paritygen(web.stripecount)
419 parity = paritygen(web.stripecount)
396 sortkey = lambda ctx: ('close' not in ctx.extra(), ctx.rev())
420 sortkey = lambda ctx: ('close' not in ctx.extra(), ctx.rev())
397
421
398 def entries(limit, **map):
422 def entries(limit, **map):
399 count = 0
423 count = 0
400 for ctx in sorted(tips, key=sortkey, reverse=True):
424 for ctx in sorted(tips, key=sortkey, reverse=True):
401 if limit > 0 and count >= limit:
425 if limit > 0 and count >= limit:
402 return
426 return
403 count += 1
427 count += 1
404 if ctx.node() not in heads:
428 if ctx.node() not in heads:
405 status = 'inactive'
429 status = 'inactive'
406 elif not web.repo.branchheads(ctx.branch()):
430 elif not web.repo.branchheads(ctx.branch()):
407 status = 'closed'
431 status = 'closed'
408 else:
432 else:
409 status = 'open'
433 status = 'open'
410 yield {'parity': parity.next(),
434 yield {'parity': parity.next(),
411 'branch': ctx.branch(),
435 'branch': ctx.branch(),
412 'status': status,
436 'status': status,
413 'node': ctx.hex(),
437 'node': ctx.hex(),
414 'date': ctx.date()}
438 'date': ctx.date()}
415
439
416 return tmpl('branches', node=hex(web.repo.changelog.tip()),
440 return tmpl('branches', node=hex(web.repo.changelog.tip()),
417 entries=lambda **x: entries(0, **x),
441 entries=lambda **x: entries(0, **x),
418 latestentry=lambda **x: entries(1, **x))
442 latestentry=lambda **x: entries(1, **x))
419
443
420 def summary(web, req, tmpl):
444 def summary(web, req, tmpl):
421 i = web.repo.tagslist()
445 i = web.repo.tagslist()
422 i.reverse()
446 i.reverse()
423
447
424 def tagentries(**map):
448 def tagentries(**map):
425 parity = paritygen(web.stripecount)
449 parity = paritygen(web.stripecount)
426 count = 0
450 count = 0
427 for k, n in i:
451 for k, n in i:
428 if k == "tip": # skip tip
452 if k == "tip": # skip tip
429 continue
453 continue
430
454
431 count += 1
455 count += 1
432 if count > 10: # limit to 10 tags
456 if count > 10: # limit to 10 tags
433 break
457 break
434
458
435 yield tmpl("tagentry",
459 yield tmpl("tagentry",
436 parity=parity.next(),
460 parity=parity.next(),
437 tag=k,
461 tag=k,
438 node=hex(n),
462 node=hex(n),
439 date=web.repo[n].date())
463 date=web.repo[n].date())
440
464
441 def branches(**map):
465 def branches(**map):
442 parity = paritygen(web.stripecount)
466 parity = paritygen(web.stripecount)
443
467
444 b = web.repo.branchtags()
468 b = web.repo.branchtags()
445 l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()]
469 l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()]
446 for r, n, t in sorted(l):
470 for r, n, t in sorted(l):
447 yield {'parity': parity.next(),
471 yield {'parity': parity.next(),
448 'branch': t,
472 'branch': t,
449 'node': hex(n),
473 'node': hex(n),
450 'date': web.repo[n].date()}
474 'date': web.repo[n].date()}
451
475
452 def changelist(**map):
476 def changelist(**map):
453 parity = paritygen(web.stripecount, offset=start - end)
477 parity = paritygen(web.stripecount, offset=start - end)
454 l = [] # build a list in forward order for efficiency
478 l = [] # build a list in forward order for efficiency
455 for i in xrange(start, end):
479 for i in xrange(start, end):
456 ctx = web.repo[i]
480 ctx = web.repo[i]
457 n = ctx.node()
481 n = ctx.node()
458 hn = hex(n)
482 hn = hex(n)
459
483
460 l.insert(0, tmpl(
484 l.insert(0, tmpl(
461 'shortlogentry',
485 'shortlogentry',
462 parity=parity.next(),
486 parity=parity.next(),
463 author=ctx.user(),
487 author=ctx.user(),
464 desc=ctx.description(),
488 desc=ctx.description(),
465 date=ctx.date(),
489 date=ctx.date(),
466 rev=i,
490 rev=i,
467 node=hn,
491 node=hn,
468 tags=webutil.nodetagsdict(web.repo, n),
492 tags=webutil.nodetagsdict(web.repo, n),
469 inbranch=webutil.nodeinbranch(web.repo, ctx),
493 inbranch=webutil.nodeinbranch(web.repo, ctx),
470 branches=webutil.nodebranchdict(web.repo, ctx)))
494 branches=webutil.nodebranchdict(web.repo, ctx)))
471
495
472 yield l
496 yield l
473
497
474 tip = web.repo['tip']
498 tip = web.repo['tip']
475 count = len(web.repo)
499 count = len(web.repo)
476 start = max(0, count - web.maxchanges)
500 start = max(0, count - web.maxchanges)
477 end = min(count, start + web.maxchanges)
501 end = min(count, start + web.maxchanges)
478
502
479 return tmpl("summary",
503 return tmpl("summary",
480 desc=web.config("web", "description", "unknown"),
504 desc=web.config("web", "description", "unknown"),
481 owner=get_contact(web.config) or "unknown",
505 owner=get_contact(web.config) or "unknown",
482 lastchange=tip.date(),
506 lastchange=tip.date(),
483 tags=tagentries,
507 tags=tagentries,
484 branches=branches,
508 branches=branches,
485 shortlog=changelist,
509 shortlog=changelist,
486 node=tip.hex(),
510 node=tip.hex(),
487 archives=web.archivelist("tip"))
511 archives=web.archivelist("tip"))
488
512
489 def filediff(web, req, tmpl):
513 def filediff(web, req, tmpl):
490 fctx, ctx = None, None
514 fctx, ctx = None, None
491 try:
515 try:
492 fctx = webutil.filectx(web.repo, req)
516 fctx = webutil.filectx(web.repo, req)
493 except LookupError:
517 except LookupError:
494 ctx = webutil.changectx(web.repo, req)
518 ctx = webutil.changectx(web.repo, req)
495 path = webutil.cleanpath(web.repo, req.form['file'][0])
519 path = webutil.cleanpath(web.repo, req.form['file'][0])
496 if path not in ctx.files():
520 if path not in ctx.files():
497 raise
521 raise
498
522
499 if fctx is not None:
523 if fctx is not None:
500 n = fctx.node()
524 n = fctx.node()
501 path = fctx.path()
525 path = fctx.path()
502 else:
526 else:
503 n = ctx.node()
527 n = ctx.node()
504 # path already defined in except clause
528 # path already defined in except clause
505
529
506 parity = paritygen(web.stripecount)
530 parity = paritygen(web.stripecount)
507 style = web.config('web', 'style', 'paper')
531 style = web.config('web', 'style', 'paper')
508 if 'style' in req.form:
532 if 'style' in req.form:
509 style = req.form['style'][0]
533 style = req.form['style'][0]
510
534
511 diffs = webutil.diffs(web.repo, tmpl, fctx or ctx, [path], parity, style)
535 diffs = webutil.diffs(web.repo, tmpl, fctx or ctx, [path], parity, style)
512 rename = fctx and webutil.renamelink(fctx) or []
536 rename = fctx and webutil.renamelink(fctx) or []
513 ctx = fctx and fctx or ctx
537 ctx = fctx and fctx or ctx
514 return tmpl("filediff",
538 return tmpl("filediff",
515 file=path,
539 file=path,
516 node=hex(n),
540 node=hex(n),
517 rev=ctx.rev(),
541 rev=ctx.rev(),
518 date=ctx.date(),
542 date=ctx.date(),
519 desc=ctx.description(),
543 desc=ctx.description(),
520 author=ctx.user(),
544 author=ctx.user(),
521 rename=rename,
545 rename=rename,
522 branch=webutil.nodebranchnodefault(ctx),
546 branch=webutil.nodebranchnodefault(ctx),
523 parent=webutil.parents(ctx),
547 parent=webutil.parents(ctx),
524 child=webutil.children(ctx),
548 child=webutil.children(ctx),
525 diff=diffs)
549 diff=diffs)
526
550
527 diff = filediff
551 diff = filediff
528
552
529 def annotate(web, req, tmpl):
553 def annotate(web, req, tmpl):
530 fctx = webutil.filectx(web.repo, req)
554 fctx = webutil.filectx(web.repo, req)
531 f = fctx.path()
555 f = fctx.path()
532 parity = paritygen(web.stripecount)
556 parity = paritygen(web.stripecount)
533
557
534 def annotate(**map):
558 def annotate(**map):
535 last = None
559 last = None
536 if binary(fctx.data()):
560 if binary(fctx.data()):
537 mt = (mimetypes.guess_type(fctx.path())[0]
561 mt = (mimetypes.guess_type(fctx.path())[0]
538 or 'application/octet-stream')
562 or 'application/octet-stream')
539 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
563 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
540 '(binary:%s)' % mt)])
564 '(binary:%s)' % mt)])
541 else:
565 else:
542 lines = enumerate(fctx.annotate(follow=True, linenumber=True))
566 lines = enumerate(fctx.annotate(follow=True, linenumber=True))
543 for lineno, ((f, targetline), l) in lines:
567 for lineno, ((f, targetline), l) in lines:
544 fnode = f.filenode()
568 fnode = f.filenode()
545
569
546 if last != fnode:
570 if last != fnode:
547 last = fnode
571 last = fnode
548
572
549 yield {"parity": parity.next(),
573 yield {"parity": parity.next(),
550 "node": hex(f.node()),
574 "node": hex(f.node()),
551 "rev": f.rev(),
575 "rev": f.rev(),
552 "author": f.user(),
576 "author": f.user(),
553 "desc": f.description(),
577 "desc": f.description(),
554 "file": f.path(),
578 "file": f.path(),
555 "targetline": targetline,
579 "targetline": targetline,
556 "line": l,
580 "line": l,
557 "lineid": "l%d" % (lineno + 1),
581 "lineid": "l%d" % (lineno + 1),
558 "linenumber": "% 6d" % (lineno + 1),
582 "linenumber": "% 6d" % (lineno + 1),
559 "revdate": f.date()}
583 "revdate": f.date()}
560
584
561 return tmpl("fileannotate",
585 return tmpl("fileannotate",
562 file=f,
586 file=f,
563 annotate=annotate,
587 annotate=annotate,
564 path=webutil.up(f),
588 path=webutil.up(f),
565 rev=fctx.rev(),
589 rev=fctx.rev(),
566 node=hex(fctx.node()),
590 node=hex(fctx.node()),
567 author=fctx.user(),
591 author=fctx.user(),
568 date=fctx.date(),
592 date=fctx.date(),
569 desc=fctx.description(),
593 desc=fctx.description(),
570 rename=webutil.renamelink(fctx),
594 rename=webutil.renamelink(fctx),
571 branch=webutil.nodebranchnodefault(fctx),
595 branch=webutil.nodebranchnodefault(fctx),
572 parent=webutil.parents(fctx),
596 parent=webutil.parents(fctx),
573 child=webutil.children(fctx),
597 child=webutil.children(fctx),
574 permissions=fctx.manifest().flags(f))
598 permissions=fctx.manifest().flags(f))
575
599
576 def filelog(web, req, tmpl):
600 def filelog(web, req, tmpl):
577
601
578 try:
602 try:
579 fctx = webutil.filectx(web.repo, req)
603 fctx = webutil.filectx(web.repo, req)
580 f = fctx.path()
604 f = fctx.path()
581 fl = fctx.filelog()
605 fl = fctx.filelog()
582 except error.LookupError:
606 except error.LookupError:
583 f = webutil.cleanpath(web.repo, req.form['file'][0])
607 f = webutil.cleanpath(web.repo, req.form['file'][0])
584 fl = web.repo.file(f)
608 fl = web.repo.file(f)
585 numrevs = len(fl)
609 numrevs = len(fl)
586 if not numrevs: # file doesn't exist at all
610 if not numrevs: # file doesn't exist at all
587 raise
611 raise
588 rev = webutil.changectx(web.repo, req).rev()
612 rev = webutil.changectx(web.repo, req).rev()
589 first = fl.linkrev(0)
613 first = fl.linkrev(0)
590 if rev < first: # current rev is from before file existed
614 if rev < first: # current rev is from before file existed
591 raise
615 raise
592 frev = numrevs - 1
616 frev = numrevs - 1
593 while fl.linkrev(frev) > rev:
617 while fl.linkrev(frev) > rev:
594 frev -= 1
618 frev -= 1
595 fctx = web.repo.filectx(f, fl.linkrev(frev))
619 fctx = web.repo.filectx(f, fl.linkrev(frev))
596
620
597 revcount = web.maxshortchanges
621 revcount = web.maxshortchanges
598 if 'revcount' in req.form:
622 if 'revcount' in req.form:
599 revcount = int(req.form.get('revcount', [revcount])[0])
623 revcount = int(req.form.get('revcount', [revcount])[0])
600 tmpl.defaults['sessionvars']['revcount'] = revcount
624 tmpl.defaults['sessionvars']['revcount'] = revcount
601
625
602 lessvars = copy.copy(tmpl.defaults['sessionvars'])
626 lessvars = copy.copy(tmpl.defaults['sessionvars'])
603 lessvars['revcount'] = revcount / 2
627 lessvars['revcount'] = revcount / 2
604 morevars = copy.copy(tmpl.defaults['sessionvars'])
628 morevars = copy.copy(tmpl.defaults['sessionvars'])
605 morevars['revcount'] = revcount * 2
629 morevars['revcount'] = revcount * 2
606
630
607 count = fctx.filerev() + 1
631 count = fctx.filerev() + 1
608 start = max(0, fctx.filerev() - revcount + 1) # first rev on this page
632 start = max(0, fctx.filerev() - revcount + 1) # first rev on this page
609 end = min(count, start + revcount) # last rev on this page
633 end = min(count, start + revcount) # last rev on this page
610 parity = paritygen(web.stripecount, offset=start - end)
634 parity = paritygen(web.stripecount, offset=start - end)
611
635
612 def entries(limit=0, **map):
636 def entries(limit=0, **map):
613 l = []
637 l = []
614
638
615 repo = web.repo
639 repo = web.repo
616 for i in xrange(start, end):
640 for i in xrange(start, end):
617 iterfctx = fctx.filectx(i)
641 iterfctx = fctx.filectx(i)
618
642
619 l.insert(0, {"parity": parity.next(),
643 l.insert(0, {"parity": parity.next(),
620 "filerev": i,
644 "filerev": i,
621 "file": f,
645 "file": f,
622 "node": hex(iterfctx.node()),
646 "node": hex(iterfctx.node()),
623 "author": iterfctx.user(),
647 "author": iterfctx.user(),
624 "date": iterfctx.date(),
648 "date": iterfctx.date(),
625 "rename": webutil.renamelink(iterfctx),
649 "rename": webutil.renamelink(iterfctx),
626 "parent": webutil.parents(iterfctx),
650 "parent": webutil.parents(iterfctx),
627 "child": webutil.children(iterfctx),
651 "child": webutil.children(iterfctx),
628 "desc": iterfctx.description(),
652 "desc": iterfctx.description(),
629 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
653 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
630 "branch": webutil.nodebranchnodefault(iterfctx),
654 "branch": webutil.nodebranchnodefault(iterfctx),
631 "inbranch": webutil.nodeinbranch(repo, iterfctx),
655 "inbranch": webutil.nodeinbranch(repo, iterfctx),
632 "branches": webutil.nodebranchdict(repo, iterfctx)})
656 "branches": webutil.nodebranchdict(repo, iterfctx)})
633
657
634 if limit > 0:
658 if limit > 0:
635 l = l[:limit]
659 l = l[:limit]
636
660
637 for e in l:
661 for e in l:
638 yield e
662 yield e
639
663
640 nodefunc = lambda x: fctx.filectx(fileid=x)
664 nodefunc = lambda x: fctx.filectx(fileid=x)
641 nav = webutil.revnavgen(end - 1, revcount, count, nodefunc)
665 nav = webutil.revnavgen(end - 1, revcount, count, nodefunc)
642 return tmpl("filelog", file=f, node=hex(fctx.node()), nav=nav,
666 return tmpl("filelog", file=f, node=hex(fctx.node()), nav=nav,
643 entries=lambda **x: entries(limit=0, **x),
667 entries=lambda **x: entries(limit=0, **x),
644 latestentry=lambda **x: entries(limit=1, **x),
668 latestentry=lambda **x: entries(limit=1, **x),
645 revcount=revcount, morevars=morevars, lessvars=lessvars)
669 revcount=revcount, morevars=morevars, lessvars=lessvars)
646
670
647 def archive(web, req, tmpl):
671 def archive(web, req, tmpl):
648 type_ = req.form.get('type', [None])[0]
672 type_ = req.form.get('type', [None])[0]
649 allowed = web.configlist("web", "allow_archive")
673 allowed = web.configlist("web", "allow_archive")
650 key = req.form['node'][0]
674 key = req.form['node'][0]
651
675
652 if type_ not in web.archives:
676 if type_ not in web.archives:
653 msg = 'Unsupported archive type: %s' % type_
677 msg = 'Unsupported archive type: %s' % type_
654 raise ErrorResponse(HTTP_NOT_FOUND, msg)
678 raise ErrorResponse(HTTP_NOT_FOUND, msg)
655
679
656 if not ((type_ in allowed or
680 if not ((type_ in allowed or
657 web.configbool("web", "allow" + type_, False))):
681 web.configbool("web", "allow" + type_, False))):
658 msg = 'Archive type not allowed: %s' % type_
682 msg = 'Archive type not allowed: %s' % type_
659 raise ErrorResponse(HTTP_FORBIDDEN, msg)
683 raise ErrorResponse(HTTP_FORBIDDEN, msg)
660
684
661 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
685 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
662 cnode = web.repo.lookup(key)
686 cnode = web.repo.lookup(key)
663 arch_version = key
687 arch_version = key
664 if cnode == key or key == 'tip':
688 if cnode == key or key == 'tip':
665 arch_version = short(cnode)
689 arch_version = short(cnode)
666 name = "%s-%s" % (reponame, arch_version)
690 name = "%s-%s" % (reponame, arch_version)
667 mimetype, artype, extension, encoding = web.archive_specs[type_]
691 mimetype, artype, extension, encoding = web.archive_specs[type_]
668 headers = [
692 headers = [
669 ('Content-Type', mimetype),
693 ('Content-Type', mimetype),
670 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
694 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
671 ]
695 ]
672 if encoding:
696 if encoding:
673 headers.append(('Content-Encoding', encoding))
697 headers.append(('Content-Encoding', encoding))
674 req.header(headers)
698 req.header(headers)
675 req.respond(HTTP_OK)
699 req.respond(HTTP_OK)
676 archival.archive(web.repo, req, cnode, artype, prefix=name)
700 archival.archive(web.repo, req, cnode, artype, prefix=name)
677 return []
701 return []
678
702
679
703
680 def static(web, req, tmpl):
704 def static(web, req, tmpl):
681 fname = req.form['file'][0]
705 fname = req.form['file'][0]
682 # a repo owner may set web.static in .hg/hgrc to get any file
706 # a repo owner may set web.static in .hg/hgrc to get any file
683 # readable by the user running the CGI script
707 # readable by the user running the CGI script
684 static = web.config("web", "static", None, untrusted=False)
708 static = web.config("web", "static", None, untrusted=False)
685 if not static:
709 if not static:
686 tp = web.templatepath or templater.templatepath()
710 tp = web.templatepath or templater.templatepath()
687 if isinstance(tp, str):
711 if isinstance(tp, str):
688 tp = [tp]
712 tp = [tp]
689 static = [os.path.join(p, 'static') for p in tp]
713 static = [os.path.join(p, 'static') for p in tp]
690 return [staticfile(static, fname, req)]
714 return [staticfile(static, fname, req)]
691
715
692 def graph(web, req, tmpl):
716 def graph(web, req, tmpl):
693
717
694 rev = webutil.changectx(web.repo, req).rev()
718 rev = webutil.changectx(web.repo, req).rev()
695 bg_height = 39
719 bg_height = 39
696 revcount = web.maxshortchanges
720 revcount = web.maxshortchanges
697 if 'revcount' in req.form:
721 if 'revcount' in req.form:
698 revcount = int(req.form.get('revcount', [revcount])[0])
722 revcount = int(req.form.get('revcount', [revcount])[0])
699 tmpl.defaults['sessionvars']['revcount'] = revcount
723 tmpl.defaults['sessionvars']['revcount'] = revcount
700
724
701 lessvars = copy.copy(tmpl.defaults['sessionvars'])
725 lessvars = copy.copy(tmpl.defaults['sessionvars'])
702 lessvars['revcount'] = revcount / 2
726 lessvars['revcount'] = revcount / 2
703 morevars = copy.copy(tmpl.defaults['sessionvars'])
727 morevars = copy.copy(tmpl.defaults['sessionvars'])
704 morevars['revcount'] = revcount * 2
728 morevars['revcount'] = revcount * 2
705
729
706 max_rev = len(web.repo) - 1
730 max_rev = len(web.repo) - 1
707 revcount = min(max_rev, revcount)
731 revcount = min(max_rev, revcount)
708 revnode = web.repo.changelog.node(rev)
732 revnode = web.repo.changelog.node(rev)
709 revnode_hex = hex(revnode)
733 revnode_hex = hex(revnode)
710 uprev = min(max_rev, rev + revcount)
734 uprev = min(max_rev, rev + revcount)
711 downrev = max(0, rev - revcount)
735 downrev = max(0, rev - revcount)
712 count = len(web.repo)
736 count = len(web.repo)
713 changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx)
737 changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx)
714
738
715 dag = graphmod.revisions(web.repo, rev, downrev)
739 dag = graphmod.revisions(web.repo, rev, downrev)
716 tree = list(graphmod.colored(dag))
740 tree = list(graphmod.colored(dag))
717 canvasheight = (len(tree) + 1) * bg_height - 27
741 canvasheight = (len(tree) + 1) * bg_height - 27
718 data = []
742 data = []
719 for (id, type, ctx, vtx, edges) in tree:
743 for (id, type, ctx, vtx, edges) in tree:
720 if type != graphmod.CHANGESET:
744 if type != graphmod.CHANGESET:
721 continue
745 continue
722 node = short(ctx.node())
746 node = short(ctx.node())
723 age = templatefilters.age(ctx.date())
747 age = templatefilters.age(ctx.date())
724 desc = templatefilters.firstline(ctx.description())
748 desc = templatefilters.firstline(ctx.description())
725 desc = cgi.escape(templatefilters.nonempty(desc))
749 desc = cgi.escape(templatefilters.nonempty(desc))
726 user = cgi.escape(templatefilters.person(ctx.user()))
750 user = cgi.escape(templatefilters.person(ctx.user()))
727 branch = ctx.branch()
751 branch = ctx.branch()
728 branch = branch, web.repo.branchtags().get(branch) == ctx.node()
752 branch = branch, web.repo.branchtags().get(branch) == ctx.node()
729 data.append((node, vtx, edges, desc, user, age, branch, ctx.tags(), ctx.bookmarks()))
753 data.append((node, vtx, edges, desc, user, age, branch, ctx.tags(),
754 ctx.bookmarks()))
730
755
731 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
756 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
732 lessvars=lessvars, morevars=morevars, downrev=downrev,
757 lessvars=lessvars, morevars=morevars, downrev=downrev,
733 canvasheight=canvasheight, jsdata=data, bg_height=bg_height,
758 canvasheight=canvasheight, jsdata=data, bg_height=bg_height,
734 node=revnode_hex, changenav=changenav)
759 node=revnode_hex, changenav=changenav)
735
760
736 def _getdoc(e):
761 def _getdoc(e):
737 doc = e[0].__doc__
762 doc = e[0].__doc__
738 if doc:
763 if doc:
739 doc = doc.split('\n')[0]
764 doc = doc.split('\n')[0]
740 else:
765 else:
741 doc = _('(no help text available)')
766 doc = _('(no help text available)')
742 return doc
767 return doc
743
768
744 def help(web, req, tmpl):
769 def help(web, req, tmpl):
745 from mercurial import commands # avoid cycle
770 from mercurial import commands # avoid cycle
746
771
747 topicname = req.form.get('node', [None])[0]
772 topicname = req.form.get('node', [None])[0]
748 if not topicname:
773 if not topicname:
749 topic = []
774 topic = []
750
775
751 def topics(**map):
776 def topics(**map):
752 for entries, summary, _ in helpmod.helptable:
777 for entries, summary, _ in helpmod.helptable:
753 entries = sorted(entries, key=len)
778 entries = sorted(entries, key=len)
754 yield {'topic': entries[-1], 'summary': summary}
779 yield {'topic': entries[-1], 'summary': summary}
755
780
756 early, other = [], []
781 early, other = [], []
757 primary = lambda s: s.split('|')[0]
782 primary = lambda s: s.split('|')[0]
758 for c, e in commands.table.iteritems():
783 for c, e in commands.table.iteritems():
759 doc = _getdoc(e)
784 doc = _getdoc(e)
760 if 'DEPRECATED' in doc or c.startswith('debug'):
785 if 'DEPRECATED' in doc or c.startswith('debug'):
761 continue
786 continue
762 cmd = primary(c)
787 cmd = primary(c)
763 if cmd.startswith('^'):
788 if cmd.startswith('^'):
764 early.append((cmd[1:], doc))
789 early.append((cmd[1:], doc))
765 else:
790 else:
766 other.append((cmd, doc))
791 other.append((cmd, doc))
767
792
768 early.sort()
793 early.sort()
769 other.sort()
794 other.sort()
770
795
771 def earlycommands(**map):
796 def earlycommands(**map):
772 for c, doc in early:
797 for c, doc in early:
773 yield {'topic': c, 'summary': doc}
798 yield {'topic': c, 'summary': doc}
774
799
775 def othercommands(**map):
800 def othercommands(**map):
776 for c, doc in other:
801 for c, doc in other:
777 yield {'topic': c, 'summary': doc}
802 yield {'topic': c, 'summary': doc}
778
803
779 return tmpl('helptopics', topics=topics, earlycommands=earlycommands,
804 return tmpl('helptopics', topics=topics, earlycommands=earlycommands,
780 othercommands=othercommands, title='Index')
805 othercommands=othercommands, title='Index')
781
806
782 u = webutil.wsgiui()
807 u = webutil.wsgiui()
783 u.pushbuffer()
808 u.pushbuffer()
784 try:
809 try:
785 commands.help_(u, topicname)
810 commands.help_(u, topicname)
786 except error.UnknownCommand:
811 except error.UnknownCommand:
787 raise ErrorResponse(HTTP_NOT_FOUND)
812 raise ErrorResponse(HTTP_NOT_FOUND)
788 doc = u.popbuffer()
813 doc = u.popbuffer()
789 return tmpl('help', topic=topicname, doc=doc)
814 return tmpl('help', topic=topicname, doc=doc)
@@ -1,59 +1,60 b''
1 {header}
1 {header}
2 <title>{repo|escape}: branches</title>
2 <title>{repo|escape}: branches</title>
3 <link rel="alternate" type="application/atom+xml"
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-tags" title="Atom feed for {repo|escape}: branches" />
4 href="{url}atom-tags" title="Atom feed for {repo|escape}: branches" />
5 <link rel="alternate" type="application/rss+xml"
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-tags" title="RSS feed for {repo|escape}: branches" />
6 href="{url}rss-tags" title="RSS feed for {repo|escape}: branches" />
7 </head>
7 </head>
8 <body>
8 <body>
9
9
10 <div class="container">
10 <div class="container">
11 <div class="menu">
11 <div class="menu">
12 <div class="logo">
12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="http://mercurial.selenic.com/">
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 </div>
15 </div>
16 <ul>
16 <ul>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
20 <li class="active">branches</li>
21 <li class="active">branches</li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
24 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
24 </ul>
25 </ul>
25 </div>
26 </div>
26
27
27 <div class="main">
28 <div class="main">
28 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <h3>branches</h3>
30 <h3>branches</h3>
30
31
31 <form class="search" action="{url}log">
32 <form class="search" action="{url}log">
32 {sessionvars%hiddenformentry}
33 {sessionvars%hiddenformentry}
33 <p><input name="rev" id="search1" type="text" size="30" /></p>
34 <p><input name="rev" id="search1" type="text" size="30" /></p>
34 <div id="hint">find changesets by author, revision,
35 <div id="hint">find changesets by author, revision,
35 files, or words in the commit message</div>
36 files, or words in the commit message</div>
36 </form>
37 </form>
37
38
38 <table class="bigtable">
39 <table class="bigtable">
39 <tr>
40 <tr>
40 <th>branch</th>
41 <th>branch</th>
41 <th>node</th>
42 <th>node</th>
42 </tr>
43 </tr>
43 {entries %
44 {entries %
44 ' <tr class="tagEntry parity{parity}">
45 ' <tr class="tagEntry parity{parity}">
45 <td>
46 <td>
46 <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
47 <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
47 {branch|escape}
48 {branch|escape}
48 </a>
49 </a>
49 </td>
50 </td>
50 <td class="node">
51 <td class="node">
51 {node|short}
52 {node|short}
52 </td>
53 </td>
53 </tr>'
54 </tr>'
54 }
55 }
55 </table>
56 </table>
56 </div>
57 </div>
57 </div>
58 </div>
58
59
59 {footer}
60 {footer}
@@ -1,74 +1,75 b''
1 {header}
1 {header}
2 <title>{repo|escape}: {node|short}</title>
2 <title>{repo|escape}: {node|short}</title>
3 </head>
3 </head>
4 <body>
4 <body>
5 <div class="container">
5 <div class="container">
6 <div class="menu">
6 <div class="menu">
7 <div class="logo">
7 <div class="logo">
8 <a href="http://mercurial.selenic.com/">
8 <a href="http://mercurial.selenic.com/">
9 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
9 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
10 </div>
10 </div>
11 <ul>
11 <ul>
12 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
12 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
13 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
13 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
14 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
14 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
15 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
15 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
16 </ul>
17 </ul>
17 <ul>
18 <ul>
18 <li class="active">changeset</li>
19 <li class="active">changeset</li>
19 <li><a href="{url}raw-rev/{node|short}{sessionvars%urlparameter}">raw</a></li>
20 <li><a href="{url}raw-rev/{node|short}{sessionvars%urlparameter}">raw</a></li>
20 <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">browse</a></li>
21 <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">browse</a></li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 {archives%archiveentry}
24 {archives%archiveentry}
24 </ul>
25 </ul>
25 <ul>
26 <ul>
26 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
27 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
27 </ul>
28 </ul>
28 </div>
29 </div>
29
30
30 <div class="main">
31 <div class="main">
31
32
32 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
33 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
33 <h3>changeset {rev}:{node|short} {changesetbranch%changelogbranchname} {changesettag} {changesetbookmark}</h3>
34 <h3>changeset {rev}:{node|short} {changesetbranch%changelogbranchname} {changesettag} {changesetbookmark}</h3>
34
35
35 <form class="search" action="{url}log">
36 <form class="search" action="{url}log">
36 {sessionvars%hiddenformentry}
37 {sessionvars%hiddenformentry}
37 <p><input name="rev" id="search1" type="text" size="30" /></p>
38 <p><input name="rev" id="search1" type="text" size="30" /></p>
38 <div id="hint">find changesets by author, revision,
39 <div id="hint">find changesets by author, revision,
39 files, or words in the commit message</div>
40 files, or words in the commit message</div>
40 </form>
41 </form>
41
42
42 <div class="description">{desc|strip|escape|addbreaks|nonempty}</div>
43 <div class="description">{desc|strip|escape|addbreaks|nonempty}</div>
43
44
44 <table id="changesetEntry">
45 <table id="changesetEntry">
45 <tr>
46 <tr>
46 <th class="author">author</th>
47 <th class="author">author</th>
47 <td class="author">{author|obfuscate}</td>
48 <td class="author">{author|obfuscate}</td>
48 </tr>
49 </tr>
49 <tr>
50 <tr>
50 <th class="date">date</th>
51 <th class="date">date</th>
51 <td class="date">{date|date} ({date|age})</td></tr>
52 <td class="date">{date|date} ({date|age})</td></tr>
52 <tr>
53 <tr>
53 <th class="author">parents</th>
54 <th class="author">parents</th>
54 <td class="author">{parent%changesetparent}</td>
55 <td class="author">{parent%changesetparent}</td>
55 </tr>
56 </tr>
56 <tr>
57 <tr>
57 <th class="author">children</th>
58 <th class="author">children</th>
58 <td class="author">{child%changesetchild}</td>
59 <td class="author">{child%changesetchild}</td>
59 </tr>
60 </tr>
60 <tr>
61 <tr>
61 <th class="files">files</th>
62 <th class="files">files</th>
62 <td class="files">{files}</td>
63 <td class="files">{files}</td>
63 </tr>
64 </tr>
64 </table>
65 </table>
65
66
66 <div class="overflow">
67 <div class="overflow">
67 <div class="sourcefirst"> line diff</div>
68 <div class="sourcefirst"> line diff</div>
68
69
69 {diff}
70 {diff}
70 </div>
71 </div>
71
72
72 </div>
73 </div>
73 </div>
74 </div>
74 {footer}
75 {footer}
@@ -1,44 +1,45 b''
1 {header}
1 {header}
2 <title>{repo|escape}: error</title>
2 <title>{repo|escape}: error</title>
3 </head>
3 </head>
4 <body>
4 <body>
5
5
6 <div class="container">
6 <div class="container">
7 <div class="menu">
7 <div class="menu">
8 <div class="logo">
8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="http://mercurial.selenic.com/">
10 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
10 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
11 </div>
11 </div>
12 <ul>
12 <ul>
13 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
13 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
14 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
14 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
18 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
18 </ul>
19 </ul>
19 </div>
20 </div>
20
21
21 <div class="main">
22 <div class="main">
22
23
23 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
24 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
24 <h3>error</h3>
25 <h3>error</h3>
25
26
26 <form class="search" action="{url}log">
27 <form class="search" action="{url}log">
27 {sessionvars%hiddenformentry}
28 {sessionvars%hiddenformentry}
28 <p><input name="rev" id="search1" type="text" size="30"></p>
29 <p><input name="rev" id="search1" type="text" size="30"></p>
29 <div id="hint">find changesets by author, revision,
30 <div id="hint">find changesets by author, revision,
30 files, or words in the commit message</div>
31 files, or words in the commit message</div>
31 </form>
32 </form>
32
33
33 <div class="description">
34 <div class="description">
34 <p>
35 <p>
35 An error occurred while processing your request:
36 An error occurred while processing your request:
36 </p>
37 </p>
37 <p>
38 <p>
38 {error|escape}
39 {error|escape}
39 </p>
40 </p>
40 </div>
41 </div>
41 </div>
42 </div>
42 </div>
43 </div>
43
44
44 {footer}
45 {footer}
@@ -1,81 +1,82 b''
1 {header}
1 {header}
2 <title>{repo|escape}: {file|escape} annotate</title>
2 <title>{repo|escape}: {file|escape} annotate</title>
3 </head>
3 </head>
4 <body>
4 <body>
5
5
6 <div class="container">
6 <div class="container">
7 <div class="menu">
7 <div class="menu">
8 <div class="logo">
8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="http://mercurial.selenic.com/">
10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
11 </div>
11 </div>
12 <ul>
12 <ul>
13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 </ul>
18 </ul>
18
19
19 <ul>
20 <ul>
20 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
21 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
21 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
22 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
22 </ul>
23 </ul>
23 <ul>
24 <ul>
24 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
25 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
25 <li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
26 <li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
26 <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
27 <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
27 <li class="active">annotate</li>
28 <li class="active">annotate</li>
28 <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
29 <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
29 <li><a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a></li>
30 <li><a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a></li>
30 </ul>
31 </ul>
31 <ul>
32 <ul>
32 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
33 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
33 </ul>
34 </ul>
34 </div>
35 </div>
35
36
36 <div class="main">
37 <div class="main">
37 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
38 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
38 <h3>annotate {file|escape} @ {rev}:{node|short}</h3>
39 <h3>annotate {file|escape} @ {rev}:{node|short}</h3>
39
40
40 <form class="search" action="{url}log">
41 <form class="search" action="{url}log">
41 {sessionvars%hiddenformentry}
42 {sessionvars%hiddenformentry}
42 <p><input name="rev" id="search1" type="text" size="30" /></p>
43 <p><input name="rev" id="search1" type="text" size="30" /></p>
43 <div id="hint">find changesets by author, revision,
44 <div id="hint">find changesets by author, revision,
44 files, or words in the commit message</div>
45 files, or words in the commit message</div>
45 </form>
46 </form>
46
47
47 <div class="description">{desc|strip|escape|addbreaks|nonempty}</div>
48 <div class="description">{desc|strip|escape|addbreaks|nonempty}</div>
48
49
49 <table id="changesetEntry">
50 <table id="changesetEntry">
50 <tr>
51 <tr>
51 <th class="author">author</th>
52 <th class="author">author</th>
52 <td class="author">{author|obfuscate}</td>
53 <td class="author">{author|obfuscate}</td>
53 </tr>
54 </tr>
54 <tr>
55 <tr>
55 <th class="date">date</th>
56 <th class="date">date</th>
56 <td class="date">{date|date} ({date|age})</td>
57 <td class="date">{date|date} ({date|age})</td>
57 </tr>
58 </tr>
58 <tr>
59 <tr>
59 <th class="author">parents</th>
60 <th class="author">parents</th>
60 <td class="author">{parent%filerevparent}</td>
61 <td class="author">{parent%filerevparent}</td>
61 </tr>
62 </tr>
62 <tr>
63 <tr>
63 <th class="author">children</th>
64 <th class="author">children</th>
64 <td class="author">{child%filerevchild}</td>
65 <td class="author">{child%filerevchild}</td>
65 </tr>
66 </tr>
66 {changesettag}
67 {changesettag}
67 </table>
68 </table>
68
69
69 <div class="overflow">
70 <div class="overflow">
70 <table class="bigtable">
71 <table class="bigtable">
71 <tr>
72 <tr>
72 <th class="annotate">rev</th>
73 <th class="annotate">rev</th>
73 <th class="line">&nbsp;&nbsp;line source</th>
74 <th class="line">&nbsp;&nbsp;line source</th>
74 </tr>
75 </tr>
75 {annotate%annotateline}
76 {annotate%annotateline}
76 </table>
77 </table>
77 </div>
78 </div>
78 </div>
79 </div>
79 </div>
80 </div>
80
81
81 {footer}
82 {footer}
@@ -1,76 +1,77 b''
1 {header}
1 {header}
2 <title>{repo|escape}: {file|escape} diff</title>
2 <title>{repo|escape}: {file|escape} diff</title>
3 </head>
3 </head>
4 <body>
4 <body>
5
5
6 <div class="container">
6 <div class="container">
7 <div class="menu">
7 <div class="menu">
8 <div class="logo">
8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="http://mercurial.selenic.com/">
10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
11 </div>
11 </div>
12 <ul>
12 <ul>
13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 </ul>
18 </ul>
18 <ul>
19 <ul>
19 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
20 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
20 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
21 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
24 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
24 <li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
25 <li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
25 <li class="active">diff</li>
26 <li class="active">diff</li>
26 <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
27 <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
27 <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
28 <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
28 <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
29 <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
29 </ul>
30 </ul>
30 <ul>
31 <ul>
31 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
32 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
32 </ul>
33 </ul>
33 </div>
34 </div>
34
35
35 <div class="main">
36 <div class="main">
36 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
37 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
37 <h3>diff {file|escape} @ {rev}:{node|short}</h3>
38 <h3>diff {file|escape} @ {rev}:{node|short}</h3>
38
39
39 <form class="search" action="{url}log">
40 <form class="search" action="{url}log">
40 <p>{sessionvars%hiddenformentry}</p>
41 <p>{sessionvars%hiddenformentry}</p>
41 <p><input name="rev" id="search1" type="text" size="30" /></p>
42 <p><input name="rev" id="search1" type="text" size="30" /></p>
42 <div id="hint">find changesets by author, revision,
43 <div id="hint">find changesets by author, revision,
43 files, or words in the commit message</div>
44 files, or words in the commit message</div>
44 </form>
45 </form>
45
46
46 <div class="description">{desc|strip|escape|addbreaks|nonempty}</div>
47 <div class="description">{desc|strip|escape|addbreaks|nonempty}</div>
47
48
48 <table id="changesetEntry">
49 <table id="changesetEntry">
49 <tr>
50 <tr>
50 <th>author</th>
51 <th>author</th>
51 <td>{author|obfuscate}</td>
52 <td>{author|obfuscate}</td>
52 </tr>
53 </tr>
53 <tr>
54 <tr>
54 <th>date</th>
55 <th>date</th>
55 <td>{date|date} ({date|age})</td>
56 <td>{date|date} ({date|age})</td>
56 </tr>
57 </tr>
57 <tr>
58 <tr>
58 <th>parents</th>
59 <th>parents</th>
59 <td>{parent%filerevparent}</td>
60 <td>{parent%filerevparent}</td>
60 </tr>
61 </tr>
61 <tr>
62 <tr>
62 <th>children</th>
63 <th>children</th>
63 <td>{child%filerevchild}</td>
64 <td>{child%filerevchild}</td>
64 </tr>
65 </tr>
65 {changesettag}
66 {changesettag}
66 </table>
67 </table>
67
68
68 <div class="overflow">
69 <div class="overflow">
69 <div class="sourcefirst"> line diff</div>
70 <div class="sourcefirst"> line diff</div>
70
71
71 {diff}
72 {diff}
72 </div>
73 </div>
73 </div>
74 </div>
74 </div>
75 </div>
75
76
76 {footer}
77 {footer}
@@ -1,72 +1,73 b''
1 {header}
1 {header}
2 <title>{repo|escape}: {file|escape} history</title>
2 <title>{repo|escape}: {file|escape} history</title>
3 <link rel="alternate" type="application/atom+xml"
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
4 href="{url}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
5 <link rel="alternate" type="application/rss+xml"
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
6 href="{url}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
7 </head>
7 </head>
8 <body>
8 <body>
9
9
10 <div class="container">
10 <div class="container">
11 <div class="menu">
11 <div class="menu">
12 <div class="logo">
12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="http://mercurial.selenic.com/">
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 </div>
15 </div>
16 <ul>
16 <ul>
17 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
17 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
18 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
20 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
24 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
24 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
25 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
25 </ul>
26 </ul>
26 <ul>
27 <ul>
27 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
28 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
28 <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
29 <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
29 <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
30 <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
30 <li class="active">file log</li>
31 <li class="active">file log</li>
31 <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
32 <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
32 </ul>
33 </ul>
33 <ul>
34 <ul>
34 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
35 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
35 </ul>
36 </ul>
36 </div>
37 </div>
37
38
38 <div class="main">
39 <div class="main">
39 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
40 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
40 <h3>log {file|escape}</h3>
41 <h3>log {file|escape}</h3>
41
42
42 <form class="search" action="{url}log">
43 <form class="search" action="{url}log">
43 {sessionvars%hiddenformentry}
44 {sessionvars%hiddenformentry}
44 <p><input name="rev" id="search1" type="text" size="30" /></p>
45 <p><input name="rev" id="search1" type="text" size="30" /></p>
45 <div id="hint">find changesets by author, revision,
46 <div id="hint">find changesets by author, revision,
46 files, or words in the commit message</div>
47 files, or words in the commit message</div>
47 </form>
48 </form>
48
49
49 <div class="navigate">
50 <div class="navigate">
50 <a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
51 <a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
51 <a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
52 <a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
52 | {nav%filenav}</div>
53 | {nav%filenav}</div>
53
54
54 <table class="bigtable">
55 <table class="bigtable">
55 <tr>
56 <tr>
56 <th class="age">age</th>
57 <th class="age">age</th>
57 <th class="author">author</th>
58 <th class="author">author</th>
58 <th class="description">description</th>
59 <th class="description">description</th>
59 </tr>
60 </tr>
60 {entries%filelogentry}
61 {entries%filelogentry}
61 </table>
62 </table>
62
63
63 <div class="navigate">
64 <div class="navigate">
64 <a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
65 <a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
65 <a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
66 <a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
66 | {nav%filenav}
67 | {nav%filenav}
67 </div>
68 </div>
68
69
69 </div>
70 </div>
70 </div>
71 </div>
71
72
72 {footer}
73 {footer}
@@ -1,141 +1,142 b''
1 {header}
1 {header}
2 <title>{repo|escape}: revision graph</title>
2 <title>{repo|escape}: revision graph</title>
3 <link rel="alternate" type="application/atom+xml"
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-log" title="Atom feed for {repo|escape}: log" />
4 href="{url}atom-log" title="Atom feed for {repo|escape}: log" />
5 <link rel="alternate" type="application/rss+xml"
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-log" title="RSS feed for {repo|escape}: log" />
6 href="{url}rss-log" title="RSS feed for {repo|escape}: log" />
7 <!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
7 <!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
8 </head>
8 </head>
9 <body>
9 <body>
10
10
11 <div class="container">
11 <div class="container">
12 <div class="menu">
12 <div class="menu">
13 <div class="logo">
13 <div class="logo">
14 <a href="http://mercurial.selenic.com/">
14 <a href="http://mercurial.selenic.com/">
15 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
16 </div>
16 </div>
17 <ul>
17 <ul>
18 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
19 <li class="active">graph</li>
19 <li class="active">graph</li>
20 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
21 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 </ul>
23 </ul>
23 <ul>
24 <ul>
24 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
25 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
25 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
26 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
26 </ul>
27 </ul>
27 <ul>
28 <ul>
28 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
29 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
29 </ul>
30 </ul>
30 </div>
31 </div>
31
32
32 <div class="main">
33 <div class="main">
33 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
34 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
34 <h3>graph</h3>
35 <h3>graph</h3>
35
36
36 <form class="search" action="{url}log">
37 <form class="search" action="{url}log">
37 {sessionvars%hiddenformentry}
38 {sessionvars%hiddenformentry}
38 <p><input name="rev" id="search1" type="text" size="30" /></p>
39 <p><input name="rev" id="search1" type="text" size="30" /></p>
39 <div id="hint">find changesets by author, revision,
40 <div id="hint">find changesets by author, revision,
40 files, or words in the commit message</div>
41 files, or words in the commit message</div>
41 </form>
42 </form>
42
43
43 <div class="navigate">
44 <div class="navigate">
44 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
45 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
45 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
46 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
46 | rev {rev}: {changenav%navgraph}
47 | rev {rev}: {changenav%navgraph}
47 </div>
48 </div>
48
49
49 <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
50 <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
50
51
51 <div id="wrapper">
52 <div id="wrapper">
52 <ul id="nodebgs"></ul>
53 <ul id="nodebgs"></ul>
53 <canvas id="graph" width="224" height="{canvasheight}"></canvas>
54 <canvas id="graph" width="224" height="{canvasheight}"></canvas>
54 <ul id="graphnodes"></ul>
55 <ul id="graphnodes"></ul>
55 </div>
56 </div>
56
57
57 <script type="text/javascript" src="{staticurl}graph.js"></script>
58 <script type="text/javascript" src="{staticurl}graph.js"></script>
58 <script type="text/javascript">
59 <script type="text/javascript">
59 <!-- hide script content
60 <!-- hide script content
60
61
61 var data = {jsdata|json};
62 var data = {jsdata|json};
62 var graph = new Graph();
63 var graph = new Graph();
63 graph.scale({bg_height});
64 graph.scale({bg_height});
64
65
65 graph.edge = function(x0, y0, x1, y1, color) \{
66 graph.edge = function(x0, y0, x1, y1, color) \{
66
67
67 this.setColor(color, 0.0, 0.65);
68 this.setColor(color, 0.0, 0.65);
68 this.ctx.beginPath();
69 this.ctx.beginPath();
69 this.ctx.moveTo(x0, y0);
70 this.ctx.moveTo(x0, y0);
70 this.ctx.lineTo(x1, y1);
71 this.ctx.lineTo(x1, y1);
71 this.ctx.stroke();
72 this.ctx.stroke();
72
73
73 }
74 }
74
75
75 var revlink = '<li style="_STYLE"><span class="desc">';
76 var revlink = '<li style="_STYLE"><span class="desc">';
76 revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
77 revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
77 revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
78 revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
78
79
79 graph.vertex = function(x, y, color, parity, cur) \{
80 graph.vertex = function(x, y, color, parity, cur) \{
80
81
81 this.ctx.beginPath();
82 this.ctx.beginPath();
82 color = this.setColor(color, 0.25, 0.75);
83 color = this.setColor(color, 0.25, 0.75);
83 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
84 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
84 this.ctx.fill();
85 this.ctx.fill();
85
86
86 var bg = '<li class="bg parity' + parity + '"></li>';
87 var bg = '<li class="bg parity' + parity + '"></li>';
87 var left = (this.columns + 1) * this.bg_height;
88 var left = (this.columns + 1) * this.bg_height;
88 var nstyle = 'padding-left: ' + left + 'px;';
89 var nstyle = 'padding-left: ' + left + 'px;';
89 var item = revlink.replace(/_STYLE/, nstyle);
90 var item = revlink.replace(/_STYLE/, nstyle);
90 item = item.replace(/_PARITY/, 'parity' + parity);
91 item = item.replace(/_PARITY/, 'parity' + parity);
91 item = item.replace(/_NODEID/, cur[0]);
92 item = item.replace(/_NODEID/, cur[0]);
92 item = item.replace(/_NODEID/, cur[0]);
93 item = item.replace(/_NODEID/, cur[0]);
93 item = item.replace(/_DESC/, cur[3]);
94 item = item.replace(/_DESC/, cur[3]);
94 item = item.replace(/_USER/, cur[4]);
95 item = item.replace(/_USER/, cur[4]);
95 item = item.replace(/_DATE/, cur[5]);
96 item = item.replace(/_DATE/, cur[5]);
96
97
97 var tagspan = '';
98 var tagspan = '';
98 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) \{
99 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) \{
99 tagspan = '<span class="logtags">';
100 tagspan = '<span class="logtags">';
100 if (cur[6][1]) \{
101 if (cur[6][1]) \{
101 tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
102 tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
102 tagspan += cur[6][0] + '</span> ';
103 tagspan += cur[6][0] + '</span> ';
103 } else if (!cur[6][1] && cur[6][0] != 'default') \{
104 } else if (!cur[6][1] && cur[6][0] != 'default') \{
104 tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
105 tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
105 tagspan += cur[6][0] + '</span> ';
106 tagspan += cur[6][0] + '</span> ';
106 }
107 }
107 if (cur[7].length) \{
108 if (cur[7].length) \{
108 for (var t in cur[7]) \{
109 for (var t in cur[7]) \{
109 var tag = cur[7][t];
110 var tag = cur[7][t];
110 tagspan += '<span class="tag">' + tag + '</span> ';
111 tagspan += '<span class="tag">' + tag + '</span> ';
111 }
112 }
112 }
113 }
113 if (cur[8].length) \{
114 if (cur[8].length) \{
114 for (var b in cur[8]) \{
115 for (var b in cur[8]) \{
115 var bookmark = cur[8][b];
116 var bookmark = cur[8][b];
116 tagspan += '<span class="tag">' + bookmark + '</span> ';
117 tagspan += '<span class="tag">' + bookmark + '</span> ';
117 }
118 }
118 }
119 }
119 tagspan += '</span>';
120 tagspan += '</span>';
120 }
121 }
121
122
122 item = item.replace(/_TAGS/, tagspan);
123 item = item.replace(/_TAGS/, tagspan);
123 return [bg, item];
124 return [bg, item];
124
125
125 }
126 }
126
127
127 graph.render(data);
128 graph.render(data);
128
129
129 // stop hiding script -->
130 // stop hiding script -->
130 </script>
131 </script>
131
132
132 <div class="navigate">
133 <div class="navigate">
133 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
134 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
134 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
135 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
135 | rev {rev}: {changenav%navgraph}
136 | rev {rev}: {changenav%navgraph}
136 </div>
137 </div>
137
138
138 </div>
139 </div>
139 </div>
140 </div>
140
141
141 {footer}
142 {footer}
@@ -1,43 +1,44 b''
1 {header}
1 {header}
2 <title>Help: {topic}</title>
2 <title>Help: {topic}</title>
3 <link rel="alternate" type="application/atom+xml"
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-tags" title="Atom feed for {repo|escape}" />
4 href="{url}atom-tags" title="Atom feed for {repo|escape}" />
5 <link rel="alternate" type="application/rss+xml"
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-tags" title="RSS feed for {repo|escape}" />
6 href="{url}rss-tags" title="RSS feed for {repo|escape}" />
7 </head>
7 </head>
8 <body>
8 <body>
9
9
10 <div class="container">
10 <div class="container">
11 <div class="menu">
11 <div class="menu">
12 <div class="logo">
12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="http://mercurial.selenic.com/">
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 </div>
15 </div>
16 <ul>
16 <ul>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
20 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 <li class="active">help</li>
24 <li class="active">help</li>
24 </ul>
25 </ul>
25 </div>
26 </div>
26
27
27 <div class="main">
28 <div class="main">
28 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <h3>Help: {topic}</h3>
30 <h3>Help: {topic}</h3>
30
31
31 <form class="search" action="{url}log">
32 <form class="search" action="{url}log">
32 {sessionvars%hiddenformentry}
33 {sessionvars%hiddenformentry}
33 <p><input name="rev" id="search1" type="text" size="30" /></p>
34 <p><input name="rev" id="search1" type="text" size="30" /></p>
34 <div id="hint">find changesets by author, revision,
35 <div id="hint">find changesets by author, revision,
35 files, or words in the commit message</div>
36 files, or words in the commit message</div>
36 </form>
37 </form>
37 <pre>
38 <pre>
38 {doc|escape}
39 {doc|escape}
39 </pre>
40 </pre>
40 </div>
41 </div>
41 </div>
42 </div>
42
43
43 {footer}
44 {footer}
@@ -1,48 +1,49 b''
1 {header}
1 {header}
2 <title>Help: {title}</title>
2 <title>Help: {title}</title>
3 <link rel="alternate" type="application/atom+xml"
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-tags" title="Atom feed for {repo|escape}" />
4 href="{url}atom-tags" title="Atom feed for {repo|escape}" />
5 <link rel="alternate" type="application/rss+xml"
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-tags" title="RSS feed for {repo|escape}" />
6 href="{url}rss-tags" title="RSS feed for {repo|escape}" />
7 </head>
7 </head>
8 <body>
8 <body>
9
9
10 <div class="container">
10 <div class="container">
11 <div class="menu">
11 <div class="menu">
12 <div class="logo">
12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="http://mercurial.selenic.com/">
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 </div>
15 </div>
16 <ul>
16 <ul>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
20 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 <li class="active">help</li>
24 <li class="active">help</li>
24 </ul>
25 </ul>
25 </div>
26 </div>
26
27
27 <div class="main">
28 <div class="main">
28 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <form class="search" action="{url}log">
30 <form class="search" action="{url}log">
30 {sessionvars%hiddenformentry}
31 {sessionvars%hiddenformentry}
31 <p><input name="rev" id="search1" type="text" size="30" /></p>
32 <p><input name="rev" id="search1" type="text" size="30" /></p>
32 <div id="hint">find changesets by author, revision,
33 <div id="hint">find changesets by author, revision,
33 files, or words in the commit message</div>
34 files, or words in the commit message</div>
34 </form>
35 </form>
35 <table class="bigtable">
36 <table class="bigtable">
36 <tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
37 <tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
37 {topics % helpentry}
38 {topics % helpentry}
38
39
39 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
40 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
40 {earlycommands % helpentry}
41 {earlycommands % helpentry}
41
42
42 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
43 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
43 {othercommands % helpentry}
44 {othercommands % helpentry}
44 </table>
45 </table>
45 </div>
46 </div>
46 </div>
47 </div>
47
48
48 {footer}
49 {footer}
@@ -1,57 +1,58 b''
1 {header}
1 {header}
2 <title>{repo|escape}: {node|short} {path|escape}</title>
2 <title>{repo|escape}: {node|short} {path|escape}</title>
3 </head>
3 </head>
4 <body>
4 <body>
5
5
6 <div class="container">
6 <div class="container">
7 <div class="menu">
7 <div class="menu">
8 <div class="logo">
8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="http://mercurial.selenic.com/">
10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
11 </div>
11 </div>
12 <ul>
12 <ul>
13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 </ul>
18 </ul>
18 <ul>
19 <ul>
19 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
20 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
20 <li class="active">browse</li>
21 <li class="active">browse</li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 {archives%archiveentry}
24 {archives%archiveentry}
24 </ul>
25 </ul>
25 <ul>
26 <ul>
26 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
27 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
27 </ul>
28 </ul>
28 </div>
29 </div>
29
30
30 <div class="main">
31 <div class="main">
31 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
32 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
32 <h3>directory {path|escape} @ {rev}:{node|short} {tags%changelogtag}</h3>
33 <h3>directory {path|escape} @ {rev}:{node|short} {tags%changelogtag}</h3>
33
34
34 <form class="search" action="{url}log">
35 <form class="search" action="{url}log">
35 {sessionvars%hiddenformentry}
36 {sessionvars%hiddenformentry}
36 <p><input name="rev" id="search1" type="text" size="30" /></p>
37 <p><input name="rev" id="search1" type="text" size="30" /></p>
37 <div id="hint">find changesets by author, revision,
38 <div id="hint">find changesets by author, revision,
38 files, or words in the commit message</div>
39 files, or words in the commit message</div>
39 </form>
40 </form>
40
41
41 <table class="bigtable">
42 <table class="bigtable">
42 <tr>
43 <tr>
43 <th class="name">name</th>
44 <th class="name">name</th>
44 <th class="size">size</th>
45 <th class="size">size</th>
45 <th class="permissions">permissions</th>
46 <th class="permissions">permissions</th>
46 </tr>
47 </tr>
47 <tr class="fileline parity{upparity}">
48 <tr class="fileline parity{upparity}">
48 <td class="name"><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
49 <td class="name"><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
49 <td class="size"></td>
50 <td class="size"></td>
50 <td class="permissions">drwxr-xr-x</td>
51 <td class="permissions">drwxr-xr-x</td>
51 </tr>
52 </tr>
52 {dentries%direntry}
53 {dentries%direntry}
53 {fentries%fileentry}
54 {fentries%fileentry}
54 </table>
55 </table>
55 </div>
56 </div>
56 </div>
57 </div>
57 {footer}
58 {footer}
@@ -1,201 +1,213 b''
1 default = 'shortlog'
1 default = 'shortlog'
2
2
3 mimetype = 'text/html; charset={encoding}'
3 mimetype = 'text/html; charset={encoding}'
4 header = header.tmpl
4 header = header.tmpl
5 footer = footer.tmpl
5 footer = footer.tmpl
6 search = search.tmpl
6 search = search.tmpl
7
7
8 changelog = shortlog.tmpl
8 changelog = shortlog.tmpl
9 shortlog = shortlog.tmpl
9 shortlog = shortlog.tmpl
10 shortlogentry = shortlogentry.tmpl
10 shortlogentry = shortlogentry.tmpl
11 graph = graph.tmpl
11 graph = graph.tmpl
12 help = help.tmpl
12 help = help.tmpl
13 helptopics = helptopics.tmpl
13 helptopics = helptopics.tmpl
14
14
15 helpentry = '<tr><td><a href="{url}help/{topic|escape}{sessionvars%urlparameter}">{topic|escape}</a></td><td>{summary|escape}</td></tr>'
15 helpentry = '<tr><td><a href="{url}help/{topic|escape}{sessionvars%urlparameter}">{topic|escape}</a></td><td>{summary|escape}</td></tr>'
16
16
17 naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
17 naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
18 navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
18 navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
19 navgraphentry = '<a href="{url}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
19 navgraphentry = '<a href="{url}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
20 filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
20 filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
21 filedifflink = '<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
21 filedifflink = '<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
22 filenodelink = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
22 filenodelink = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
23 filenolink = '{file|escape} '
23 filenolink = '{file|escape} '
24 fileellipses = '...'
24 fileellipses = '...'
25 changelogentry = shortlogentry.tmpl
25 changelogentry = shortlogentry.tmpl
26 searchentry = shortlogentry.tmpl
26 searchentry = shortlogentry.tmpl
27 changeset = changeset.tmpl
27 changeset = changeset.tmpl
28 manifest = manifest.tmpl
28 manifest = manifest.tmpl
29
29
30 nav = '{before%naventry} {after%naventry}'
30 nav = '{before%naventry} {after%naventry}'
31 navshort = '{before%navshortentry}{after%navshortentry}'
31 navshort = '{before%navshortentry}{after%navshortentry}'
32 navgraph = '{before%navgraphentry}{after%navgraphentry}'
32 navgraph = '{before%navgraphentry}{after%navgraphentry}'
33 filenav = '{before%filenaventry}{after%filenaventry}'
33 filenav = '{before%filenaventry}{after%filenaventry}'
34
34
35 direntry = '
35 direntry = '
36 <tr class="fileline parity{parity}">
36 <tr class="fileline parity{parity}">
37 <td class="name">
37 <td class="name">
38 <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">
38 <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">
39 <img src="{staticurl}coal-folder.png" alt="dir."/> {basename|escape}/
39 <img src="{staticurl}coal-folder.png" alt="dir."/> {basename|escape}/
40 </a>
40 </a>
41 <a href="{url}file/{node|short}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
41 <a href="{url}file/{node|short}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
42 {emptydirs|escape}
42 {emptydirs|escape}
43 </a>
43 </a>
44 </td>
44 </td>
45 <td class="size"></td>
45 <td class="size"></td>
46 <td class="permissions">drwxr-xr-x</td>
46 <td class="permissions">drwxr-xr-x</td>
47 </tr>'
47 </tr>'
48
48
49 fileentry = '
49 fileentry = '
50 <tr class="fileline parity{parity}">
50 <tr class="fileline parity{parity}">
51 <td class="filename">
51 <td class="filename">
52 <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
52 <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
53 <img src="{staticurl}coal-file.png" alt="file"/> {basename|escape}
53 <img src="{staticurl}coal-file.png" alt="file"/> {basename|escape}
54 </a>
54 </a>
55 </td>
55 </td>
56 <td class="size">{size}</td>
56 <td class="size">{size}</td>
57 <td class="permissions">{permissions|permissions}</td>
57 <td class="permissions">{permissions|permissions}</td>
58 </tr>'
58 </tr>'
59
59
60 filerevision = filerevision.tmpl
60 filerevision = filerevision.tmpl
61 fileannotate = fileannotate.tmpl
61 fileannotate = fileannotate.tmpl
62 filediff = filediff.tmpl
62 filediff = filediff.tmpl
63 filelog = filelog.tmpl
63 filelog = filelog.tmpl
64 fileline = '
64 fileline = '
65 <div class="parity{parity} source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</div>'
65 <div class="parity{parity} source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</div>'
66 filelogentry = filelogentry.tmpl
66 filelogentry = filelogentry.tmpl
67
67
68 annotateline = '
68 annotateline = '
69 <tr class="parity{parity}">
69 <tr class="parity{parity}">
70 <td class="annotate">
70 <td class="annotate">
71 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#{targetline}"
71 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#{targetline}"
72 title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
72 title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
73 </td>
73 </td>
74 <td class="source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</td>
74 <td class="source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</td>
75 </tr>'
75 </tr>'
76
76
77 diffblock = '<div class="source bottomline parity{parity}"><pre>{lines}</pre></div>'
77 diffblock = '<div class="source bottomline parity{parity}"><pre>{lines}</pre></div>'
78 difflineplus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="plusline">{line|escape}</span>'
78 difflineplus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="plusline">{line|escape}</span>'
79 difflineminus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="minusline">{line|escape}</span>'
79 difflineminus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="minusline">{line|escape}</span>'
80 difflineat = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="atline">{line|escape}</span>'
80 difflineat = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="atline">{line|escape}</span>'
81 diffline = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}'
81 diffline = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}'
82
82
83 changelogparent = '
83 changelogparent = '
84 <tr>
84 <tr>
85 <th class="parent">parent {rev}:</th>
85 <th class="parent">parent {rev}:</th>
86 <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
86 <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
87 </tr>'
87 </tr>'
88
88
89 changesetparent = '<a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
89 changesetparent = '<a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
90
90
91 filerevparent = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
91 filerevparent = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
92 filerevchild = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
92 filerevchild = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
93
93
94 filerename = '{file|escape}@'
94 filerename = '{file|escape}@'
95 filelogrename = '
95 filelogrename = '
96 <tr>
96 <tr>
97 <th>base:</th>
97 <th>base:</th>
98 <td>
98 <td>
99 <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
99 <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
100 {file|escape}@{node|short}
100 {file|escape}@{node|short}
101 </a>
101 </a>
102 </td>
102 </td>
103 </tr>'
103 </tr>'
104 fileannotateparent = '
104 fileannotateparent = '
105 <tr>
105 <tr>
106 <td class="metatag">parent:</td>
106 <td class="metatag">parent:</td>
107 <td>
107 <td>
108 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
108 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
109 {rename%filerename}{node|short}
109 {rename%filerename}{node|short}
110 </a>
110 </a>
111 </td>
111 </td>
112 </tr>'
112 </tr>'
113 changesetchild = ' <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
113 changesetchild = ' <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
114 changelogchild = '
114 changelogchild = '
115 <tr>
115 <tr>
116 <th class="child">child</th>
116 <th class="child">child</th>
117 <td class="child">
117 <td class="child">
118 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
118 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
119 {node|short}
119 {node|short}
120 </a>
120 </a>
121 </td>
121 </td>
122 </tr>'
122 </tr>'
123 fileannotatechild = '
123 fileannotatechild = '
124 <tr>
124 <tr>
125 <td class="metatag">child:</td>
125 <td class="metatag">child:</td>
126 <td>
126 <td>
127 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
127 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
128 {node|short}
128 {node|short}
129 </a>
129 </a>
130 </td>
130 </td>
131 </tr>'
131 </tr>'
132 tags = tags.tmpl
132 tags = tags.tmpl
133 tagentry = '
133 tagentry = '
134 <tr class="tagEntry parity{parity}">
134 <tr class="tagEntry parity{parity}">
135 <td>
135 <td>
136 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
136 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
137 {tag|escape}
137 {tag|escape}
138 </a>
138 </a>
139 </td>
139 </td>
140 <td class="node">
140 <td class="node">
141 {node|short}
141 {node|short}
142 </td>
142 </td>
143 </tr>'
143 </tr>'
144 bookmarks = bookmarks.tmpl
145 bookmarkentry = '
146 <tr class="tagEntry parity{parity}">
147 <td>
148 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
149 {bookmark|escape}
150 </a>
151 </td>
152 <td class="node">
153 {node|short}
154 </td>
155 </tr>'
144 branches = branches.tmpl
156 branches = branches.tmpl
145 branchentry = '
157 branchentry = '
146 <tr class="tagEntry parity{parity}">
158 <tr class="tagEntry parity{parity}">
147 <td>
159 <td>
148 <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
160 <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
149 {branch|escape}
161 {branch|escape}
150 </a>
162 </a>
151 </td>
163 </td>
152 <td class="node">
164 <td class="node">
153 {node|short}
165 {node|short}
154 </td>
166 </td>
155 </tr>'
167 </tr>'
156 changelogtag = '<span class="tag">{name|escape}</span> '
168 changelogtag = '<span class="tag">{name|escape}</span> '
157 changesettag = '<span class="tag">{tag|escape}</span> '
169 changesettag = '<span class="tag">{tag|escape}</span> '
158 changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
170 changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
159 changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
171 changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
160 changelogbranchname = '<span class="branchname">{name|escape}</span> '
172 changelogbranchname = '<span class="branchname">{name|escape}</span> '
161
173
162 filediffparent = '
174 filediffparent = '
163 <tr>
175 <tr>
164 <th class="parent">parent {rev}:</th>
176 <th class="parent">parent {rev}:</th>
165 <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
177 <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
166 </tr>'
178 </tr>'
167 filelogparent = '
179 filelogparent = '
168 <tr>
180 <tr>
169 <th>parent {rev}:</th>
181 <th>parent {rev}:</th>
170 <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
182 <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
171 </tr>'
183 </tr>'
172 filediffchild = '
184 filediffchild = '
173 <tr>
185 <tr>
174 <th class="child">child {rev}:</th>
186 <th class="child">child {rev}:</th>
175 <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
187 <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
176 </td>
188 </td>
177 </tr>'
189 </tr>'
178 filelogchild = '
190 filelogchild = '
179 <tr>
191 <tr>
180 <th>child {rev}:</th>
192 <th>child {rev}:</th>
181 <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
193 <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
182 </tr>'
194 </tr>'
183
195
184 indexentry = '
196 indexentry = '
185 <tr class="parity{parity}">
197 <tr class="parity{parity}">
186 <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
198 <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
187 <td>{description}</td>
199 <td>{description}</td>
188 <td>{contact|obfuscate}</td>
200 <td>{contact|obfuscate}</td>
189 <td class="age">{lastchange|age}</td>
201 <td class="age">{lastchange|age}</td>
190 <td class="indexlinks">{archives%indexarchiveentry}</td>
202 <td class="indexlinks">{archives%indexarchiveentry}</td>
191 </tr>\n'
203 </tr>\n'
192 indexarchiveentry = '<a href="{url}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
204 indexarchiveentry = '<a href="{url}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
193 index = index.tmpl
205 index = index.tmpl
194 archiveentry = '
206 archiveentry = '
195 <li>
207 <li>
196 <a href="{url}archive/{node|short}{extension|urlescape}">{type|escape}</a>
208 <a href="{url}archive/{node|short}{extension|urlescape}">{type|escape}</a>
197 </li>'
209 </li>'
198 notfound = notfound.tmpl
210 notfound = notfound.tmpl
199 error = error.tmpl
211 error = error.tmpl
200 urlparameter = '{separator}{name}={value|urlescape}'
212 urlparameter = '{separator}{name}={value|urlescape}'
201 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
213 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
@@ -1,54 +1,55 b''
1 {header}
1 {header}
2 <title>{repo|escape}: searching for {query|escape}</title>
2 <title>{repo|escape}: searching for {query|escape}</title>
3 </head>
3 </head>
4 <body>
4 <body>
5
5
6 <div class="container">
6 <div class="container">
7 <div class="menu">
7 <div class="menu">
8 <div class="logo">
8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="http://mercurial.selenic.com/">
10 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
10 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
11 </div>
11 </div>
12 <ul>
12 <ul>
13 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
13 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
14 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
14 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
18 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
18 </ul>
19 </ul>
19 </div>
20 </div>
20
21
21 <div class="main">
22 <div class="main">
22 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
23 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
23 <h3>searching for '{query|escape}'</h3>
24 <h3>searching for '{query|escape}'</h3>
24
25
25 <form class="search" action="{url}log">
26 <form class="search" action="{url}log">
26 {sessionvars%hiddenformentry}
27 {sessionvars%hiddenformentry}
27 <p><input name="rev" id="search1" type="text" size="30"></p>
28 <p><input name="rev" id="search1" type="text" size="30"></p>
28 <div id="hint">find changesets by author, revision,
29 <div id="hint">find changesets by author, revision,
29 files, or words in the commit message</div>
30 files, or words in the commit message</div>
30 </form>
31 </form>
31
32
32 <div class="navigate">
33 <div class="navigate">
33 <a href="{url}search/{lessvars%urlparameter}">less</a>
34 <a href="{url}search/{lessvars%urlparameter}">less</a>
34 <a href="{url}search/{morevars%urlparameter}">more</a>
35 <a href="{url}search/{morevars%urlparameter}">more</a>
35 </div>
36 </div>
36
37
37 <table class="bigtable">
38 <table class="bigtable">
38 <tr>
39 <tr>
39 <th class="age">age</th>
40 <th class="age">age</th>
40 <th class="author">author</th>
41 <th class="author">author</th>
41 <th class="description">description</th>
42 <th class="description">description</th>
42 </tr>
43 </tr>
43 {entries}
44 {entries}
44 </table>
45 </table>
45
46
46 <div class="navigate">
47 <div class="navigate">
47 <a href="{url}search/{lessvars%urlparameter}">less</a>
48 <a href="{url}search/{lessvars%urlparameter}">less</a>
48 <a href="{url}search/{morevars%urlparameter}">more</a>
49 <a href="{url}search/{morevars%urlparameter}">more</a>
49 </div>
50 </div>
50
51
51 </div>
52 </div>
52 </div>
53 </div>
53
54
54 {footer}
55 {footer}
@@ -1,69 +1,70 b''
1 {header}
1 {header}
2 <title>{repo|escape}: log</title>
2 <title>{repo|escape}: log</title>
3 <link rel="alternate" type="application/atom+xml"
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-log" title="Atom feed for {repo|escape}" />
4 href="{url}atom-log" title="Atom feed for {repo|escape}" />
5 <link rel="alternate" type="application/rss+xml"
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-log" title="RSS feed for {repo|escape}" />
6 href="{url}rss-log" title="RSS feed for {repo|escape}" />
7 </head>
7 </head>
8 <body>
8 <body>
9
9
10 <div class="container">
10 <div class="container">
11 <div class="menu">
11 <div class="menu">
12 <div class="logo">
12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="http://mercurial.selenic.com/">
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 </div>
15 </div>
16 <ul>
16 <ul>
17 <li class="active">log</li>
17 <li class="active">log</li>
18 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
18 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
20 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
24 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
24 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
25 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
25 </ul>
26 </ul>
26 <ul>
27 <ul>
27 {archives%archiveentry}
28 {archives%archiveentry}
28 </ul>
29 </ul>
29 <ul>
30 <ul>
30 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
31 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
31 </ul>
32 </ul>
32 </div>
33 </div>
33
34
34 <div class="main">
35 <div class="main">
35 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
36 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
36 <h3>log</h3>
37 <h3>log</h3>
37
38
38 <form class="search" action="{url}log">
39 <form class="search" action="{url}log">
39 {sessionvars%hiddenformentry}
40 {sessionvars%hiddenformentry}
40 <p><input name="rev" id="search1" type="text" size="30" /></p>
41 <p><input name="rev" id="search1" type="text" size="30" /></p>
41 <div id="hint">find changesets by author, revision,
42 <div id="hint">find changesets by author, revision,
42 files, or words in the commit message</div>
43 files, or words in the commit message</div>
43 </form>
44 </form>
44
45
45 <div class="navigate">
46 <div class="navigate">
46 <a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
47 <a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
47 <a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
48 <a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
48 | rev {rev}: {changenav%navshort}
49 | rev {rev}: {changenav%navshort}
49 </div>
50 </div>
50
51
51 <table class="bigtable">
52 <table class="bigtable">
52 <tr>
53 <tr>
53 <th class="age">age</th>
54 <th class="age">age</th>
54 <th class="author">author</th>
55 <th class="author">author</th>
55 <th class="description">description</th>
56 <th class="description">description</th>
56 </tr>
57 </tr>
57 {entries%shortlogentry}
58 {entries%shortlogentry}
58 </table>
59 </table>
59
60
60 <div class="navigate">
61 <div class="navigate">
61 <a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
62 <a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
62 <a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
63 <a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
63 | rev {rev}: {changenav%navshort}
64 | rev {rev}: {changenav%navshort}
64 </div>
65 </div>
65
66
66 </div>
67 </div>
67 </div>
68 </div>
68
69
69 {footer}
70 {footer}
@@ -1,48 +1,49 b''
1 {header}
1 {header}
2 <title>{repo|escape}: tags</title>
2 <title>{repo|escape}: tags</title>
3 <link rel="alternate" type="application/atom+xml"
3 <link rel="alternate" type="application/atom+xml"
4 href="{url}atom-tags" title="Atom feed for {repo|escape}: tags" />
4 href="{url}atom-tags" title="Atom feed for {repo|escape}: tags" />
5 <link rel="alternate" type="application/rss+xml"
5 <link rel="alternate" type="application/rss+xml"
6 href="{url}rss-tags" title="RSS feed for {repo|escape}: tags" />
6 href="{url}rss-tags" title="RSS feed for {repo|escape}: tags" />
7 </head>
7 </head>
8 <body>
8 <body>
9
9
10 <div class="container">
10 <div class="container">
11 <div class="menu">
11 <div class="menu">
12 <div class="logo">
12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="http://mercurial.selenic.com/">
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 </div>
15 </div>
16 <ul>
16 <ul>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 <li class="active">tags</li>
19 <li class="active">tags</li>
20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
20 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
21 </ul>
22 </ul>
22 <ul>
23 <ul>
23 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
24 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
24 </ul>
25 </ul>
25 </div>
26 </div>
26
27
27 <div class="main">
28 <div class="main">
28 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
29 <h3>tags</h3>
30 <h3>tags</h3>
30
31
31 <form class="search" action="{url}log">
32 <form class="search" action="{url}log">
32 {sessionvars%hiddenformentry}
33 {sessionvars%hiddenformentry}
33 <p><input name="rev" id="search1" type="text" size="30" /></p>
34 <p><input name="rev" id="search1" type="text" size="30" /></p>
34 <div id="hint">find changesets by author, revision,
35 <div id="hint">find changesets by author, revision,
35 files, or words in the commit message</div>
36 files, or words in the commit message</div>
36 </form>
37 </form>
37
38
38 <table class="bigtable">
39 <table class="bigtable">
39 <tr>
40 <tr>
40 <th>tag</th>
41 <th>tag</th>
41 <th>node</th>
42 <th>node</th>
42 </tr>
43 </tr>
43 {entries%tagentry}
44 {entries%tagentry}
44 </table>
45 </table>
45 </div>
46 </div>
46 </div>
47 </div>
47
48
48 {footer}
49 {footer}
@@ -1,1078 +1,1081 b''
1 An attempt at more fully testing the hgweb web interface.
1 An attempt at more fully testing the hgweb web interface.
2 The following things are tested elsewhere and are therefore omitted:
2 The following things are tested elsewhere and are therefore omitted:
3 - archive, tested in test-archive
3 - archive, tested in test-archive
4 - unbundle, tested in test-push-http
4 - unbundle, tested in test-push-http
5 - changegroupsubset, tested in test-pull
5 - changegroupsubset, tested in test-pull
6
6
7 Set up the repo
7 Set up the repo
8
8
9 $ hg init test
9 $ hg init test
10 $ cd test
10 $ cd test
11 $ mkdir da
11 $ mkdir da
12 $ echo foo > da/foo
12 $ echo foo > da/foo
13 $ echo foo > foo
13 $ echo foo > foo
14 $ hg ci -Ambase
14 $ hg ci -Ambase
15 adding da/foo
15 adding da/foo
16 adding foo
16 adding foo
17 $ hg tag 1.0
17 $ hg tag 1.0
18 $ hg bookmark something
18 $ hg bookmark something
19 $ echo another > foo
19 $ echo another > foo
20 $ hg branch stable
20 $ hg branch stable
21 marked working directory as branch stable
21 marked working directory as branch stable
22 $ hg ci -Ambranch
22 $ hg ci -Ambranch
23 $ hg serve --config server.uncompressed=False -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
23 $ hg serve --config server.uncompressed=False -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
24 $ cat hg.pid >> $DAEMON_PIDS
24 $ cat hg.pid >> $DAEMON_PIDS
25
25
26 Logs and changes
26 Logs and changes
27
27
28 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/?style=atom'
28 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/?style=atom'
29 200 Script output follows
29 200 Script output follows
30
30
31 <?xml version="1.0" encoding="ascii"?>
31 <?xml version="1.0" encoding="ascii"?>
32 <feed xmlns="http://www.w3.org/2005/Atom">
32 <feed xmlns="http://www.w3.org/2005/Atom">
33 <!-- Changelog -->
33 <!-- Changelog -->
34 <id>http://*:$HGPORT/</id> (glob)
34 <id>http://*:$HGPORT/</id> (glob)
35 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
35 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
36 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
36 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
37 <title>test Changelog</title>
37 <title>test Changelog</title>
38 <updated>1970-01-01T00:00:00+00:00</updated>
38 <updated>1970-01-01T00:00:00+00:00</updated>
39
39
40 <entry>
40 <entry>
41 <title>branch</title>
41 <title>branch</title>
42 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
42 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
43 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
43 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
44 <author>
44 <author>
45 <name>test</name>
45 <name>test</name>
46 <email>&#116;&#101;&#115;&#116;</email>
46 <email>&#116;&#101;&#115;&#116;</email>
47 </author>
47 </author>
48 <updated>1970-01-01T00:00:00+00:00</updated>
48 <updated>1970-01-01T00:00:00+00:00</updated>
49 <published>1970-01-01T00:00:00+00:00</published>
49 <published>1970-01-01T00:00:00+00:00</published>
50 <content type="xhtml">
50 <content type="xhtml">
51 <div xmlns="http://www.w3.org/1999/xhtml">
51 <div xmlns="http://www.w3.org/1999/xhtml">
52 <pre xml:space="preserve">branch</pre>
52 <pre xml:space="preserve">branch</pre>
53 </div>
53 </div>
54 </content>
54 </content>
55 </entry>
55 </entry>
56 <entry>
56 <entry>
57 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
57 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
58 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
58 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
59 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
59 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
60 <author>
60 <author>
61 <name>test</name>
61 <name>test</name>
62 <email>&#116;&#101;&#115;&#116;</email>
62 <email>&#116;&#101;&#115;&#116;</email>
63 </author>
63 </author>
64 <updated>1970-01-01T00:00:00+00:00</updated>
64 <updated>1970-01-01T00:00:00+00:00</updated>
65 <published>1970-01-01T00:00:00+00:00</published>
65 <published>1970-01-01T00:00:00+00:00</published>
66 <content type="xhtml">
66 <content type="xhtml">
67 <div xmlns="http://www.w3.org/1999/xhtml">
67 <div xmlns="http://www.w3.org/1999/xhtml">
68 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
68 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
69 </div>
69 </div>
70 </content>
70 </content>
71 </entry>
71 </entry>
72 <entry>
72 <entry>
73 <title>base</title>
73 <title>base</title>
74 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
74 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
75 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
75 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
76 <author>
76 <author>
77 <name>test</name>
77 <name>test</name>
78 <email>&#116;&#101;&#115;&#116;</email>
78 <email>&#116;&#101;&#115;&#116;</email>
79 </author>
79 </author>
80 <updated>1970-01-01T00:00:00+00:00</updated>
80 <updated>1970-01-01T00:00:00+00:00</updated>
81 <published>1970-01-01T00:00:00+00:00</published>
81 <published>1970-01-01T00:00:00+00:00</published>
82 <content type="xhtml">
82 <content type="xhtml">
83 <div xmlns="http://www.w3.org/1999/xhtml">
83 <div xmlns="http://www.w3.org/1999/xhtml">
84 <pre xml:space="preserve">base</pre>
84 <pre xml:space="preserve">base</pre>
85 </div>
85 </div>
86 </content>
86 </content>
87 </entry>
87 </entry>
88
88
89 </feed>
89 </feed>
90 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/?style=atom'
90 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/?style=atom'
91 200 Script output follows
91 200 Script output follows
92
92
93 <?xml version="1.0" encoding="ascii"?>
93 <?xml version="1.0" encoding="ascii"?>
94 <feed xmlns="http://www.w3.org/2005/Atom">
94 <feed xmlns="http://www.w3.org/2005/Atom">
95 <!-- Changelog -->
95 <!-- Changelog -->
96 <id>http://*:$HGPORT/</id> (glob)
96 <id>http://*:$HGPORT/</id> (glob)
97 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
97 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
98 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
98 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
99 <title>test Changelog</title>
99 <title>test Changelog</title>
100 <updated>1970-01-01T00:00:00+00:00</updated>
100 <updated>1970-01-01T00:00:00+00:00</updated>
101
101
102 <entry>
102 <entry>
103 <title>branch</title>
103 <title>branch</title>
104 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
104 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
105 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
105 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
106 <author>
106 <author>
107 <name>test</name>
107 <name>test</name>
108 <email>&#116;&#101;&#115;&#116;</email>
108 <email>&#116;&#101;&#115;&#116;</email>
109 </author>
109 </author>
110 <updated>1970-01-01T00:00:00+00:00</updated>
110 <updated>1970-01-01T00:00:00+00:00</updated>
111 <published>1970-01-01T00:00:00+00:00</published>
111 <published>1970-01-01T00:00:00+00:00</published>
112 <content type="xhtml">
112 <content type="xhtml">
113 <div xmlns="http://www.w3.org/1999/xhtml">
113 <div xmlns="http://www.w3.org/1999/xhtml">
114 <pre xml:space="preserve">branch</pre>
114 <pre xml:space="preserve">branch</pre>
115 </div>
115 </div>
116 </content>
116 </content>
117 </entry>
117 </entry>
118 <entry>
118 <entry>
119 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
119 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
120 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
120 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
121 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
121 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
122 <author>
122 <author>
123 <name>test</name>
123 <name>test</name>
124 <email>&#116;&#101;&#115;&#116;</email>
124 <email>&#116;&#101;&#115;&#116;</email>
125 </author>
125 </author>
126 <updated>1970-01-01T00:00:00+00:00</updated>
126 <updated>1970-01-01T00:00:00+00:00</updated>
127 <published>1970-01-01T00:00:00+00:00</published>
127 <published>1970-01-01T00:00:00+00:00</published>
128 <content type="xhtml">
128 <content type="xhtml">
129 <div xmlns="http://www.w3.org/1999/xhtml">
129 <div xmlns="http://www.w3.org/1999/xhtml">
130 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
130 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
131 </div>
131 </div>
132 </content>
132 </content>
133 </entry>
133 </entry>
134 <entry>
134 <entry>
135 <title>base</title>
135 <title>base</title>
136 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
136 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
137 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
137 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
138 <author>
138 <author>
139 <name>test</name>
139 <name>test</name>
140 <email>&#116;&#101;&#115;&#116;</email>
140 <email>&#116;&#101;&#115;&#116;</email>
141 </author>
141 </author>
142 <updated>1970-01-01T00:00:00+00:00</updated>
142 <updated>1970-01-01T00:00:00+00:00</updated>
143 <published>1970-01-01T00:00:00+00:00</published>
143 <published>1970-01-01T00:00:00+00:00</published>
144 <content type="xhtml">
144 <content type="xhtml">
145 <div xmlns="http://www.w3.org/1999/xhtml">
145 <div xmlns="http://www.w3.org/1999/xhtml">
146 <pre xml:space="preserve">base</pre>
146 <pre xml:space="preserve">base</pre>
147 </div>
147 </div>
148 </content>
148 </content>
149 </entry>
149 </entry>
150
150
151 </feed>
151 </feed>
152 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/foo/?style=atom'
152 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/foo/?style=atom'
153 200 Script output follows
153 200 Script output follows
154
154
155 <?xml version="1.0" encoding="ascii"?>
155 <?xml version="1.0" encoding="ascii"?>
156 <feed xmlns="http://www.w3.org/2005/Atom">
156 <feed xmlns="http://www.w3.org/2005/Atom">
157 <id>http://*:$HGPORT/atom-log/tip/foo</id> (glob)
157 <id>http://*:$HGPORT/atom-log/tip/foo</id> (glob)
158 <link rel="self" href="http://*:$HGPORT/atom-log/tip/foo"/> (glob)
158 <link rel="self" href="http://*:$HGPORT/atom-log/tip/foo"/> (glob)
159 <title>test: foo history</title>
159 <title>test: foo history</title>
160 <updated>1970-01-01T00:00:00+00:00</updated>
160 <updated>1970-01-01T00:00:00+00:00</updated>
161
161
162 <entry>
162 <entry>
163 <title>base</title>
163 <title>base</title>
164 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
164 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
165 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
165 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
166 <author>
166 <author>
167 <name>test</name>
167 <name>test</name>
168 <email>&#116;&#101;&#115;&#116;</email>
168 <email>&#116;&#101;&#115;&#116;</email>
169 </author>
169 </author>
170 <updated>1970-01-01T00:00:00+00:00</updated>
170 <updated>1970-01-01T00:00:00+00:00</updated>
171 <published>1970-01-01T00:00:00+00:00</published>
171 <published>1970-01-01T00:00:00+00:00</published>
172 <content type="xhtml">
172 <content type="xhtml">
173 <div xmlns="http://www.w3.org/1999/xhtml">
173 <div xmlns="http://www.w3.org/1999/xhtml">
174 <pre xml:space="preserve">base</pre>
174 <pre xml:space="preserve">base</pre>
175 </div>
175 </div>
176 </content>
176 </content>
177 </entry>
177 </entry>
178
178
179 </feed>
179 </feed>
180 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/shortlog/'
180 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/shortlog/'
181 200 Script output follows
181 200 Script output follows
182
182
183 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
183 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
184 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
184 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
185 <head>
185 <head>
186 <link rel="icon" href="/static/hgicon.png" type="image/png" />
186 <link rel="icon" href="/static/hgicon.png" type="image/png" />
187 <meta name="robots" content="index, nofollow" />
187 <meta name="robots" content="index, nofollow" />
188 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
188 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
189
189
190 <title>test: log</title>
190 <title>test: log</title>
191 <link rel="alternate" type="application/atom+xml"
191 <link rel="alternate" type="application/atom+xml"
192 href="/atom-log" title="Atom feed for test" />
192 href="/atom-log" title="Atom feed for test" />
193 <link rel="alternate" type="application/rss+xml"
193 <link rel="alternate" type="application/rss+xml"
194 href="/rss-log" title="RSS feed for test" />
194 href="/rss-log" title="RSS feed for test" />
195 </head>
195 </head>
196 <body>
196 <body>
197
197
198 <div class="container">
198 <div class="container">
199 <div class="menu">
199 <div class="menu">
200 <div class="logo">
200 <div class="logo">
201 <a href="http://mercurial.selenic.com/">
201 <a href="http://mercurial.selenic.com/">
202 <img src="/static/hglogo.png" alt="mercurial" /></a>
202 <img src="/static/hglogo.png" alt="mercurial" /></a>
203 </div>
203 </div>
204 <ul>
204 <ul>
205 <li class="active">log</li>
205 <li class="active">log</li>
206 <li><a href="/graph/1d22e65f027e">graph</a></li>
206 <li><a href="/graph/1d22e65f027e">graph</a></li>
207 <li><a href="/tags">tags</a></li>
207 <li><a href="/tags">tags</a></li>
208 <li><a href="/bookmarks">bookmarks</a></li>
208 <li><a href="/branches">branches</a></li>
209 <li><a href="/branches">branches</a></li>
209 </ul>
210 </ul>
210 <ul>
211 <ul>
211 <li><a href="/rev/1d22e65f027e">changeset</a></li>
212 <li><a href="/rev/1d22e65f027e">changeset</a></li>
212 <li><a href="/file/1d22e65f027e">browse</a></li>
213 <li><a href="/file/1d22e65f027e">browse</a></li>
213 </ul>
214 </ul>
214 <ul>
215 <ul>
215
216
216 </ul>
217 </ul>
217 <ul>
218 <ul>
218 <li><a href="/help">help</a></li>
219 <li><a href="/help">help</a></li>
219 </ul>
220 </ul>
220 </div>
221 </div>
221
222
222 <div class="main">
223 <div class="main">
223 <h2><a href="/">test</a></h2>
224 <h2><a href="/">test</a></h2>
224 <h3>log</h3>
225 <h3>log</h3>
225
226
226 <form class="search" action="/log">
227 <form class="search" action="/log">
227
228
228 <p><input name="rev" id="search1" type="text" size="30" /></p>
229 <p><input name="rev" id="search1" type="text" size="30" /></p>
229 <div id="hint">find changesets by author, revision,
230 <div id="hint">find changesets by author, revision,
230 files, or words in the commit message</div>
231 files, or words in the commit message</div>
231 </form>
232 </form>
232
233
233 <div class="navigate">
234 <div class="navigate">
234 <a href="/shortlog/2?revcount=30">less</a>
235 <a href="/shortlog/2?revcount=30">less</a>
235 <a href="/shortlog/2?revcount=120">more</a>
236 <a href="/shortlog/2?revcount=120">more</a>
236 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
237 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
237 </div>
238 </div>
238
239
239 <table class="bigtable">
240 <table class="bigtable">
240 <tr>
241 <tr>
241 <th class="age">age</th>
242 <th class="age">age</th>
242 <th class="author">author</th>
243 <th class="author">author</th>
243 <th class="description">description</th>
244 <th class="description">description</th>
244 </tr>
245 </tr>
245 <tr class="parity0">
246 <tr class="parity0">
246 <td class="age">1970-01-01</td>
247 <td class="age">1970-01-01</td>
247 <td class="author">test</td>
248 <td class="author">test</td>
248 <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> <span class="tag">something</span> </td>
249 <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> <span class="tag">something</span> </td>
249 </tr>
250 </tr>
250 <tr class="parity1">
251 <tr class="parity1">
251 <td class="age">1970-01-01</td>
252 <td class="age">1970-01-01</td>
252 <td class="author">test</td>
253 <td class="author">test</td>
253 <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
254 <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
254 </tr>
255 </tr>
255 <tr class="parity0">
256 <tr class="parity0">
256 <td class="age">1970-01-01</td>
257 <td class="age">1970-01-01</td>
257 <td class="author">test</td>
258 <td class="author">test</td>
258 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
259 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
259 </tr>
260 </tr>
260
261
261 </table>
262 </table>
262
263
263 <div class="navigate">
264 <div class="navigate">
264 <a href="/shortlog/2?revcount=30">less</a>
265 <a href="/shortlog/2?revcount=30">less</a>
265 <a href="/shortlog/2?revcount=120">more</a>
266 <a href="/shortlog/2?revcount=120">more</a>
266 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
267 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
267 </div>
268 </div>
268
269
269 </div>
270 </div>
270 </div>
271 </div>
271
272
272
273
273
274
274 </body>
275 </body>
275 </html>
276 </html>
276
277
277 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/0/'
278 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/0/'
278 200 Script output follows
279 200 Script output follows
279
280
280 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
281 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
281 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
282 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
282 <head>
283 <head>
283 <link rel="icon" href="/static/hgicon.png" type="image/png" />
284 <link rel="icon" href="/static/hgicon.png" type="image/png" />
284 <meta name="robots" content="index, nofollow" />
285 <meta name="robots" content="index, nofollow" />
285 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
286 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
286
287
287 <title>test: 2ef0ac749a14</title>
288 <title>test: 2ef0ac749a14</title>
288 </head>
289 </head>
289 <body>
290 <body>
290 <div class="container">
291 <div class="container">
291 <div class="menu">
292 <div class="menu">
292 <div class="logo">
293 <div class="logo">
293 <a href="http://mercurial.selenic.com/">
294 <a href="http://mercurial.selenic.com/">
294 <img src="/static/hglogo.png" alt="mercurial" /></a>
295 <img src="/static/hglogo.png" alt="mercurial" /></a>
295 </div>
296 </div>
296 <ul>
297 <ul>
297 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
298 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
298 <li><a href="/graph/2ef0ac749a14">graph</a></li>
299 <li><a href="/graph/2ef0ac749a14">graph</a></li>
299 <li><a href="/tags">tags</a></li>
300 <li><a href="/tags">tags</a></li>
301 <li><a href="/bookmarks">bookmarks</a></li>
300 <li><a href="/branches">branches</a></li>
302 <li><a href="/branches">branches</a></li>
301 </ul>
303 </ul>
302 <ul>
304 <ul>
303 <li class="active">changeset</li>
305 <li class="active">changeset</li>
304 <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
306 <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
305 <li><a href="/file/2ef0ac749a14">browse</a></li>
307 <li><a href="/file/2ef0ac749a14">browse</a></li>
306 </ul>
308 </ul>
307 <ul>
309 <ul>
308
310
309 </ul>
311 </ul>
310 <ul>
312 <ul>
311 <li><a href="/help">help</a></li>
313 <li><a href="/help">help</a></li>
312 </ul>
314 </ul>
313 </div>
315 </div>
314
316
315 <div class="main">
317 <div class="main">
316
318
317 <h2><a href="/">test</a></h2>
319 <h2><a href="/">test</a></h2>
318 <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> </h3>
320 <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> </h3>
319
321
320 <form class="search" action="/log">
322 <form class="search" action="/log">
321
323
322 <p><input name="rev" id="search1" type="text" size="30" /></p>
324 <p><input name="rev" id="search1" type="text" size="30" /></p>
323 <div id="hint">find changesets by author, revision,
325 <div id="hint">find changesets by author, revision,
324 files, or words in the commit message</div>
326 files, or words in the commit message</div>
325 </form>
327 </form>
326
328
327 <div class="description">base</div>
329 <div class="description">base</div>
328
330
329 <table id="changesetEntry">
331 <table id="changesetEntry">
330 <tr>
332 <tr>
331 <th class="author">author</th>
333 <th class="author">author</th>
332 <td class="author">&#116;&#101;&#115;&#116;</td>
334 <td class="author">&#116;&#101;&#115;&#116;</td>
333 </tr>
335 </tr>
334 <tr>
336 <tr>
335 <th class="date">date</th>
337 <th class="date">date</th>
336 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
338 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
337 <tr>
339 <tr>
338 <th class="author">parents</th>
340 <th class="author">parents</th>
339 <td class="author"></td>
341 <td class="author"></td>
340 </tr>
342 </tr>
341 <tr>
343 <tr>
342 <th class="author">children</th>
344 <th class="author">children</th>
343 <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
345 <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
344 </tr>
346 </tr>
345 <tr>
347 <tr>
346 <th class="files">files</th>
348 <th class="files">files</th>
347 <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
349 <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
348 </tr>
350 </tr>
349 </table>
351 </table>
350
352
351 <div class="overflow">
353 <div class="overflow">
352 <div class="sourcefirst"> line diff</div>
354 <div class="sourcefirst"> line diff</div>
353
355
354 <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
356 <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
355 </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
357 </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
356 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
358 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
357 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
359 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
358 </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
360 </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
359 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
361 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
360 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
362 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
361 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
363 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
362 </span></pre></div>
364 </span></pre></div>
363 </div>
365 </div>
364
366
365 </div>
367 </div>
366 </div>
368 </div>
367
369
368
370
369 </body>
371 </body>
370 </html>
372 </html>
371
373
372 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/1/?style=raw'
374 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/1/?style=raw'
373 200 Script output follows
375 200 Script output follows
374
376
375
377
376 # HG changeset patch
378 # HG changeset patch
377 # User test
379 # User test
378 # Date 0 0
380 # Date 0 0
379 # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
381 # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
380 # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
382 # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
381 Added tag 1.0 for changeset 2ef0ac749a14
383 Added tag 1.0 for changeset 2ef0ac749a14
382
384
383 diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
385 diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
384 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
386 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
385 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
387 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
386 @@ -0,0 +1,1 @@
388 @@ -0,0 +1,1 @@
387 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
389 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
388
390
389 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log?rev=base'
391 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log?rev=base'
390 200 Script output follows
392 200 Script output follows
391
393
392 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
394 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
393 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
395 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
394 <head>
396 <head>
395 <link rel="icon" href="/static/hgicon.png" type="image/png" />
397 <link rel="icon" href="/static/hgicon.png" type="image/png" />
396 <meta name="robots" content="index, nofollow" />
398 <meta name="robots" content="index, nofollow" />
397 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
399 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
398
400
399 <title>test: searching for base</title>
401 <title>test: searching for base</title>
400 </head>
402 </head>
401 <body>
403 <body>
402
404
403 <div class="container">
405 <div class="container">
404 <div class="menu">
406 <div class="menu">
405 <div class="logo">
407 <div class="logo">
406 <a href="http://mercurial.selenic.com/">
408 <a href="http://mercurial.selenic.com/">
407 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
409 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
408 </div>
410 </div>
409 <ul>
411 <ul>
410 <li><a href="/shortlog">log</a></li>
412 <li><a href="/shortlog">log</a></li>
411 <li><a href="/graph">graph</a></li>
413 <li><a href="/graph">graph</a></li>
412 <li><a href="/tags">tags</a></li>
414 <li><a href="/tags">tags</a></li>
415 <li><a href="/bookmarks">bookmarks</a></li>
413 <li><a href="/branches">branches</a></li>
416 <li><a href="/branches">branches</a></li>
414 <li><a href="/help">help</a></li>
417 <li><a href="/help">help</a></li>
415 </ul>
418 </ul>
416 </div>
419 </div>
417
420
418 <div class="main">
421 <div class="main">
419 <h2><a href="/">test</a></h2>
422 <h2><a href="/">test</a></h2>
420 <h3>searching for 'base'</h3>
423 <h3>searching for 'base'</h3>
421
424
422 <form class="search" action="/log">
425 <form class="search" action="/log">
423
426
424 <p><input name="rev" id="search1" type="text" size="30"></p>
427 <p><input name="rev" id="search1" type="text" size="30"></p>
425 <div id="hint">find changesets by author, revision,
428 <div id="hint">find changesets by author, revision,
426 files, or words in the commit message</div>
429 files, or words in the commit message</div>
427 </form>
430 </form>
428
431
429 <div class="navigate">
432 <div class="navigate">
430 <a href="/search/?rev=base&revcount=5">less</a>
433 <a href="/search/?rev=base&revcount=5">less</a>
431 <a href="/search/?rev=base&revcount=20">more</a>
434 <a href="/search/?rev=base&revcount=20">more</a>
432 </div>
435 </div>
433
436
434 <table class="bigtable">
437 <table class="bigtable">
435 <tr>
438 <tr>
436 <th class="age">age</th>
439 <th class="age">age</th>
437 <th class="author">author</th>
440 <th class="author">author</th>
438 <th class="description">description</th>
441 <th class="description">description</th>
439 </tr>
442 </tr>
440 <tr class="parity0">
443 <tr class="parity0">
441 <td class="age">1970-01-01</td>
444 <td class="age">1970-01-01</td>
442 <td class="author">test</td>
445 <td class="author">test</td>
443 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
446 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
444 </tr>
447 </tr>
445
448
446 </table>
449 </table>
447
450
448 <div class="navigate">
451 <div class="navigate">
449 <a href="/search/?rev=base&revcount=5">less</a>
452 <a href="/search/?rev=base&revcount=5">less</a>
450 <a href="/search/?rev=base&revcount=20">more</a>
453 <a href="/search/?rev=base&revcount=20">more</a>
451 </div>
454 </div>
452
455
453 </div>
456 </div>
454 </div>
457 </div>
455
458
456
459
457
460
458 </body>
461 </body>
459 </html>
462 </html>
460
463
461
464
462 File-related
465 File-related
463
466
464 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo/?style=raw'
467 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo/?style=raw'
465 200 Script output follows
468 200 Script output follows
466
469
467 foo
470 foo
468 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/annotate/1/foo/?style=raw'
471 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/annotate/1/foo/?style=raw'
469 200 Script output follows
472 200 Script output follows
470
473
471
474
472 test@0: foo
475 test@0: foo
473
476
474
477
475
478
476
479
477 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/?style=raw'
480 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/?style=raw'
478 200 Script output follows
481 200 Script output follows
479
482
480
483
481 drwxr-xr-x da
484 drwxr-xr-x da
482 -rw-r--r-- 45 .hgtags
485 -rw-r--r-- 45 .hgtags
483 -rw-r--r-- 4 foo
486 -rw-r--r-- 4 foo
484
487
485
488
486 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo'
489 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo'
487 200 Script output follows
490 200 Script output follows
488
491
489 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
492 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
490 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
493 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
491 <head>
494 <head>
492 <link rel="icon" href="/static/hgicon.png" type="image/png" />
495 <link rel="icon" href="/static/hgicon.png" type="image/png" />
493 <meta name="robots" content="index, nofollow" />
496 <meta name="robots" content="index, nofollow" />
494 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
497 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
495
498
496 <title>test: a4f92ed23982 foo</title>
499 <title>test: a4f92ed23982 foo</title>
497 </head>
500 </head>
498 <body>
501 <body>
499
502
500 <div class="container">
503 <div class="container">
501 <div class="menu">
504 <div class="menu">
502 <div class="logo">
505 <div class="logo">
503 <a href="http://mercurial.selenic.com/">
506 <a href="http://mercurial.selenic.com/">
504 <img src="/static/hglogo.png" alt="mercurial" /></a>
507 <img src="/static/hglogo.png" alt="mercurial" /></a>
505 </div>
508 </div>
506 <ul>
509 <ul>
507 <li><a href="/shortlog/a4f92ed23982">log</a></li>
510 <li><a href="/shortlog/a4f92ed23982">log</a></li>
508 <li><a href="/graph/a4f92ed23982">graph</a></li>
511 <li><a href="/graph/a4f92ed23982">graph</a></li>
509 <li><a href="/tags">tags</a></li>
512 <li><a href="/tags">tags</a></li>
510 <li><a href="/branches">branches</a></li>
513 <li><a href="/branches">branches</a></li>
511 </ul>
514 </ul>
512 <ul>
515 <ul>
513 <li><a href="/rev/a4f92ed23982">changeset</a></li>
516 <li><a href="/rev/a4f92ed23982">changeset</a></li>
514 <li><a href="/file/a4f92ed23982/">browse</a></li>
517 <li><a href="/file/a4f92ed23982/">browse</a></li>
515 </ul>
518 </ul>
516 <ul>
519 <ul>
517 <li class="active">file</li>
520 <li class="active">file</li>
518 <li><a href="/file/tip/foo">latest</a></li>
521 <li><a href="/file/tip/foo">latest</a></li>
519 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
522 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
520 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
523 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
521 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
524 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
522 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
525 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
523 </ul>
526 </ul>
524 <ul>
527 <ul>
525 <li><a href="/help">help</a></li>
528 <li><a href="/help">help</a></li>
526 </ul>
529 </ul>
527 </div>
530 </div>
528
531
529 <div class="main">
532 <div class="main">
530 <h2><a href="/">test</a></h2>
533 <h2><a href="/">test</a></h2>
531 <h3>view foo @ 1:a4f92ed23982</h3>
534 <h3>view foo @ 1:a4f92ed23982</h3>
532
535
533 <form class="search" action="/log">
536 <form class="search" action="/log">
534
537
535 <p><input name="rev" id="search1" type="text" size="30" /></p>
538 <p><input name="rev" id="search1" type="text" size="30" /></p>
536 <div id="hint">find changesets by author, revision,
539 <div id="hint">find changesets by author, revision,
537 files, or words in the commit message</div>
540 files, or words in the commit message</div>
538 </form>
541 </form>
539
542
540 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
543 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
541
544
542 <table id="changesetEntry">
545 <table id="changesetEntry">
543 <tr>
546 <tr>
544 <th class="author">author</th>
547 <th class="author">author</th>
545 <td class="author">&#116;&#101;&#115;&#116;</td>
548 <td class="author">&#116;&#101;&#115;&#116;</td>
546 </tr>
549 </tr>
547 <tr>
550 <tr>
548 <th class="date">date</th>
551 <th class="date">date</th>
549 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
552 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
550 </tr>
553 </tr>
551 <tr>
554 <tr>
552 <th class="author">parents</th>
555 <th class="author">parents</th>
553 <td class="author"></td>
556 <td class="author"></td>
554 </tr>
557 </tr>
555 <tr>
558 <tr>
556 <th class="author">children</th>
559 <th class="author">children</th>
557 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
560 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
558 </tr>
561 </tr>
559
562
560 </table>
563 </table>
561
564
562 <div class="overflow">
565 <div class="overflow">
563 <div class="sourcefirst"> line source</div>
566 <div class="sourcefirst"> line source</div>
564
567
565 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
568 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
566 </div>
569 </div>
567 <div class="sourcelast"></div>
570 <div class="sourcelast"></div>
568 </div>
571 </div>
569 </div>
572 </div>
570 </div>
573 </div>
571
574
572
575
573
576
574 </body>
577 </body>
575 </html>
578 </html>
576
579
577 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/filediff/1/foo/?style=raw'
580 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/filediff/1/foo/?style=raw'
578 200 Script output follows
581 200 Script output follows
579
582
580
583
581 diff -r 000000000000 -r a4f92ed23982 foo
584 diff -r 000000000000 -r a4f92ed23982 foo
582 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
585 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
583 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
586 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
584 @@ -0,0 +1,1 @@
587 @@ -0,0 +1,1 @@
585 +foo
588 +foo
586
589
587
590
588
591
589
592
590
593
591 Overviews
594 Overviews
592
595
593 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-tags'
596 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-tags'
594 200 Script output follows
597 200 Script output follows
595
598
596 tip 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
599 tip 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
597 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
600 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
598 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-branches'
601 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-branches'
599 200 Script output follows
602 200 Script output follows
600
603
601 stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe open
604 stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe open
602 default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
605 default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
603 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/summary/?style=gitweb'
606 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/summary/?style=gitweb'
604 200 Script output follows
607 200 Script output follows
605
608
606 <?xml version="1.0" encoding="ascii"?>
609 <?xml version="1.0" encoding="ascii"?>
607 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
610 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
608 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
611 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
609 <head>
612 <head>
610 <link rel="icon" href="/static/hgicon.png" type="image/png" />
613 <link rel="icon" href="/static/hgicon.png" type="image/png" />
611 <meta name="robots" content="index, nofollow"/>
614 <meta name="robots" content="index, nofollow"/>
612 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
615 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
613
616
614
617
615 <title>test: Summary</title>
618 <title>test: Summary</title>
616 <link rel="alternate" type="application/atom+xml"
619 <link rel="alternate" type="application/atom+xml"
617 href="/atom-log" title="Atom feed for test"/>
620 href="/atom-log" title="Atom feed for test"/>
618 <link rel="alternate" type="application/rss+xml"
621 <link rel="alternate" type="application/rss+xml"
619 href="/rss-log" title="RSS feed for test"/>
622 href="/rss-log" title="RSS feed for test"/>
620 </head>
623 </head>
621 <body>
624 <body>
622
625
623 <div class="page_header">
626 <div class="page_header">
624 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
627 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
625
628
626 <form action="/log">
629 <form action="/log">
627 <input type="hidden" name="style" value="gitweb" />
630 <input type="hidden" name="style" value="gitweb" />
628 <div class="search">
631 <div class="search">
629 <input type="text" name="rev" />
632 <input type="text" name="rev" />
630 </div>
633 </div>
631 </form>
634 </form>
632 </div>
635 </div>
633
636
634 <div class="page_nav">
637 <div class="page_nav">
635 summary |
638 summary |
636 <a href="/shortlog?style=gitweb">shortlog</a> |
639 <a href="/shortlog?style=gitweb">shortlog</a> |
637 <a href="/log?style=gitweb">changelog</a> |
640 <a href="/log?style=gitweb">changelog</a> |
638 <a href="/graph?style=gitweb">graph</a> |
641 <a href="/graph?style=gitweb">graph</a> |
639 <a href="/tags?style=gitweb">tags</a> |
642 <a href="/tags?style=gitweb">tags</a> |
640 <a href="/branches?style=gitweb">branches</a> |
643 <a href="/branches?style=gitweb">branches</a> |
641 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
644 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
642 <a href="/help?style=gitweb">help</a>
645 <a href="/help?style=gitweb">help</a>
643 <br/>
646 <br/>
644 </div>
647 </div>
645
648
646 <div class="title">&nbsp;</div>
649 <div class="title">&nbsp;</div>
647 <table cellspacing="0">
650 <table cellspacing="0">
648 <tr><td>description</td><td>unknown</td></tr>
651 <tr><td>description</td><td>unknown</td></tr>
649 <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>
652 <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>
650 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
653 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
651 </table>
654 </table>
652
655
653 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
656 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
654 <table cellspacing="0">
657 <table cellspacing="0">
655
658
656 <tr class="parity0">
659 <tr class="parity0">
657 <td class="age"><i>1970-01-01</i></td>
660 <td class="age"><i>1970-01-01</i></td>
658 <td><i>test</i></td>
661 <td><i>test</i></td>
659 <td>
662 <td>
660 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
663 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
661 <b>branch</b>
664 <b>branch</b>
662 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> </span>
665 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> </span>
663 </a>
666 </a>
664 </td>
667 </td>
665 <td class="link" nowrap>
668 <td class="link" nowrap>
666 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
669 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
667 <a href="/file/1d22e65f027e?style=gitweb">files</a>
670 <a href="/file/1d22e65f027e?style=gitweb">files</a>
668 </td>
671 </td>
669 </tr>
672 </tr>
670 <tr class="parity1">
673 <tr class="parity1">
671 <td class="age"><i>1970-01-01</i></td>
674 <td class="age"><i>1970-01-01</i></td>
672 <td><i>test</i></td>
675 <td><i>test</i></td>
673 <td>
676 <td>
674 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
677 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
675 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
678 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
676 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
679 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
677 </a>
680 </a>
678 </td>
681 </td>
679 <td class="link" nowrap>
682 <td class="link" nowrap>
680 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
683 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
681 <a href="/file/a4f92ed23982?style=gitweb">files</a>
684 <a href="/file/a4f92ed23982?style=gitweb">files</a>
682 </td>
685 </td>
683 </tr>
686 </tr>
684 <tr class="parity0">
687 <tr class="parity0">
685 <td class="age"><i>1970-01-01</i></td>
688 <td class="age"><i>1970-01-01</i></td>
686 <td><i>test</i></td>
689 <td><i>test</i></td>
687 <td>
690 <td>
688 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
691 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
689 <b>base</b>
692 <b>base</b>
690 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> </span>
693 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> </span>
691 </a>
694 </a>
692 </td>
695 </td>
693 <td class="link" nowrap>
696 <td class="link" nowrap>
694 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
697 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
695 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
698 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
696 </td>
699 </td>
697 </tr>
700 </tr>
698 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
701 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
699 </table>
702 </table>
700
703
701 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
704 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
702 <table cellspacing="0">
705 <table cellspacing="0">
703
706
704 <tr class="parity0">
707 <tr class="parity0">
705 <td class="age"><i>1970-01-01</i></td>
708 <td class="age"><i>1970-01-01</i></td>
706 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
709 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
707 <td class="link">
710 <td class="link">
708 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
711 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
709 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
712 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
710 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
713 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
711 </td>
714 </td>
712 </tr>
715 </tr>
713 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
716 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
714 </table>
717 </table>
715
718
716 <div><a class="title" href="#">branches</a></div>
719 <div><a class="title" href="#">branches</a></div>
717 <table cellspacing="0">
720 <table cellspacing="0">
718
721
719 <tr class="parity0">
722 <tr class="parity0">
720 <td class="age"><i>1970-01-01</i></td>
723 <td class="age"><i>1970-01-01</i></td>
721 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
724 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
722 <td class="">stable</td>
725 <td class="">stable</td>
723 <td class="link">
726 <td class="link">
724 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
727 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
725 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
728 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
726 <a href="/file/1d22e65f027e?style=gitweb">files</a>
729 <a href="/file/1d22e65f027e?style=gitweb">files</a>
727 </td>
730 </td>
728 </tr>
731 </tr>
729 <tr class="parity1">
732 <tr class="parity1">
730 <td class="age"><i>1970-01-01</i></td>
733 <td class="age"><i>1970-01-01</i></td>
731 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
734 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
732 <td class="">default</td>
735 <td class="">default</td>
733 <td class="link">
736 <td class="link">
734 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
737 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
735 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
738 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
736 <a href="/file/a4f92ed23982?style=gitweb">files</a>
739 <a href="/file/a4f92ed23982?style=gitweb">files</a>
737 </td>
740 </td>
738 </tr>
741 </tr>
739 <tr class="light">
742 <tr class="light">
740 <td colspan="4"><a class="list" href="#">...</a></td>
743 <td colspan="4"><a class="list" href="#">...</a></td>
741 </tr>
744 </tr>
742 </table>
745 </table>
743 <div class="page_footer">
746 <div class="page_footer">
744 <div class="page_footer_text">test</div>
747 <div class="page_footer_text">test</div>
745 <div class="rss_logo">
748 <div class="rss_logo">
746 <a href="/rss-log">RSS</a>
749 <a href="/rss-log">RSS</a>
747 <a href="/atom-log">Atom</a>
750 <a href="/atom-log">Atom</a>
748 </div>
751 </div>
749 <br />
752 <br />
750
753
751 </div>
754 </div>
752 </body>
755 </body>
753 </html>
756 </html>
754
757
755 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/?style=gitweb'
758 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/?style=gitweb'
756 200 Script output follows
759 200 Script output follows
757
760
758 <?xml version="1.0" encoding="ascii"?>
761 <?xml version="1.0" encoding="ascii"?>
759 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
762 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
760 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
763 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
761 <head>
764 <head>
762 <link rel="icon" href="/static/hgicon.png" type="image/png" />
765 <link rel="icon" href="/static/hgicon.png" type="image/png" />
763 <meta name="robots" content="index, nofollow"/>
766 <meta name="robots" content="index, nofollow"/>
764 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
767 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
765
768
766
769
767 <title>test: Graph</title>
770 <title>test: Graph</title>
768 <link rel="alternate" type="application/atom+xml"
771 <link rel="alternate" type="application/atom+xml"
769 href="/atom-log" title="Atom feed for test"/>
772 href="/atom-log" title="Atom feed for test"/>
770 <link rel="alternate" type="application/rss+xml"
773 <link rel="alternate" type="application/rss+xml"
771 href="/rss-log" title="RSS feed for test"/>
774 href="/rss-log" title="RSS feed for test"/>
772 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
775 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
773 </head>
776 </head>
774 <body>
777 <body>
775
778
776 <div class="page_header">
779 <div class="page_header">
777 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
780 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
778 </div>
781 </div>
779
782
780 <form action="/log">
783 <form action="/log">
781 <input type="hidden" name="style" value="gitweb" />
784 <input type="hidden" name="style" value="gitweb" />
782 <div class="search">
785 <div class="search">
783 <input type="text" name="rev" />
786 <input type="text" name="rev" />
784 </div>
787 </div>
785 </form>
788 </form>
786 <div class="page_nav">
789 <div class="page_nav">
787 <a href="/summary?style=gitweb">summary</a> |
790 <a href="/summary?style=gitweb">summary</a> |
788 <a href="/shortlog?style=gitweb">shortlog</a> |
791 <a href="/shortlog?style=gitweb">shortlog</a> |
789 <a href="/log/2?style=gitweb">changelog</a> |
792 <a href="/log/2?style=gitweb">changelog</a> |
790 graph |
793 graph |
791 <a href="/tags?style=gitweb">tags</a> |
794 <a href="/tags?style=gitweb">tags</a> |
792 <a href="/branches?style=gitweb">branches</a> |
795 <a href="/branches?style=gitweb">branches</a> |
793 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
796 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
794 <a href="/help?style=gitweb">help</a>
797 <a href="/help?style=gitweb">help</a>
795 <br/>
798 <br/>
796 <a href="/graph/2?style=gitweb&revcount=30">less</a>
799 <a href="/graph/2?style=gitweb&revcount=30">less</a>
797 <a href="/graph/2?style=gitweb&revcount=120">more</a>
800 <a href="/graph/2?style=gitweb&revcount=120">more</a>
798 | <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/>
801 | <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/>
799 </div>
802 </div>
800
803
801 <div class="title">&nbsp;</div>
804 <div class="title">&nbsp;</div>
802
805
803 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
806 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
804
807
805 <div id="wrapper">
808 <div id="wrapper">
806 <ul id="nodebgs"></ul>
809 <ul id="nodebgs"></ul>
807 <canvas id="graph" width="224" height="129"></canvas>
810 <canvas id="graph" width="224" height="129"></canvas>
808 <ul id="graphnodes"></ul>
811 <ul id="graphnodes"></ul>
809 </div>
812 </div>
810
813
811 <script type="text/javascript" src="/static/graph.js"></script>
814 <script type="text/javascript" src="/static/graph.js"></script>
812 <script>
815 <script>
813 <!-- hide script content
816 <!-- hide script content
814
817
815 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["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"], []]];
818 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["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"], []]];
816 var graph = new Graph();
819 var graph = new Graph();
817 graph.scale(39);
820 graph.scale(39);
818
821
819 graph.edge = function(x0, y0, x1, y1, color) {
822 graph.edge = function(x0, y0, x1, y1, color) {
820
823
821 this.setColor(color, 0.0, 0.65);
824 this.setColor(color, 0.0, 0.65);
822 this.ctx.beginPath();
825 this.ctx.beginPath();
823 this.ctx.moveTo(x0, y0);
826 this.ctx.moveTo(x0, y0);
824 this.ctx.lineTo(x1, y1);
827 this.ctx.lineTo(x1, y1);
825 this.ctx.stroke();
828 this.ctx.stroke();
826
829
827 }
830 }
828
831
829 var revlink = '<li style="_STYLE"><span class="desc">';
832 var revlink = '<li style="_STYLE"><span class="desc">';
830 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
833 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
831 revlink += '</span> _TAGS';
834 revlink += '</span> _TAGS';
832 revlink += '<span class="info">_DATE, by _USER</span></li>';
835 revlink += '<span class="info">_DATE, by _USER</span></li>';
833
836
834 graph.vertex = function(x, y, color, parity, cur) {
837 graph.vertex = function(x, y, color, parity, cur) {
835
838
836 this.ctx.beginPath();
839 this.ctx.beginPath();
837 color = this.setColor(color, 0.25, 0.75);
840 color = this.setColor(color, 0.25, 0.75);
838 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
841 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
839 this.ctx.fill();
842 this.ctx.fill();
840
843
841 var bg = '<li class="bg parity' + parity + '"></li>';
844 var bg = '<li class="bg parity' + parity + '"></li>';
842 var left = (this.columns + 1) * this.bg_height;
845 var left = (this.columns + 1) * this.bg_height;
843 var nstyle = 'padding-left: ' + left + 'px;';
846 var nstyle = 'padding-left: ' + left + 'px;';
844 var item = revlink.replace(/_STYLE/, nstyle);
847 var item = revlink.replace(/_STYLE/, nstyle);
845 item = item.replace(/_PARITY/, 'parity' + parity);
848 item = item.replace(/_PARITY/, 'parity' + parity);
846 item = item.replace(/_NODEID/, cur[0]);
849 item = item.replace(/_NODEID/, cur[0]);
847 item = item.replace(/_NODEID/, cur[0]);
850 item = item.replace(/_NODEID/, cur[0]);
848 item = item.replace(/_DESC/, cur[3]);
851 item = item.replace(/_DESC/, cur[3]);
849 item = item.replace(/_USER/, cur[4]);
852 item = item.replace(/_USER/, cur[4]);
850 item = item.replace(/_DATE/, cur[5]);
853 item = item.replace(/_DATE/, cur[5]);
851
854
852 var tagspan = '';
855 var tagspan = '';
853 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
856 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
854 tagspan = '<span class="logtags">';
857 tagspan = '<span class="logtags">';
855 if (cur[6][1]) {
858 if (cur[6][1]) {
856 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
859 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
857 tagspan += cur[6][0] + '</span> ';
860 tagspan += cur[6][0] + '</span> ';
858 } else if (!cur[6][1] && cur[6][0] != 'default') {
861 } else if (!cur[6][1] && cur[6][0] != 'default') {
859 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
862 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
860 tagspan += cur[6][0] + '</span> ';
863 tagspan += cur[6][0] + '</span> ';
861 }
864 }
862 if (cur[7].length) {
865 if (cur[7].length) {
863 for (var t in cur[7]) {
866 for (var t in cur[7]) {
864 var tag = cur[7][t];
867 var tag = cur[7][t];
865 tagspan += '<span class="tagtag">' + tag + '</span> ';
868 tagspan += '<span class="tagtag">' + tag + '</span> ';
866 }
869 }
867 }
870 }
868 tagspan += '</span>';
871 tagspan += '</span>';
869 }
872 }
870
873
871 item = item.replace(/_TAGS/, tagspan);
874 item = item.replace(/_TAGS/, tagspan);
872 return [bg, item];
875 return [bg, item];
873
876
874 }
877 }
875
878
876 graph.render(data);
879 graph.render(data);
877
880
878 // stop hiding script -->
881 // stop hiding script -->
879 </script>
882 </script>
880
883
881 <div class="page_nav">
884 <div class="page_nav">
882 <a href="/graph/2?style=gitweb&revcount=30">less</a>
885 <a href="/graph/2?style=gitweb&revcount=30">less</a>
883 <a href="/graph/2?style=gitweb&revcount=120">more</a>
886 <a href="/graph/2?style=gitweb&revcount=120">more</a>
884 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
887 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
885 </div>
888 </div>
886
889
887 <div class="page_footer">
890 <div class="page_footer">
888 <div class="page_footer_text">test</div>
891 <div class="page_footer_text">test</div>
889 <div class="rss_logo">
892 <div class="rss_logo">
890 <a href="/rss-log">RSS</a>
893 <a href="/rss-log">RSS</a>
891 <a href="/atom-log">Atom</a>
894 <a href="/atom-log">Atom</a>
892 </div>
895 </div>
893 <br />
896 <br />
894
897
895 </div>
898 </div>
896 </body>
899 </body>
897 </html>
900 </html>
898
901
899
902
900 capabilities
903 capabilities
901
904
902 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=capabilities'; echo
905 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=capabilities'; echo
903 200 Script output follows
906 200 Script output follows
904
907
905 lookup changegroupsubset branchmap pushkey unbundle=HG10GZ,HG10BZ,HG10UN
908 lookup changegroupsubset branchmap pushkey unbundle=HG10GZ,HG10BZ,HG10UN
906
909
907 heads
910 heads
908
911
909 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=heads'
912 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=heads'
910 200 Script output follows
913 200 Script output follows
911
914
912 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
915 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
913
916
914 branches
917 branches
915
918
916 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=branches&nodes=0000000000000000000000000000000000000000'
919 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=branches&nodes=0000000000000000000000000000000000000000'
917 200 Script output follows
920 200 Script output follows
918
921
919 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
922 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
920
923
921 changegroup
924 changegroup
922
925
923 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=changegroup&roots=0000000000000000000000000000000000000000'
926 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=changegroup&roots=0000000000000000000000000000000000000000'
924 200 Script output follows
927 200 Script output follows
925
928
926 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 (esc)
929 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 (esc)
927 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~\\n\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 \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 (esc)
930 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~\\n\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 \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 (esc)
928 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3'\x859 (esc)
931 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3'\x859 (esc)
929 \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 _\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 (no-eol) (esc)
932 \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 _\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 (no-eol) (esc)
930
933
931 stream_out
934 stream_out
932
935
933 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=stream_out'
936 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=stream_out'
934 200 Script output follows
937 200 Script output follows
935
938
936 1
939 1
937
940
938 failing unbundle, requires POST request
941 failing unbundle, requires POST request
939
942
940 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=unbundle'
943 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=unbundle'
941 405 push requires POST request
944 405 push requires POST request
942
945
943 0
946 0
944 push requires POST request
947 push requires POST request
945 [1]
948 [1]
946
949
947 Static files
950 Static files
948
951
949 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/static/style.css'
952 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/static/style.css'
950 200 Script output follows
953 200 Script output follows
951
954
952 a { text-decoration:none; }
955 a { text-decoration:none; }
953 .age { white-space:nowrap; }
956 .age { white-space:nowrap; }
954 .date { white-space:nowrap; }
957 .date { white-space:nowrap; }
955 .indexlinks { white-space:nowrap; }
958 .indexlinks { white-space:nowrap; }
956 .parity0 { background-color: #ddd; }
959 .parity0 { background-color: #ddd; }
957 .parity1 { background-color: #eee; }
960 .parity1 { background-color: #eee; }
958 .lineno { width: 60px; color: #aaa; font-size: smaller;
961 .lineno { width: 60px; color: #aaa; font-size: smaller;
959 text-align: right; }
962 text-align: right; }
960 .plusline { color: green; }
963 .plusline { color: green; }
961 .minusline { color: red; }
964 .minusline { color: red; }
962 .atline { color: purple; }
965 .atline { color: purple; }
963 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
966 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
964 .buttons a {
967 .buttons a {
965 background-color: #666;
968 background-color: #666;
966 padding: 2pt;
969 padding: 2pt;
967 color: white;
970 color: white;
968 font-family: sans;
971 font-family: sans;
969 font-weight: bold;
972 font-weight: bold;
970 }
973 }
971 .navigate a {
974 .navigate a {
972 background-color: #ccc;
975 background-color: #ccc;
973 padding: 2pt;
976 padding: 2pt;
974 font-family: sans;
977 font-family: sans;
975 color: black;
978 color: black;
976 }
979 }
977
980
978 .metatag {
981 .metatag {
979 background-color: #888;
982 background-color: #888;
980 color: white;
983 color: white;
981 text-align: right;
984 text-align: right;
982 }
985 }
983
986
984 /* Common */
987 /* Common */
985 pre { margin: 0; }
988 pre { margin: 0; }
986
989
987 .logo {
990 .logo {
988 float: right;
991 float: right;
989 clear: right;
992 clear: right;
990 }
993 }
991
994
992 /* Changelog/Filelog entries */
995 /* Changelog/Filelog entries */
993 .logEntry { width: 100%; }
996 .logEntry { width: 100%; }
994 .logEntry .age { width: 15%; }
997 .logEntry .age { width: 15%; }
995 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
998 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
996 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
999 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
997 .logEntry th.firstline { text-align: left; width: inherit; }
1000 .logEntry th.firstline { text-align: left; width: inherit; }
998
1001
999 /* Shortlog entries */
1002 /* Shortlog entries */
1000 .slogEntry { width: 100%; }
1003 .slogEntry { width: 100%; }
1001 .slogEntry .age { width: 8em; }
1004 .slogEntry .age { width: 8em; }
1002 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
1005 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
1003 .slogEntry td.author { width: 15em; }
1006 .slogEntry td.author { width: 15em; }
1004
1007
1005 /* Tag entries */
1008 /* Tag entries */
1006 #tagEntries { list-style: none; margin: 0; padding: 0; }
1009 #tagEntries { list-style: none; margin: 0; padding: 0; }
1007 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
1010 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
1008
1011
1009 /* Changeset entry */
1012 /* Changeset entry */
1010 #changesetEntry { }
1013 #changesetEntry { }
1011 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1014 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1012 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
1015 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
1013
1016
1014 /* File diff view */
1017 /* File diff view */
1015 #filediffEntry { }
1018 #filediffEntry { }
1016 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1019 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1017
1020
1018 /* Graph */
1021 /* Graph */
1019 div#wrapper {
1022 div#wrapper {
1020 position: relative;
1023 position: relative;
1021 margin: 0;
1024 margin: 0;
1022 padding: 0;
1025 padding: 0;
1023 }
1026 }
1024
1027
1025 canvas {
1028 canvas {
1026 position: absolute;
1029 position: absolute;
1027 z-index: 5;
1030 z-index: 5;
1028 top: -0.6em;
1031 top: -0.6em;
1029 margin: 0;
1032 margin: 0;
1030 }
1033 }
1031
1034
1032 ul#nodebgs {
1035 ul#nodebgs {
1033 list-style: none inside none;
1036 list-style: none inside none;
1034 padding: 0;
1037 padding: 0;
1035 margin: 0;
1038 margin: 0;
1036 top: -0.7em;
1039 top: -0.7em;
1037 }
1040 }
1038
1041
1039 ul#graphnodes li, ul#nodebgs li {
1042 ul#graphnodes li, ul#nodebgs li {
1040 height: 39px;
1043 height: 39px;
1041 }
1044 }
1042
1045
1043 ul#graphnodes {
1046 ul#graphnodes {
1044 position: absolute;
1047 position: absolute;
1045 z-index: 10;
1048 z-index: 10;
1046 top: -0.85em;
1049 top: -0.85em;
1047 list-style: none inside none;
1050 list-style: none inside none;
1048 padding: 0;
1051 padding: 0;
1049 }
1052 }
1050
1053
1051 ul#graphnodes li .info {
1054 ul#graphnodes li .info {
1052 display: block;
1055 display: block;
1053 font-size: 70%;
1056 font-size: 70%;
1054 position: relative;
1057 position: relative;
1055 top: -1px;
1058 top: -1px;
1056 }
1059 }
1057
1060
1058 Stop and restart with HGENCODING=cp932
1061 Stop and restart with HGENCODING=cp932
1059
1062
1060 $ "$TESTDIR/killdaemons.py"
1063 $ "$TESTDIR/killdaemons.py"
1061 $ HGENCODING=cp932 hg serve --config server.uncompressed=False -n test \
1064 $ HGENCODING=cp932 hg serve --config server.uncompressed=False -n test \
1062 > -p $HGPORT -d --pid-file=hg.pid -E errors.log
1065 > -p $HGPORT -d --pid-file=hg.pid -E errors.log
1063 $ cat hg.pid >> $DAEMON_PIDS
1066 $ cat hg.pid >> $DAEMON_PIDS
1064
1067
1065 commit message with Japanese Kanji 'Noh', which ends with '\x5c'
1068 commit message with Japanese Kanji 'Noh', which ends with '\x5c'
1066
1069
1067 $ echo foo >> foo
1070 $ echo foo >> foo
1068 $ HGENCODING=cp932 hg ci -m `python -c 'print("\x94\x5c")'`
1071 $ HGENCODING=cp932 hg ci -m `python -c 'print("\x94\x5c")'`
1069
1072
1070 Graph json escape of multibyte character
1073 Graph json escape of multibyte character
1071
1074
1072 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/' \
1075 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/' \
1073 > | grep '^var data ='
1076 > | grep '^var data ='
1074 var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "\u80fd", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], [], []], ["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"], []]];
1077 var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "\u80fd", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], [], []], ["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"], []]];
1075
1078
1076 ERRORS ENCOUNTERED
1079 ERRORS ENCOUNTERED
1077
1080
1078 $ cat errors.log
1081 $ cat errors.log
@@ -1,137 +1,138 b''
1 Test chains of near empty directories, terminating 3 different ways:
1 Test chains of near empty directories, terminating 3 different ways:
2 - a1: file at level 4 (deepest)
2 - a1: file at level 4 (deepest)
3 - b1: two dirs at level 3
3 - b1: two dirs at level 3
4 - e1: file at level 2
4 - e1: file at level 2
5
5
6 Set up the repo
6 Set up the repo
7
7
8 $ hg init test
8 $ hg init test
9 $ cd test
9 $ cd test
10 $ mkdir -p a1/a2/a3/a4
10 $ mkdir -p a1/a2/a3/a4
11 $ mkdir -p b1/b2/b3/b4
11 $ mkdir -p b1/b2/b3/b4
12 $ mkdir -p b1/b2/c3/c4
12 $ mkdir -p b1/b2/c3/c4
13 $ mkdir -p d1/d2/d3/d4
13 $ mkdir -p d1/d2/d3/d4
14 $ echo foo > a1/a2/a3/a4/foo
14 $ echo foo > a1/a2/a3/a4/foo
15 $ echo foo > b1/b2/b3/b4/foo
15 $ echo foo > b1/b2/b3/b4/foo
16 $ echo foo > b1/b2/c3/c4/foo
16 $ echo foo > b1/b2/c3/c4/foo
17 $ echo foo > d1/d2/d3/d4/foo
17 $ echo foo > d1/d2/d3/d4/foo
18 $ echo foo > d1/d2/foo
18 $ echo foo > d1/d2/foo
19 $ hg ci -Ama
19 $ hg ci -Ama
20 adding a1/a2/a3/a4/foo
20 adding a1/a2/a3/a4/foo
21 adding b1/b2/b3/b4/foo
21 adding b1/b2/b3/b4/foo
22 adding b1/b2/c3/c4/foo
22 adding b1/b2/c3/c4/foo
23 adding d1/d2/d3/d4/foo
23 adding d1/d2/d3/d4/foo
24 adding d1/d2/foo
24 adding d1/d2/foo
25 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
25 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
26 $ cat hg.pid >> $DAEMON_PIDS
26 $ cat hg.pid >> $DAEMON_PIDS
27
27
28 manifest with descending
28 manifest with descending
29
29
30 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file'
30 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file'
31 200 Script output follows
31 200 Script output follows
32
32
33 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
33 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
34 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
34 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
35 <head>
35 <head>
36 <link rel="icon" href="/static/hgicon.png" type="image/png" />
36 <link rel="icon" href="/static/hgicon.png" type="image/png" />
37 <meta name="robots" content="index, nofollow" />
37 <meta name="robots" content="index, nofollow" />
38 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
38 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
39
39
40 <title>test: 9087c84a0f5d /</title>
40 <title>test: 9087c84a0f5d /</title>
41 </head>
41 </head>
42 <body>
42 <body>
43
43
44 <div class="container">
44 <div class="container">
45 <div class="menu">
45 <div class="menu">
46 <div class="logo">
46 <div class="logo">
47 <a href="http://mercurial.selenic.com/">
47 <a href="http://mercurial.selenic.com/">
48 <img src="/static/hglogo.png" alt="mercurial" /></a>
48 <img src="/static/hglogo.png" alt="mercurial" /></a>
49 </div>
49 </div>
50 <ul>
50 <ul>
51 <li><a href="/shortlog/9087c84a0f5d">log</a></li>
51 <li><a href="/shortlog/9087c84a0f5d">log</a></li>
52 <li><a href="/graph/9087c84a0f5d">graph</a></li>
52 <li><a href="/graph/9087c84a0f5d">graph</a></li>
53 <li><a href="/tags">tags</a></li>
53 <li><a href="/tags">tags</a></li>
54 <li><a href="/bookmarks">bookmarks</a></li>
54 <li><a href="/branches">branches</a></li>
55 <li><a href="/branches">branches</a></li>
55 </ul>
56 </ul>
56 <ul>
57 <ul>
57 <li><a href="/rev/9087c84a0f5d">changeset</a></li>
58 <li><a href="/rev/9087c84a0f5d">changeset</a></li>
58 <li class="active">browse</li>
59 <li class="active">browse</li>
59 </ul>
60 </ul>
60 <ul>
61 <ul>
61
62
62 </ul>
63 </ul>
63 <ul>
64 <ul>
64 <li><a href="/help">help</a></li>
65 <li><a href="/help">help</a></li>
65 </ul>
66 </ul>
66 </div>
67 </div>
67
68
68 <div class="main">
69 <div class="main">
69 <h2><a href="/">test</a></h2>
70 <h2><a href="/">test</a></h2>
70 <h3>directory / @ 0:9087c84a0f5d <span class="tag">tip</span> </h3>
71 <h3>directory / @ 0:9087c84a0f5d <span class="tag">tip</span> </h3>
71
72
72 <form class="search" action="/log">
73 <form class="search" action="/log">
73
74
74 <p><input name="rev" id="search1" type="text" size="30" /></p>
75 <p><input name="rev" id="search1" type="text" size="30" /></p>
75 <div id="hint">find changesets by author, revision,
76 <div id="hint">find changesets by author, revision,
76 files, or words in the commit message</div>
77 files, or words in the commit message</div>
77 </form>
78 </form>
78
79
79 <table class="bigtable">
80 <table class="bigtable">
80 <tr>
81 <tr>
81 <th class="name">name</th>
82 <th class="name">name</th>
82 <th class="size">size</th>
83 <th class="size">size</th>
83 <th class="permissions">permissions</th>
84 <th class="permissions">permissions</th>
84 </tr>
85 </tr>
85 <tr class="fileline parity0">
86 <tr class="fileline parity0">
86 <td class="name"><a href="/file/9087c84a0f5d/">[up]</a></td>
87 <td class="name"><a href="/file/9087c84a0f5d/">[up]</a></td>
87 <td class="size"></td>
88 <td class="size"></td>
88 <td class="permissions">drwxr-xr-x</td>
89 <td class="permissions">drwxr-xr-x</td>
89 </tr>
90 </tr>
90
91
91 <tr class="fileline parity1">
92 <tr class="fileline parity1">
92 <td class="name">
93 <td class="name">
93 <a href="/file/9087c84a0f5d/a1">
94 <a href="/file/9087c84a0f5d/a1">
94 <img src="/static/coal-folder.png" alt="dir."/> a1/
95 <img src="/static/coal-folder.png" alt="dir."/> a1/
95 </a>
96 </a>
96 <a href="/file/9087c84a0f5d/a1/a2/a3/a4">
97 <a href="/file/9087c84a0f5d/a1/a2/a3/a4">
97 a2/a3/a4
98 a2/a3/a4
98 </a>
99 </a>
99 </td>
100 </td>
100 <td class="size"></td>
101 <td class="size"></td>
101 <td class="permissions">drwxr-xr-x</td>
102 <td class="permissions">drwxr-xr-x</td>
102 </tr>
103 </tr>
103 <tr class="fileline parity0">
104 <tr class="fileline parity0">
104 <td class="name">
105 <td class="name">
105 <a href="/file/9087c84a0f5d/b1">
106 <a href="/file/9087c84a0f5d/b1">
106 <img src="/static/coal-folder.png" alt="dir."/> b1/
107 <img src="/static/coal-folder.png" alt="dir."/> b1/
107 </a>
108 </a>
108 <a href="/file/9087c84a0f5d/b1/b2">
109 <a href="/file/9087c84a0f5d/b1/b2">
109 b2
110 b2
110 </a>
111 </a>
111 </td>
112 </td>
112 <td class="size"></td>
113 <td class="size"></td>
113 <td class="permissions">drwxr-xr-x</td>
114 <td class="permissions">drwxr-xr-x</td>
114 </tr>
115 </tr>
115 <tr class="fileline parity1">
116 <tr class="fileline parity1">
116 <td class="name">
117 <td class="name">
117 <a href="/file/9087c84a0f5d/d1">
118 <a href="/file/9087c84a0f5d/d1">
118 <img src="/static/coal-folder.png" alt="dir."/> d1/
119 <img src="/static/coal-folder.png" alt="dir."/> d1/
119 </a>
120 </a>
120 <a href="/file/9087c84a0f5d/d1/d2">
121 <a href="/file/9087c84a0f5d/d1/d2">
121 d2
122 d2
122 </a>
123 </a>
123 </td>
124 </td>
124 <td class="size"></td>
125 <td class="size"></td>
125 <td class="permissions">drwxr-xr-x</td>
126 <td class="permissions">drwxr-xr-x</td>
126 </tr>
127 </tr>
127
128
128 </table>
129 </table>
129 </div>
130 </div>
130 </div>
131 </div>
131
132
132
133
133 </body>
134 </body>
134 </html>
135 </html>
135
136
136
137
137 $ cat errors.log
138 $ cat errors.log
@@ -1,485 +1,489 b''
1 setting up repo
1 setting up repo
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ echo a > a
5 $ echo a > a
6 $ echo b > b
6 $ echo b > b
7 $ hg ci -Ama
7 $ hg ci -Ama
8 adding a
8 adding a
9 adding b
9 adding b
10
10
11 change permissions for git diffs
11 change permissions for git diffs
12
12
13 $ chmod 755 a
13 $ chmod 755 a
14 $ hg ci -Amb
14 $ hg ci -Amb
15
15
16 set up hgweb
16 set up hgweb
17
17
18 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
18 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
19 $ cat hg.pid >> $DAEMON_PIDS
19 $ cat hg.pid >> $DAEMON_PIDS
20
20
21 revision
21 revision
22
22
23 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
23 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
24 200 Script output follows
24 200 Script output follows
25
25
26 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
26 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
27 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
27 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
28 <head>
28 <head>
29 <link rel="icon" href="/static/hgicon.png" type="image/png" />
29 <link rel="icon" href="/static/hgicon.png" type="image/png" />
30 <meta name="robots" content="index, nofollow" />
30 <meta name="robots" content="index, nofollow" />
31 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
31 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
32
32
33 <title>test: 0cd96de13884</title>
33 <title>test: 0cd96de13884</title>
34 </head>
34 </head>
35 <body>
35 <body>
36 <div class="container">
36 <div class="container">
37 <div class="menu">
37 <div class="menu">
38 <div class="logo">
38 <div class="logo">
39 <a href="http://mercurial.selenic.com/">
39 <a href="http://mercurial.selenic.com/">
40 <img src="/static/hglogo.png" alt="mercurial" /></a>
40 <img src="/static/hglogo.png" alt="mercurial" /></a>
41 </div>
41 </div>
42 <ul>
42 <ul>
43 <li><a href="/shortlog/0cd96de13884">log</a></li>
43 <li><a href="/shortlog/0cd96de13884">log</a></li>
44 <li><a href="/graph/0cd96de13884">graph</a></li>
44 <li><a href="/graph/0cd96de13884">graph</a></li>
45 <li><a href="/tags">tags</a></li>
45 <li><a href="/tags">tags</a></li>
46 <li><a href="/bookmarks">bookmarks</a></li>
46 <li><a href="/branches">branches</a></li>
47 <li><a href="/branches">branches</a></li>
47 </ul>
48 </ul>
48 <ul>
49 <ul>
49 <li class="active">changeset</li>
50 <li class="active">changeset</li>
50 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
51 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
51 <li><a href="/file/0cd96de13884">browse</a></li>
52 <li><a href="/file/0cd96de13884">browse</a></li>
52 </ul>
53 </ul>
53 <ul>
54 <ul>
54
55
55 </ul>
56 </ul>
56 <ul>
57 <ul>
57 <li><a href="/help">help</a></li>
58 <li><a href="/help">help</a></li>
58 </ul>
59 </ul>
59 </div>
60 </div>
60
61
61 <div class="main">
62 <div class="main">
62
63
63 <h2><a href="/">test</a></h2>
64 <h2><a href="/">test</a></h2>
64 <h3>changeset 0:0cd96de13884 </h3>
65 <h3>changeset 0:0cd96de13884 </h3>
65
66
66 <form class="search" action="/log">
67 <form class="search" action="/log">
67
68
68 <p><input name="rev" id="search1" type="text" size="30" /></p>
69 <p><input name="rev" id="search1" type="text" size="30" /></p>
69 <div id="hint">find changesets by author, revision,
70 <div id="hint">find changesets by author, revision,
70 files, or words in the commit message</div>
71 files, or words in the commit message</div>
71 </form>
72 </form>
72
73
73 <div class="description">a</div>
74 <div class="description">a</div>
74
75
75 <table id="changesetEntry">
76 <table id="changesetEntry">
76 <tr>
77 <tr>
77 <th class="author">author</th>
78 <th class="author">author</th>
78 <td class="author">&#116;&#101;&#115;&#116;</td>
79 <td class="author">&#116;&#101;&#115;&#116;</td>
79 </tr>
80 </tr>
80 <tr>
81 <tr>
81 <th class="date">date</th>
82 <th class="date">date</th>
82 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
83 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
83 <tr>
84 <tr>
84 <th class="author">parents</th>
85 <th class="author">parents</th>
85 <td class="author"></td>
86 <td class="author"></td>
86 </tr>
87 </tr>
87 <tr>
88 <tr>
88 <th class="author">children</th>
89 <th class="author">children</th>
89 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
90 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
90 </tr>
91 </tr>
91 <tr>
92 <tr>
92 <th class="files">files</th>
93 <th class="files">files</th>
93 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
94 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
94 </tr>
95 </tr>
95 </table>
96 </table>
96
97
97 <div class="overflow">
98 <div class="overflow">
98 <div class="sourcefirst"> line diff</div>
99 <div class="sourcefirst"> line diff</div>
99
100
100 <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
101 <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
101 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
102 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
102 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
103 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
103 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
104 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
104 </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
105 </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
105 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/b Thu Jan 01 00:00:00 1970 +0000
106 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/b Thu Jan 01 00:00:00 1970 +0000
106 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
107 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
107 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+b
108 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+b
108 </span></pre></div>
109 </span></pre></div>
109 </div>
110 </div>
110
111
111 </div>
112 </div>
112 </div>
113 </div>
113
114
114
115
115 </body>
116 </body>
116 </html>
117 </html>
117
118
118
119
119 raw revision
120 raw revision
120
121
121 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/raw-rev/0'
122 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/raw-rev/0'
122 200 Script output follows
123 200 Script output follows
123
124
124
125
125 # HG changeset patch
126 # HG changeset patch
126 # User test
127 # User test
127 # Date 0 0
128 # Date 0 0
128 # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
129 # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
129
130
130 a
131 a
131
132
132 diff -r 000000000000 -r 0cd96de13884 a
133 diff -r 000000000000 -r 0cd96de13884 a
133 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
134 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
134 +++ b/a Thu Jan 01 00:00:00 1970 +0000
135 +++ b/a Thu Jan 01 00:00:00 1970 +0000
135 @@ -0,0 +1,1 @@
136 @@ -0,0 +1,1 @@
136 +a
137 +a
137 diff -r 000000000000 -r 0cd96de13884 b
138 diff -r 000000000000 -r 0cd96de13884 b
138 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
139 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
139 +++ b/b Thu Jan 01 00:00:00 1970 +0000
140 +++ b/b Thu Jan 01 00:00:00 1970 +0000
140 @@ -0,0 +1,1 @@
141 @@ -0,0 +1,1 @@
141 +b
142 +b
142
143
143
144
144 diff removed file
145 diff removed file
145
146
146 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
147 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
147 200 Script output follows
148 200 Script output follows
148
149
149 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
150 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
150 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
151 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
151 <head>
152 <head>
152 <link rel="icon" href="/static/hgicon.png" type="image/png" />
153 <link rel="icon" href="/static/hgicon.png" type="image/png" />
153 <meta name="robots" content="index, nofollow" />
154 <meta name="robots" content="index, nofollow" />
154 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
155 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
155
156
156 <title>test: a diff</title>
157 <title>test: a diff</title>
157 </head>
158 </head>
158 <body>
159 <body>
159
160
160 <div class="container">
161 <div class="container">
161 <div class="menu">
162 <div class="menu">
162 <div class="logo">
163 <div class="logo">
163 <a href="http://mercurial.selenic.com/">
164 <a href="http://mercurial.selenic.com/">
164 <img src="/static/hglogo.png" alt="mercurial" /></a>
165 <img src="/static/hglogo.png" alt="mercurial" /></a>
165 </div>
166 </div>
166 <ul>
167 <ul>
167 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
168 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
168 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
169 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
169 <li><a href="/tags">tags</a></li>
170 <li><a href="/tags">tags</a></li>
171 <li><a href="/bookmarks">bookmarks</a></li>
170 <li><a href="/branches">branches</a></li>
172 <li><a href="/branches">branches</a></li>
171 </ul>
173 </ul>
172 <ul>
174 <ul>
173 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
175 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
174 <li><a href="/file/78e4ebad7cdf">browse</a></li>
176 <li><a href="/file/78e4ebad7cdf">browse</a></li>
175 </ul>
177 </ul>
176 <ul>
178 <ul>
177 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
179 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
178 <li><a href="/file/tip/a">latest</a></li>
180 <li><a href="/file/tip/a">latest</a></li>
179 <li class="active">diff</li>
181 <li class="active">diff</li>
180 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
182 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
181 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
183 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
182 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
184 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
183 </ul>
185 </ul>
184 <ul>
186 <ul>
185 <li><a href="/help">help</a></li>
187 <li><a href="/help">help</a></li>
186 </ul>
188 </ul>
187 </div>
189 </div>
188
190
189 <div class="main">
191 <div class="main">
190 <h2><a href="/">test</a></h2>
192 <h2><a href="/">test</a></h2>
191 <h3>diff a @ 1:78e4ebad7cdf</h3>
193 <h3>diff a @ 1:78e4ebad7cdf</h3>
192
194
193 <form class="search" action="/log">
195 <form class="search" action="/log">
194 <p></p>
196 <p></p>
195 <p><input name="rev" id="search1" type="text" size="30" /></p>
197 <p><input name="rev" id="search1" type="text" size="30" /></p>
196 <div id="hint">find changesets by author, revision,
198 <div id="hint">find changesets by author, revision,
197 files, or words in the commit message</div>
199 files, or words in the commit message</div>
198 </form>
200 </form>
199
201
200 <div class="description">b</div>
202 <div class="description">b</div>
201
203
202 <table id="changesetEntry">
204 <table id="changesetEntry">
203 <tr>
205 <tr>
204 <th>author</th>
206 <th>author</th>
205 <td>&#116;&#101;&#115;&#116;</td>
207 <td>&#116;&#101;&#115;&#116;</td>
206 </tr>
208 </tr>
207 <tr>
209 <tr>
208 <th>date</th>
210 <th>date</th>
209 <td>Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
211 <td>Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
210 </tr>
212 </tr>
211 <tr>
213 <tr>
212 <th>parents</th>
214 <th>parents</th>
213 <td></td>
215 <td></td>
214 </tr>
216 </tr>
215 <tr>
217 <tr>
216 <th>children</th>
218 <th>children</th>
217 <td></td>
219 <td></td>
218 </tr>
220 </tr>
219
221
220 </table>
222 </table>
221
223
222 <div class="overflow">
224 <div class="overflow">
223 <div class="sourcefirst"> line diff</div>
225 <div class="sourcefirst"> line diff</div>
224
226
225 <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
227 <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
226 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
228 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
227 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
229 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
228 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
230 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
229 </span></pre></div>
231 </span></pre></div>
230 </div>
232 </div>
231 </div>
233 </div>
232 </div>
234 </div>
233
235
234
236
235
237
236 </body>
238 </body>
237 </html>
239 </html>
238
240
239
241
240 set up hgweb with git diffs
242 set up hgweb with git diffs
241
243
242 $ "$TESTDIR/killdaemons.py"
244 $ "$TESTDIR/killdaemons.py"
243 $ hg serve --config 'diff.git=1' -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
245 $ hg serve --config 'diff.git=1' -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
244 $ cat hg.pid >> $DAEMON_PIDS
246 $ cat hg.pid >> $DAEMON_PIDS
245
247
246 revision
248 revision
247
249
248 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
250 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/0'
249 200 Script output follows
251 200 Script output follows
250
252
251 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
253 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
252 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
254 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
253 <head>
255 <head>
254 <link rel="icon" href="/static/hgicon.png" type="image/png" />
256 <link rel="icon" href="/static/hgicon.png" type="image/png" />
255 <meta name="robots" content="index, nofollow" />
257 <meta name="robots" content="index, nofollow" />
256 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
258 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
257
259
258 <title>test: 0cd96de13884</title>
260 <title>test: 0cd96de13884</title>
259 </head>
261 </head>
260 <body>
262 <body>
261 <div class="container">
263 <div class="container">
262 <div class="menu">
264 <div class="menu">
263 <div class="logo">
265 <div class="logo">
264 <a href="http://mercurial.selenic.com/">
266 <a href="http://mercurial.selenic.com/">
265 <img src="/static/hglogo.png" alt="mercurial" /></a>
267 <img src="/static/hglogo.png" alt="mercurial" /></a>
266 </div>
268 </div>
267 <ul>
269 <ul>
268 <li><a href="/shortlog/0cd96de13884">log</a></li>
270 <li><a href="/shortlog/0cd96de13884">log</a></li>
269 <li><a href="/graph/0cd96de13884">graph</a></li>
271 <li><a href="/graph/0cd96de13884">graph</a></li>
270 <li><a href="/tags">tags</a></li>
272 <li><a href="/tags">tags</a></li>
273 <li><a href="/bookmarks">bookmarks</a></li>
271 <li><a href="/branches">branches</a></li>
274 <li><a href="/branches">branches</a></li>
272 </ul>
275 </ul>
273 <ul>
276 <ul>
274 <li class="active">changeset</li>
277 <li class="active">changeset</li>
275 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
278 <li><a href="/raw-rev/0cd96de13884">raw</a></li>
276 <li><a href="/file/0cd96de13884">browse</a></li>
279 <li><a href="/file/0cd96de13884">browse</a></li>
277 </ul>
280 </ul>
278 <ul>
281 <ul>
279
282
280 </ul>
283 </ul>
281 <ul>
284 <ul>
282 <li><a href="/help">help</a></li>
285 <li><a href="/help">help</a></li>
283 </ul>
286 </ul>
284 </div>
287 </div>
285
288
286 <div class="main">
289 <div class="main">
287
290
288 <h2><a href="/">test</a></h2>
291 <h2><a href="/">test</a></h2>
289 <h3>changeset 0:0cd96de13884 </h3>
292 <h3>changeset 0:0cd96de13884 </h3>
290
293
291 <form class="search" action="/log">
294 <form class="search" action="/log">
292
295
293 <p><input name="rev" id="search1" type="text" size="30" /></p>
296 <p><input name="rev" id="search1" type="text" size="30" /></p>
294 <div id="hint">find changesets by author, revision,
297 <div id="hint">find changesets by author, revision,
295 files, or words in the commit message</div>
298 files, or words in the commit message</div>
296 </form>
299 </form>
297
300
298 <div class="description">a</div>
301 <div class="description">a</div>
299
302
300 <table id="changesetEntry">
303 <table id="changesetEntry">
301 <tr>
304 <tr>
302 <th class="author">author</th>
305 <th class="author">author</th>
303 <td class="author">&#116;&#101;&#115;&#116;</td>
306 <td class="author">&#116;&#101;&#115;&#116;</td>
304 </tr>
307 </tr>
305 <tr>
308 <tr>
306 <th class="date">date</th>
309 <th class="date">date</th>
307 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
310 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
308 <tr>
311 <tr>
309 <th class="author">parents</th>
312 <th class="author">parents</th>
310 <td class="author"></td>
313 <td class="author"></td>
311 </tr>
314 </tr>
312 <tr>
315 <tr>
313 <th class="author">children</th>
316 <th class="author">children</th>
314 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
317 <td class="author"> <a href="/rev/78e4ebad7cdf">78e4ebad7cdf</a></td>
315 </tr>
318 </tr>
316 <tr>
319 <tr>
317 <th class="files">files</th>
320 <th class="files">files</th>
318 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
321 <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
319 </tr>
322 </tr>
320 </table>
323 </table>
321
324
322 <div class="overflow">
325 <div class="overflow">
323 <div class="sourcefirst"> line diff</div>
326 <div class="sourcefirst"> line diff</div>
324
327
325 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100644
328 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100644
326 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
329 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
327 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
330 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
328 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
331 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
329 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
332 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
330 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> new file mode 100644
333 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> new file mode 100644
331 <a href="#l2.2" id="l2.2"> 2.2</a> <span class="minusline">--- /dev/null
334 <a href="#l2.2" id="l2.2"> 2.2</a> <span class="minusline">--- /dev/null
332 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="plusline">+++ b/b
335 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="plusline">+++ b/b
333 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="atline">@@ -0,0 +1,1 @@
336 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="atline">@@ -0,0 +1,1 @@
334 </span><a href="#l2.5" id="l2.5"> 2.5</a> <span class="plusline">+b
337 </span><a href="#l2.5" id="l2.5"> 2.5</a> <span class="plusline">+b
335 </span></pre></div>
338 </span></pre></div>
336 </div>
339 </div>
337
340
338 </div>
341 </div>
339 </div>
342 </div>
340
343
341
344
342 </body>
345 </body>
343 </html>
346 </html>
344
347
345
348
346 revision
349 revision
347
350
348 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/raw-rev/0'
351 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/raw-rev/0'
349 200 Script output follows
352 200 Script output follows
350
353
351
354
352 # HG changeset patch
355 # HG changeset patch
353 # User test
356 # User test
354 # Date 0 0
357 # Date 0 0
355 # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
358 # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
356
359
357 a
360 a
358
361
359 diff --git a/a b/a
362 diff --git a/a b/a
360 new file mode 100644
363 new file mode 100644
361 --- /dev/null
364 --- /dev/null
362 +++ b/a
365 +++ b/a
363 @@ -0,0 +1,1 @@
366 @@ -0,0 +1,1 @@
364 +a
367 +a
365 diff --git a/b b/b
368 diff --git a/b b/b
366 new file mode 100644
369 new file mode 100644
367 --- /dev/null
370 --- /dev/null
368 +++ b/b
371 +++ b/b
369 @@ -0,0 +1,1 @@
372 @@ -0,0 +1,1 @@
370 +b
373 +b
371
374
372
375
373 diff removed file
376 diff removed file
374
377
375 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
378 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
376 200 Script output follows
379 200 Script output follows
377
380
378 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
381 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
379 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
382 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
380 <head>
383 <head>
381 <link rel="icon" href="/static/hgicon.png" type="image/png" />
384 <link rel="icon" href="/static/hgicon.png" type="image/png" />
382 <meta name="robots" content="index, nofollow" />
385 <meta name="robots" content="index, nofollow" />
383 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
386 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
384
387
385 <title>test: a diff</title>
388 <title>test: a diff</title>
386 </head>
389 </head>
387 <body>
390 <body>
388
391
389 <div class="container">
392 <div class="container">
390 <div class="menu">
393 <div class="menu">
391 <div class="logo">
394 <div class="logo">
392 <a href="http://mercurial.selenic.com/">
395 <a href="http://mercurial.selenic.com/">
393 <img src="/static/hglogo.png" alt="mercurial" /></a>
396 <img src="/static/hglogo.png" alt="mercurial" /></a>
394 </div>
397 </div>
395 <ul>
398 <ul>
396 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
399 <li><a href="/shortlog/78e4ebad7cdf">log</a></li>
397 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
400 <li><a href="/graph/78e4ebad7cdf">graph</a></li>
398 <li><a href="/tags">tags</a></li>
401 <li><a href="/tags">tags</a></li>
402 <li><a href="/bookmarks">bookmarks</a></li>
399 <li><a href="/branches">branches</a></li>
403 <li><a href="/branches">branches</a></li>
400 </ul>
404 </ul>
401 <ul>
405 <ul>
402 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
406 <li><a href="/rev/78e4ebad7cdf">changeset</a></li>
403 <li><a href="/file/78e4ebad7cdf">browse</a></li>
407 <li><a href="/file/78e4ebad7cdf">browse</a></li>
404 </ul>
408 </ul>
405 <ul>
409 <ul>
406 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
410 <li><a href="/file/78e4ebad7cdf/a">file</a></li>
407 <li><a href="/file/tip/a">latest</a></li>
411 <li><a href="/file/tip/a">latest</a></li>
408 <li class="active">diff</li>
412 <li class="active">diff</li>
409 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
413 <li><a href="/annotate/78e4ebad7cdf/a">annotate</a></li>
410 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
414 <li><a href="/log/78e4ebad7cdf/a">file log</a></li>
411 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
415 <li><a href="/raw-file/78e4ebad7cdf/a">raw</a></li>
412 </ul>
416 </ul>
413 <ul>
417 <ul>
414 <li><a href="/help">help</a></li>
418 <li><a href="/help">help</a></li>
415 </ul>
419 </ul>
416 </div>
420 </div>
417
421
418 <div class="main">
422 <div class="main">
419 <h2><a href="/">test</a></h2>
423 <h2><a href="/">test</a></h2>
420 <h3>diff a @ 1:78e4ebad7cdf</h3>
424 <h3>diff a @ 1:78e4ebad7cdf</h3>
421
425
422 <form class="search" action="/log">
426 <form class="search" action="/log">
423 <p></p>
427 <p></p>
424 <p><input name="rev" id="search1" type="text" size="30" /></p>
428 <p><input name="rev" id="search1" type="text" size="30" /></p>
425 <div id="hint">find changesets by author, revision,
429 <div id="hint">find changesets by author, revision,
426 files, or words in the commit message</div>
430 files, or words in the commit message</div>
427 </form>
431 </form>
428
432
429 <div class="description">b</div>
433 <div class="description">b</div>
430
434
431 <table id="changesetEntry">
435 <table id="changesetEntry">
432 <tr>
436 <tr>
433 <th>author</th>
437 <th>author</th>
434 <td>&#116;&#101;&#115;&#116;</td>
438 <td>&#116;&#101;&#115;&#116;</td>
435 </tr>
439 </tr>
436 <tr>
440 <tr>
437 <th>date</th>
441 <th>date</th>
438 <td>Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
442 <td>Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
439 </tr>
443 </tr>
440 <tr>
444 <tr>
441 <th>parents</th>
445 <th>parents</th>
442 <td></td>
446 <td></td>
443 </tr>
447 </tr>
444 <tr>
448 <tr>
445 <th>children</th>
449 <th>children</th>
446 <td></td>
450 <td></td>
447 </tr>
451 </tr>
448
452
449 </table>
453 </table>
450
454
451 <div class="overflow">
455 <div class="overflow">
452 <div class="sourcefirst"> line diff</div>
456 <div class="sourcefirst"> line diff</div>
453
457
454 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100755
458 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100755
455 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
459 <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
456 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
460 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
457 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
461 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
458 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
462 </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
459 </span></pre></div>
463 </span></pre></div>
460 </div>
464 </div>
461 </div>
465 </div>
462 </div>
466 </div>
463
467
464
468
465
469
466 </body>
470 </body>
467 </html>
471 </html>
468
472
469 $ cd ..
473 $ cd ..
470
474
471 test import rev as raw-rev
475 test import rev as raw-rev
472
476
473 $ hg clone -r0 test test1
477 $ hg clone -r0 test test1
474 adding changesets
478 adding changesets
475 adding manifests
479 adding manifests
476 adding file changes
480 adding file changes
477 added 1 changesets with 2 changes to 2 files
481 added 1 changesets with 2 changes to 2 files
478 updating to branch default
482 updating to branch default
479 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
483 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
480 $ cd test1
484 $ cd test1
481 $ hg import -q --exact http://localhost:$HGPORT/rev/1
485 $ hg import -q --exact http://localhost:$HGPORT/rev/1
482
486
483 errors
487 errors
484
488
485 $ cat ../test/errors.log
489 $ cat ../test/errors.log
@@ -1,394 +1,398 b''
1 Some tests for hgweb in an empty repository
1 Some tests for hgweb in an empty repository
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
5 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
6 $ cat hg.pid >> $DAEMON_PIDS
6 $ cat hg.pid >> $DAEMON_PIDS
7 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/shortlog')
7 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/shortlog')
8 200 Script output follows
8 200 Script output follows
9
9
10 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
10 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
11 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
11 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
12 <head>
12 <head>
13 <link rel="icon" href="/static/hgicon.png" type="image/png" />
13 <link rel="icon" href="/static/hgicon.png" type="image/png" />
14 <meta name="robots" content="index, nofollow" />
14 <meta name="robots" content="index, nofollow" />
15 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
15 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
16
16
17 <title>test: log</title>
17 <title>test: log</title>
18 <link rel="alternate" type="application/atom+xml"
18 <link rel="alternate" type="application/atom+xml"
19 href="/atom-log" title="Atom feed for test" />
19 href="/atom-log" title="Atom feed for test" />
20 <link rel="alternate" type="application/rss+xml"
20 <link rel="alternate" type="application/rss+xml"
21 href="/rss-log" title="RSS feed for test" />
21 href="/rss-log" title="RSS feed for test" />
22 </head>
22 </head>
23 <body>
23 <body>
24
24
25 <div class="container">
25 <div class="container">
26 <div class="menu">
26 <div class="menu">
27 <div class="logo">
27 <div class="logo">
28 <a href="http://mercurial.selenic.com/">
28 <a href="http://mercurial.selenic.com/">
29 <img src="/static/hglogo.png" alt="mercurial" /></a>
29 <img src="/static/hglogo.png" alt="mercurial" /></a>
30 </div>
30 </div>
31 <ul>
31 <ul>
32 <li class="active">log</li>
32 <li class="active">log</li>
33 <li><a href="/graph/000000000000">graph</a></li>
33 <li><a href="/graph/000000000000">graph</a></li>
34 <li><a href="/tags">tags</a></li>
34 <li><a href="/tags">tags</a></li>
35 <li><a href="/bookmarks">bookmarks</a></li>
35 <li><a href="/branches">branches</a></li>
36 <li><a href="/branches">branches</a></li>
36 </ul>
37 </ul>
37 <ul>
38 <ul>
38 <li><a href="/rev/000000000000">changeset</a></li>
39 <li><a href="/rev/000000000000">changeset</a></li>
39 <li><a href="/file/000000000000">browse</a></li>
40 <li><a href="/file/000000000000">browse</a></li>
40 </ul>
41 </ul>
41 <ul>
42 <ul>
42
43
43 </ul>
44 </ul>
44 <ul>
45 <ul>
45 <li><a href="/help">help</a></li>
46 <li><a href="/help">help</a></li>
46 </ul>
47 </ul>
47 </div>
48 </div>
48
49
49 <div class="main">
50 <div class="main">
50 <h2><a href="/">test</a></h2>
51 <h2><a href="/">test</a></h2>
51 <h3>log</h3>
52 <h3>log</h3>
52
53
53 <form class="search" action="/log">
54 <form class="search" action="/log">
54
55
55 <p><input name="rev" id="search1" type="text" size="30" /></p>
56 <p><input name="rev" id="search1" type="text" size="30" /></p>
56 <div id="hint">find changesets by author, revision,
57 <div id="hint">find changesets by author, revision,
57 files, or words in the commit message</div>
58 files, or words in the commit message</div>
58 </form>
59 </form>
59
60
60 <div class="navigate">
61 <div class="navigate">
61 <a href="/shortlog/-1?revcount=30">less</a>
62 <a href="/shortlog/-1?revcount=30">less</a>
62 <a href="/shortlog/-1?revcount=120">more</a>
63 <a href="/shortlog/-1?revcount=120">more</a>
63 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
64 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
64 </div>
65 </div>
65
66
66 <table class="bigtable">
67 <table class="bigtable">
67 <tr>
68 <tr>
68 <th class="age">age</th>
69 <th class="age">age</th>
69 <th class="author">author</th>
70 <th class="author">author</th>
70 <th class="description">description</th>
71 <th class="description">description</th>
71 </tr>
72 </tr>
72
73
73 </table>
74 </table>
74
75
75 <div class="navigate">
76 <div class="navigate">
76 <a href="/shortlog/-1?revcount=30">less</a>
77 <a href="/shortlog/-1?revcount=30">less</a>
77 <a href="/shortlog/-1?revcount=120">more</a>
78 <a href="/shortlog/-1?revcount=120">more</a>
78 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
79 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
79 </div>
80 </div>
80
81
81 </div>
82 </div>
82 </div>
83 </div>
83
84
84
85
85
86
86 </body>
87 </body>
87 </html>
88 </html>
88
89
89 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log')
90 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log')
90 200 Script output follows
91 200 Script output follows
91
92
92 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
93 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
93 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
94 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
94 <head>
95 <head>
95 <link rel="icon" href="/static/hgicon.png" type="image/png" />
96 <link rel="icon" href="/static/hgicon.png" type="image/png" />
96 <meta name="robots" content="index, nofollow" />
97 <meta name="robots" content="index, nofollow" />
97 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
98 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
98
99
99 <title>test: log</title>
100 <title>test: log</title>
100 <link rel="alternate" type="application/atom+xml"
101 <link rel="alternate" type="application/atom+xml"
101 href="/atom-log" title="Atom feed for test" />
102 href="/atom-log" title="Atom feed for test" />
102 <link rel="alternate" type="application/rss+xml"
103 <link rel="alternate" type="application/rss+xml"
103 href="/rss-log" title="RSS feed for test" />
104 href="/rss-log" title="RSS feed for test" />
104 </head>
105 </head>
105 <body>
106 <body>
106
107
107 <div class="container">
108 <div class="container">
108 <div class="menu">
109 <div class="menu">
109 <div class="logo">
110 <div class="logo">
110 <a href="http://mercurial.selenic.com/">
111 <a href="http://mercurial.selenic.com/">
111 <img src="/static/hglogo.png" alt="mercurial" /></a>
112 <img src="/static/hglogo.png" alt="mercurial" /></a>
112 </div>
113 </div>
113 <ul>
114 <ul>
114 <li class="active">log</li>
115 <li class="active">log</li>
115 <li><a href="/graph/000000000000">graph</a></li>
116 <li><a href="/graph/000000000000">graph</a></li>
116 <li><a href="/tags">tags</a></li>
117 <li><a href="/tags">tags</a></li>
118 <li><a href="/bookmarks">bookmarks</a></li>
117 <li><a href="/branches">branches</a></li>
119 <li><a href="/branches">branches</a></li>
118 </ul>
120 </ul>
119 <ul>
121 <ul>
120 <li><a href="/rev/000000000000">changeset</a></li>
122 <li><a href="/rev/000000000000">changeset</a></li>
121 <li><a href="/file/000000000000">browse</a></li>
123 <li><a href="/file/000000000000">browse</a></li>
122 </ul>
124 </ul>
123 <ul>
125 <ul>
124
126
125 </ul>
127 </ul>
126 <ul>
128 <ul>
127 <li><a href="/help">help</a></li>
129 <li><a href="/help">help</a></li>
128 </ul>
130 </ul>
129 </div>
131 </div>
130
132
131 <div class="main">
133 <div class="main">
132 <h2><a href="/">test</a></h2>
134 <h2><a href="/">test</a></h2>
133 <h3>log</h3>
135 <h3>log</h3>
134
136
135 <form class="search" action="/log">
137 <form class="search" action="/log">
136
138
137 <p><input name="rev" id="search1" type="text" size="30" /></p>
139 <p><input name="rev" id="search1" type="text" size="30" /></p>
138 <div id="hint">find changesets by author, revision,
140 <div id="hint">find changesets by author, revision,
139 files, or words in the commit message</div>
141 files, or words in the commit message</div>
140 </form>
142 </form>
141
143
142 <div class="navigate">
144 <div class="navigate">
143 <a href="/shortlog/-1?revcount=5">less</a>
145 <a href="/shortlog/-1?revcount=5">less</a>
144 <a href="/shortlog/-1?revcount=20">more</a>
146 <a href="/shortlog/-1?revcount=20">more</a>
145 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
147 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
146 </div>
148 </div>
147
149
148 <table class="bigtable">
150 <table class="bigtable">
149 <tr>
151 <tr>
150 <th class="age">age</th>
152 <th class="age">age</th>
151 <th class="author">author</th>
153 <th class="author">author</th>
152 <th class="description">description</th>
154 <th class="description">description</th>
153 </tr>
155 </tr>
154
156
155 </table>
157 </table>
156
158
157 <div class="navigate">
159 <div class="navigate">
158 <a href="/shortlog/-1?revcount=5">less</a>
160 <a href="/shortlog/-1?revcount=5">less</a>
159 <a href="/shortlog/-1?revcount=20">more</a>
161 <a href="/shortlog/-1?revcount=20">more</a>
160 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
162 | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
161 </div>
163 </div>
162
164
163 </div>
165 </div>
164 </div>
166 </div>
165
167
166
168
167
169
168 </body>
170 </body>
169 </html>
171 </html>
170
172
171 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/graph')
173 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/graph')
172 200 Script output follows
174 200 Script output follows
173
175
174 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
176 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
175 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
177 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
176 <head>
178 <head>
177 <link rel="icon" href="/static/hgicon.png" type="image/png" />
179 <link rel="icon" href="/static/hgicon.png" type="image/png" />
178 <meta name="robots" content="index, nofollow" />
180 <meta name="robots" content="index, nofollow" />
179 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
181 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
180
182
181 <title>test: revision graph</title>
183 <title>test: revision graph</title>
182 <link rel="alternate" type="application/atom+xml"
184 <link rel="alternate" type="application/atom+xml"
183 href="/atom-log" title="Atom feed for test: log" />
185 href="/atom-log" title="Atom feed for test: log" />
184 <link rel="alternate" type="application/rss+xml"
186 <link rel="alternate" type="application/rss+xml"
185 href="/rss-log" title="RSS feed for test: log" />
187 href="/rss-log" title="RSS feed for test: log" />
186 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
188 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
187 </head>
189 </head>
188 <body>
190 <body>
189
191
190 <div class="container">
192 <div class="container">
191 <div class="menu">
193 <div class="menu">
192 <div class="logo">
194 <div class="logo">
193 <a href="http://mercurial.selenic.com/">
195 <a href="http://mercurial.selenic.com/">
194 <img src="/static/hglogo.png" alt="mercurial" /></a>
196 <img src="/static/hglogo.png" alt="mercurial" /></a>
195 </div>
197 </div>
196 <ul>
198 <ul>
197 <li><a href="/shortlog/000000000000">log</a></li>
199 <li><a href="/shortlog/000000000000">log</a></li>
198 <li class="active">graph</li>
200 <li class="active">graph</li>
199 <li><a href="/tags">tags</a></li>
201 <li><a href="/tags">tags</a></li>
202 <li><a href="/bookmarks">bookmarks</a></li>
200 <li><a href="/branches">branches</a></li>
203 <li><a href="/branches">branches</a></li>
201 </ul>
204 </ul>
202 <ul>
205 <ul>
203 <li><a href="/rev/000000000000">changeset</a></li>
206 <li><a href="/rev/000000000000">changeset</a></li>
204 <li><a href="/file/000000000000">browse</a></li>
207 <li><a href="/file/000000000000">browse</a></li>
205 </ul>
208 </ul>
206 <ul>
209 <ul>
207 <li><a href="/help">help</a></li>
210 <li><a href="/help">help</a></li>
208 </ul>
211 </ul>
209 </div>
212 </div>
210
213
211 <div class="main">
214 <div class="main">
212 <h2><a href="/">test</a></h2>
215 <h2><a href="/">test</a></h2>
213 <h3>graph</h3>
216 <h3>graph</h3>
214
217
215 <form class="search" action="/log">
218 <form class="search" action="/log">
216
219
217 <p><input name="rev" id="search1" type="text" size="30" /></p>
220 <p><input name="rev" id="search1" type="text" size="30" /></p>
218 <div id="hint">find changesets by author, revision,
221 <div id="hint">find changesets by author, revision,
219 files, or words in the commit message</div>
222 files, or words in the commit message</div>
220 </form>
223 </form>
221
224
222 <div class="navigate">
225 <div class="navigate">
223 <a href="/graph/-1?revcount=30">less</a>
226 <a href="/graph/-1?revcount=30">less</a>
224 <a href="/graph/-1?revcount=120">more</a>
227 <a href="/graph/-1?revcount=120">more</a>
225 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
228 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
226 </div>
229 </div>
227
230
228 <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
231 <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
229
232
230 <div id="wrapper">
233 <div id="wrapper">
231 <ul id="nodebgs"></ul>
234 <ul id="nodebgs"></ul>
232 <canvas id="graph" width="224" height="12"></canvas>
235 <canvas id="graph" width="224" height="12"></canvas>
233 <ul id="graphnodes"></ul>
236 <ul id="graphnodes"></ul>
234 </div>
237 </div>
235
238
236 <script type="text/javascript" src="/static/graph.js"></script>
239 <script type="text/javascript" src="/static/graph.js"></script>
237 <script type="text/javascript">
240 <script type="text/javascript">
238 <!-- hide script content
241 <!-- hide script content
239
242
240 var data = [];
243 var data = [];
241 var graph = new Graph();
244 var graph = new Graph();
242 graph.scale(39);
245 graph.scale(39);
243
246
244 graph.edge = function(x0, y0, x1, y1, color) {
247 graph.edge = function(x0, y0, x1, y1, color) {
245
248
246 this.setColor(color, 0.0, 0.65);
249 this.setColor(color, 0.0, 0.65);
247 this.ctx.beginPath();
250 this.ctx.beginPath();
248 this.ctx.moveTo(x0, y0);
251 this.ctx.moveTo(x0, y0);
249 this.ctx.lineTo(x1, y1);
252 this.ctx.lineTo(x1, y1);
250 this.ctx.stroke();
253 this.ctx.stroke();
251
254
252 }
255 }
253
256
254 var revlink = '<li style="_STYLE"><span class="desc">';
257 var revlink = '<li style="_STYLE"><span class="desc">';
255 revlink += '<a href="/rev/_NODEID" title="_NODEID">_DESC</a>';
258 revlink += '<a href="/rev/_NODEID" title="_NODEID">_DESC</a>';
256 revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
259 revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
257
260
258 graph.vertex = function(x, y, color, parity, cur) {
261 graph.vertex = function(x, y, color, parity, cur) {
259
262
260 this.ctx.beginPath();
263 this.ctx.beginPath();
261 color = this.setColor(color, 0.25, 0.75);
264 color = this.setColor(color, 0.25, 0.75);
262 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
265 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
263 this.ctx.fill();
266 this.ctx.fill();
264
267
265 var bg = '<li class="bg parity' + parity + '"></li>';
268 var bg = '<li class="bg parity' + parity + '"></li>';
266 var left = (this.columns + 1) * this.bg_height;
269 var left = (this.columns + 1) * this.bg_height;
267 var nstyle = 'padding-left: ' + left + 'px;';
270 var nstyle = 'padding-left: ' + left + 'px;';
268 var item = revlink.replace(/_STYLE/, nstyle);
271 var item = revlink.replace(/_STYLE/, nstyle);
269 item = item.replace(/_PARITY/, 'parity' + parity);
272 item = item.replace(/_PARITY/, 'parity' + parity);
270 item = item.replace(/_NODEID/, cur[0]);
273 item = item.replace(/_NODEID/, cur[0]);
271 item = item.replace(/_NODEID/, cur[0]);
274 item = item.replace(/_NODEID/, cur[0]);
272 item = item.replace(/_DESC/, cur[3]);
275 item = item.replace(/_DESC/, cur[3]);
273 item = item.replace(/_USER/, cur[4]);
276 item = item.replace(/_USER/, cur[4]);
274 item = item.replace(/_DATE/, cur[5]);
277 item = item.replace(/_DATE/, cur[5]);
275
278
276 var tagspan = '';
279 var tagspan = '';
277 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
280 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
278 tagspan = '<span class="logtags">';
281 tagspan = '<span class="logtags">';
279 if (cur[6][1]) {
282 if (cur[6][1]) {
280 tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
283 tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
281 tagspan += cur[6][0] + '</span> ';
284 tagspan += cur[6][0] + '</span> ';
282 } else if (!cur[6][1] && cur[6][0] != 'default') {
285 } else if (!cur[6][1] && cur[6][0] != 'default') {
283 tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
286 tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
284 tagspan += cur[6][0] + '</span> ';
287 tagspan += cur[6][0] + '</span> ';
285 }
288 }
286 if (cur[7].length) {
289 if (cur[7].length) {
287 for (var t in cur[7]) {
290 for (var t in cur[7]) {
288 var tag = cur[7][t];
291 var tag = cur[7][t];
289 tagspan += '<span class="tag">' + tag + '</span> ';
292 tagspan += '<span class="tag">' + tag + '</span> ';
290 }
293 }
291 }
294 }
292 if (cur[8].length) {
295 if (cur[8].length) {
293 for (var b in cur[8]) {
296 for (var b in cur[8]) {
294 var bookmark = cur[8][b];
297 var bookmark = cur[8][b];
295 tagspan += '<span class="tag">' + bookmark + '</span> ';
298 tagspan += '<span class="tag">' + bookmark + '</span> ';
296 }
299 }
297 }
300 }
298 tagspan += '</span>';
301 tagspan += '</span>';
299 }
302 }
300
303
301 item = item.replace(/_TAGS/, tagspan);
304 item = item.replace(/_TAGS/, tagspan);
302 return [bg, item];
305 return [bg, item];
303
306
304 }
307 }
305
308
306 graph.render(data);
309 graph.render(data);
307
310
308 // stop hiding script -->
311 // stop hiding script -->
309 </script>
312 </script>
310
313
311 <div class="navigate">
314 <div class="navigate">
312 <a href="/graph/-1?revcount=30">less</a>
315 <a href="/graph/-1?revcount=30">less</a>
313 <a href="/graph/-1?revcount=120">more</a>
316 <a href="/graph/-1?revcount=120">more</a>
314 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
317 | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
315 </div>
318 </div>
316
319
317 </div>
320 </div>
318 </div>
321 </div>
319
322
320
323
321
324
322 </body>
325 </body>
323 </html>
326 </html>
324
327
325 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file')
328 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file')
326 200 Script output follows
329 200 Script output follows
327
330
328 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
331 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
329 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
332 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
330 <head>
333 <head>
331 <link rel="icon" href="/static/hgicon.png" type="image/png" />
334 <link rel="icon" href="/static/hgicon.png" type="image/png" />
332 <meta name="robots" content="index, nofollow" />
335 <meta name="robots" content="index, nofollow" />
333 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
336 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
334
337
335 <title>test: 000000000000 /</title>
338 <title>test: 000000000000 /</title>
336 </head>
339 </head>
337 <body>
340 <body>
338
341
339 <div class="container">
342 <div class="container">
340 <div class="menu">
343 <div class="menu">
341 <div class="logo">
344 <div class="logo">
342 <a href="http://mercurial.selenic.com/">
345 <a href="http://mercurial.selenic.com/">
343 <img src="/static/hglogo.png" alt="mercurial" /></a>
346 <img src="/static/hglogo.png" alt="mercurial" /></a>
344 </div>
347 </div>
345 <ul>
348 <ul>
346 <li><a href="/shortlog/000000000000">log</a></li>
349 <li><a href="/shortlog/000000000000">log</a></li>
347 <li><a href="/graph/000000000000">graph</a></li>
350 <li><a href="/graph/000000000000">graph</a></li>
348 <li><a href="/tags">tags</a></li>
351 <li><a href="/tags">tags</a></li>
352 <li><a href="/bookmarks">bookmarks</a></li>
349 <li><a href="/branches">branches</a></li>
353 <li><a href="/branches">branches</a></li>
350 </ul>
354 </ul>
351 <ul>
355 <ul>
352 <li><a href="/rev/000000000000">changeset</a></li>
356 <li><a href="/rev/000000000000">changeset</a></li>
353 <li class="active">browse</li>
357 <li class="active">browse</li>
354 </ul>
358 </ul>
355 <ul>
359 <ul>
356
360
357 </ul>
361 </ul>
358 <ul>
362 <ul>
359 <li><a href="/help">help</a></li>
363 <li><a href="/help">help</a></li>
360 </ul>
364 </ul>
361 </div>
365 </div>
362
366
363 <div class="main">
367 <div class="main">
364 <h2><a href="/">test</a></h2>
368 <h2><a href="/">test</a></h2>
365 <h3>directory / @ -1:000000000000 <span class="tag">tip</span> </h3>
369 <h3>directory / @ -1:000000000000 <span class="tag">tip</span> </h3>
366
370
367 <form class="search" action="/log">
371 <form class="search" action="/log">
368
372
369 <p><input name="rev" id="search1" type="text" size="30" /></p>
373 <p><input name="rev" id="search1" type="text" size="30" /></p>
370 <div id="hint">find changesets by author, revision,
374 <div id="hint">find changesets by author, revision,
371 files, or words in the commit message</div>
375 files, or words in the commit message</div>
372 </form>
376 </form>
373
377
374 <table class="bigtable">
378 <table class="bigtable">
375 <tr>
379 <tr>
376 <th class="name">name</th>
380 <th class="name">name</th>
377 <th class="size">size</th>
381 <th class="size">size</th>
378 <th class="permissions">permissions</th>
382 <th class="permissions">permissions</th>
379 </tr>
383 </tr>
380 <tr class="fileline parity0">
384 <tr class="fileline parity0">
381 <td class="name"><a href="/file/000000000000/">[up]</a></td>
385 <td class="name"><a href="/file/000000000000/">[up]</a></td>
382 <td class="size"></td>
386 <td class="size"></td>
383 <td class="permissions">drwxr-xr-x</td>
387 <td class="permissions">drwxr-xr-x</td>
384 </tr>
388 </tr>
385
389
386
390
387 </table>
391 </table>
388 </div>
392 </div>
389 </div>
393 </div>
390
394
391
395
392 </body>
396 </body>
393 </html>
397 </html>
394
398
@@ -1,739 +1,744 b''
1
1
2 $ hg init test
2 $ hg init test
3 $ cd test
3 $ cd test
4 $ echo b > b
4 $ echo b > b
5 $ hg ci -Am "b"
5 $ hg ci -Am "b"
6 adding b
6 adding b
7 $ echo a > a
7 $ echo a > a
8 $ hg ci -Am "first a"
8 $ hg ci -Am "first a"
9 adding a
9 adding a
10 $ hg rm a
10 $ hg rm a
11 $ hg ci -m "del a"
11 $ hg ci -m "del a"
12 $ echo b > a
12 $ echo b > a
13 $ hg ci -Am "second a"
13 $ hg ci -Am "second a"
14 adding a
14 adding a
15 $ hg rm a
15 $ hg rm a
16 $ hg ci -m "del2 a"
16 $ hg ci -m "del2 a"
17 $ hg mv b c
17 $ hg mv b c
18 $ hg ci -m "mv b"
18 $ hg ci -m "mv b"
19 $ echo c >> c
19 $ echo c >> c
20 $ hg ci -m "change c"
20 $ hg ci -m "change c"
21 $ hg log -p
21 $ hg log -p
22 changeset: 6:b7682196df1c
22 changeset: 6:b7682196df1c
23 tag: tip
23 tag: tip
24 user: test
24 user: test
25 date: Thu Jan 01 00:00:00 1970 +0000
25 date: Thu Jan 01 00:00:00 1970 +0000
26 summary: change c
26 summary: change c
27
27
28 diff -r 1a6696706df2 -r b7682196df1c c
28 diff -r 1a6696706df2 -r b7682196df1c c
29 --- a/c Thu Jan 01 00:00:00 1970 +0000
29 --- a/c Thu Jan 01 00:00:00 1970 +0000
30 +++ b/c Thu Jan 01 00:00:00 1970 +0000
30 +++ b/c Thu Jan 01 00:00:00 1970 +0000
31 @@ -1,1 +1,2 @@
31 @@ -1,1 +1,2 @@
32 b
32 b
33 +c
33 +c
34
34
35 changeset: 5:1a6696706df2
35 changeset: 5:1a6696706df2
36 user: test
36 user: test
37 date: Thu Jan 01 00:00:00 1970 +0000
37 date: Thu Jan 01 00:00:00 1970 +0000
38 summary: mv b
38 summary: mv b
39
39
40 diff -r 52e848cdcd88 -r 1a6696706df2 b
40 diff -r 52e848cdcd88 -r 1a6696706df2 b
41 --- a/b Thu Jan 01 00:00:00 1970 +0000
41 --- a/b Thu Jan 01 00:00:00 1970 +0000
42 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
42 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
43 @@ -1,1 +0,0 @@
43 @@ -1,1 +0,0 @@
44 -b
44 -b
45 diff -r 52e848cdcd88 -r 1a6696706df2 c
45 diff -r 52e848cdcd88 -r 1a6696706df2 c
46 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
46 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
47 +++ b/c Thu Jan 01 00:00:00 1970 +0000
47 +++ b/c Thu Jan 01 00:00:00 1970 +0000
48 @@ -0,0 +1,1 @@
48 @@ -0,0 +1,1 @@
49 +b
49 +b
50
50
51 changeset: 4:52e848cdcd88
51 changeset: 4:52e848cdcd88
52 user: test
52 user: test
53 date: Thu Jan 01 00:00:00 1970 +0000
53 date: Thu Jan 01 00:00:00 1970 +0000
54 summary: del2 a
54 summary: del2 a
55
55
56 diff -r 01de2d66a28d -r 52e848cdcd88 a
56 diff -r 01de2d66a28d -r 52e848cdcd88 a
57 --- a/a Thu Jan 01 00:00:00 1970 +0000
57 --- a/a Thu Jan 01 00:00:00 1970 +0000
58 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
58 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
59 @@ -1,1 +0,0 @@
59 @@ -1,1 +0,0 @@
60 -b
60 -b
61
61
62 changeset: 3:01de2d66a28d
62 changeset: 3:01de2d66a28d
63 user: test
63 user: test
64 date: Thu Jan 01 00:00:00 1970 +0000
64 date: Thu Jan 01 00:00:00 1970 +0000
65 summary: second a
65 summary: second a
66
66
67 diff -r be3ebcc91739 -r 01de2d66a28d a
67 diff -r be3ebcc91739 -r 01de2d66a28d a
68 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
68 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
69 +++ b/a Thu Jan 01 00:00:00 1970 +0000
69 +++ b/a Thu Jan 01 00:00:00 1970 +0000
70 @@ -0,0 +1,1 @@
70 @@ -0,0 +1,1 @@
71 +b
71 +b
72
72
73 changeset: 2:be3ebcc91739
73 changeset: 2:be3ebcc91739
74 user: test
74 user: test
75 date: Thu Jan 01 00:00:00 1970 +0000
75 date: Thu Jan 01 00:00:00 1970 +0000
76 summary: del a
76 summary: del a
77
77
78 diff -r 5ed941583260 -r be3ebcc91739 a
78 diff -r 5ed941583260 -r be3ebcc91739 a
79 --- a/a Thu Jan 01 00:00:00 1970 +0000
79 --- a/a Thu Jan 01 00:00:00 1970 +0000
80 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
80 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
81 @@ -1,1 +0,0 @@
81 @@ -1,1 +0,0 @@
82 -a
82 -a
83
83
84 changeset: 1:5ed941583260
84 changeset: 1:5ed941583260
85 user: test
85 user: test
86 date: Thu Jan 01 00:00:00 1970 +0000
86 date: Thu Jan 01 00:00:00 1970 +0000
87 summary: first a
87 summary: first a
88
88
89 diff -r 6563da9dcf87 -r 5ed941583260 a
89 diff -r 6563da9dcf87 -r 5ed941583260 a
90 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
90 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
91 +++ b/a Thu Jan 01 00:00:00 1970 +0000
91 +++ b/a Thu Jan 01 00:00:00 1970 +0000
92 @@ -0,0 +1,1 @@
92 @@ -0,0 +1,1 @@
93 +a
93 +a
94
94
95 changeset: 0:6563da9dcf87
95 changeset: 0:6563da9dcf87
96 user: test
96 user: test
97 date: Thu Jan 01 00:00:00 1970 +0000
97 date: Thu Jan 01 00:00:00 1970 +0000
98 summary: b
98 summary: b
99
99
100 diff -r 000000000000 -r 6563da9dcf87 b
100 diff -r 000000000000 -r 6563da9dcf87 b
101 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
101 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
102 +++ b/b Thu Jan 01 00:00:00 1970 +0000
102 +++ b/b Thu Jan 01 00:00:00 1970 +0000
103 @@ -0,0 +1,1 @@
103 @@ -0,0 +1,1 @@
104 +b
104 +b
105
105
106 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
106 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
107 $ cat hg.pid >> $DAEMON_PIDS
107 $ cat hg.pid >> $DAEMON_PIDS
108
108
109 tip - two revisions
109 tip - two revisions
110
110
111 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/tip/a')
111 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/tip/a')
112 200 Script output follows
112 200 Script output follows
113
113
114 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
114 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
115 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
115 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
116 <head>
116 <head>
117 <link rel="icon" href="/static/hgicon.png" type="image/png" />
117 <link rel="icon" href="/static/hgicon.png" type="image/png" />
118 <meta name="robots" content="index, nofollow" />
118 <meta name="robots" content="index, nofollow" />
119 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
119 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
120
120
121 <title>test: a history</title>
121 <title>test: a history</title>
122 <link rel="alternate" type="application/atom+xml"
122 <link rel="alternate" type="application/atom+xml"
123 href="/atom-log/tip/a" title="Atom feed for test:a" />
123 href="/atom-log/tip/a" title="Atom feed for test:a" />
124 <link rel="alternate" type="application/rss+xml"
124 <link rel="alternate" type="application/rss+xml"
125 href="/rss-log/tip/a" title="RSS feed for test:a" />
125 href="/rss-log/tip/a" title="RSS feed for test:a" />
126 </head>
126 </head>
127 <body>
127 <body>
128
128
129 <div class="container">
129 <div class="container">
130 <div class="menu">
130 <div class="menu">
131 <div class="logo">
131 <div class="logo">
132 <a href="http://mercurial.selenic.com/">
132 <a href="http://mercurial.selenic.com/">
133 <img src="/static/hglogo.png" alt="mercurial" /></a>
133 <img src="/static/hglogo.png" alt="mercurial" /></a>
134 </div>
134 </div>
135 <ul>
135 <ul>
136 <li><a href="/shortlog/01de2d66a28d">log</a></li>
136 <li><a href="/shortlog/01de2d66a28d">log</a></li>
137 <li><a href="/graph/01de2d66a28d">graph</a></li>
137 <li><a href="/graph/01de2d66a28d">graph</a></li>
138 <li><a href="/tags">tags</a></li>
138 <li><a href="/tags">tags</a></li>
139 <li><a href="/bookmarks">bookmarks</a></li>
139 <li><a href="/branches">branches</a></li>
140 <li><a href="/branches">branches</a></li>
140 </ul>
141 </ul>
141 <ul>
142 <ul>
142 <li><a href="/rev/01de2d66a28d">changeset</a></li>
143 <li><a href="/rev/01de2d66a28d">changeset</a></li>
143 <li><a href="/file/01de2d66a28d">browse</a></li>
144 <li><a href="/file/01de2d66a28d">browse</a></li>
144 </ul>
145 </ul>
145 <ul>
146 <ul>
146 <li><a href="/file/01de2d66a28d/a">file</a></li>
147 <li><a href="/file/01de2d66a28d/a">file</a></li>
147 <li><a href="/diff/01de2d66a28d/a">diff</a></li>
148 <li><a href="/diff/01de2d66a28d/a">diff</a></li>
148 <li><a href="/annotate/01de2d66a28d/a">annotate</a></li>
149 <li><a href="/annotate/01de2d66a28d/a">annotate</a></li>
149 <li class="active">file log</li>
150 <li class="active">file log</li>
150 <li><a href="/raw-file/01de2d66a28d/a">raw</a></li>
151 <li><a href="/raw-file/01de2d66a28d/a">raw</a></li>
151 </ul>
152 </ul>
152 <ul>
153 <ul>
153 <li><a href="/help">help</a></li>
154 <li><a href="/help">help</a></li>
154 </ul>
155 </ul>
155 </div>
156 </div>
156
157
157 <div class="main">
158 <div class="main">
158 <h2><a href="/">test</a></h2>
159 <h2><a href="/">test</a></h2>
159 <h3>log a</h3>
160 <h3>log a</h3>
160
161
161 <form class="search" action="/log">
162 <form class="search" action="/log">
162
163
163 <p><input name="rev" id="search1" type="text" size="30" /></p>
164 <p><input name="rev" id="search1" type="text" size="30" /></p>
164 <div id="hint">find changesets by author, revision,
165 <div id="hint">find changesets by author, revision,
165 files, or words in the commit message</div>
166 files, or words in the commit message</div>
166 </form>
167 </form>
167
168
168 <div class="navigate">
169 <div class="navigate">
169 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
170 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
170 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
171 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
171 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
172 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
172
173
173 <table class="bigtable">
174 <table class="bigtable">
174 <tr>
175 <tr>
175 <th class="age">age</th>
176 <th class="age">age</th>
176 <th class="author">author</th>
177 <th class="author">author</th>
177 <th class="description">description</th>
178 <th class="description">description</th>
178 </tr>
179 </tr>
179 <tr class="parity0">
180 <tr class="parity0">
180 <td class="age">1970-01-01</td>
181 <td class="age">1970-01-01</td>
181 <td class="author">test</td>
182 <td class="author">test</td>
182 <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
183 <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
183 </tr>
184 </tr>
184 <tr class="parity1">
185 <tr class="parity1">
185 <td class="age">1970-01-01</td>
186 <td class="age">1970-01-01</td>
186 <td class="author">test</td>
187 <td class="author">test</td>
187 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
188 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
188 </tr>
189 </tr>
189
190
190 </table>
191 </table>
191
192
192 <div class="navigate">
193 <div class="navigate">
193 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
194 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
194 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
195 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
195 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
196 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
196 </div>
197 </div>
197
198
198 </div>
199 </div>
199 </div>
200 </div>
200
201
201
202
202
203
203 </body>
204 </body>
204 </html>
205 </html>
205
206
206
207
207 second version - two revisions
208 second version - two revisions
208
209
209 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/3/a')
210 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/3/a')
210 200 Script output follows
211 200 Script output follows
211
212
212 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
213 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
213 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
214 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
214 <head>
215 <head>
215 <link rel="icon" href="/static/hgicon.png" type="image/png" />
216 <link rel="icon" href="/static/hgicon.png" type="image/png" />
216 <meta name="robots" content="index, nofollow" />
217 <meta name="robots" content="index, nofollow" />
217 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
218 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
218
219
219 <title>test: a history</title>
220 <title>test: a history</title>
220 <link rel="alternate" type="application/atom+xml"
221 <link rel="alternate" type="application/atom+xml"
221 href="/atom-log/tip/a" title="Atom feed for test:a" />
222 href="/atom-log/tip/a" title="Atom feed for test:a" />
222 <link rel="alternate" type="application/rss+xml"
223 <link rel="alternate" type="application/rss+xml"
223 href="/rss-log/tip/a" title="RSS feed for test:a" />
224 href="/rss-log/tip/a" title="RSS feed for test:a" />
224 </head>
225 </head>
225 <body>
226 <body>
226
227
227 <div class="container">
228 <div class="container">
228 <div class="menu">
229 <div class="menu">
229 <div class="logo">
230 <div class="logo">
230 <a href="http://mercurial.selenic.com/">
231 <a href="http://mercurial.selenic.com/">
231 <img src="/static/hglogo.png" alt="mercurial" /></a>
232 <img src="/static/hglogo.png" alt="mercurial" /></a>
232 </div>
233 </div>
233 <ul>
234 <ul>
234 <li><a href="/shortlog/01de2d66a28d">log</a></li>
235 <li><a href="/shortlog/01de2d66a28d">log</a></li>
235 <li><a href="/graph/01de2d66a28d">graph</a></li>
236 <li><a href="/graph/01de2d66a28d">graph</a></li>
236 <li><a href="/tags">tags</a></li>
237 <li><a href="/tags">tags</a></li>
238 <li><a href="/bookmarks">bookmarks</a></li>
237 <li><a href="/branches">branches</a></li>
239 <li><a href="/branches">branches</a></li>
238 </ul>
240 </ul>
239 <ul>
241 <ul>
240 <li><a href="/rev/01de2d66a28d">changeset</a></li>
242 <li><a href="/rev/01de2d66a28d">changeset</a></li>
241 <li><a href="/file/01de2d66a28d">browse</a></li>
243 <li><a href="/file/01de2d66a28d">browse</a></li>
242 </ul>
244 </ul>
243 <ul>
245 <ul>
244 <li><a href="/file/01de2d66a28d/a">file</a></li>
246 <li><a href="/file/01de2d66a28d/a">file</a></li>
245 <li><a href="/diff/01de2d66a28d/a">diff</a></li>
247 <li><a href="/diff/01de2d66a28d/a">diff</a></li>
246 <li><a href="/annotate/01de2d66a28d/a">annotate</a></li>
248 <li><a href="/annotate/01de2d66a28d/a">annotate</a></li>
247 <li class="active">file log</li>
249 <li class="active">file log</li>
248 <li><a href="/raw-file/01de2d66a28d/a">raw</a></li>
250 <li><a href="/raw-file/01de2d66a28d/a">raw</a></li>
249 </ul>
251 </ul>
250 <ul>
252 <ul>
251 <li><a href="/help">help</a></li>
253 <li><a href="/help">help</a></li>
252 </ul>
254 </ul>
253 </div>
255 </div>
254
256
255 <div class="main">
257 <div class="main">
256 <h2><a href="/">test</a></h2>
258 <h2><a href="/">test</a></h2>
257 <h3>log a</h3>
259 <h3>log a</h3>
258
260
259 <form class="search" action="/log">
261 <form class="search" action="/log">
260
262
261 <p><input name="rev" id="search1" type="text" size="30" /></p>
263 <p><input name="rev" id="search1" type="text" size="30" /></p>
262 <div id="hint">find changesets by author, revision,
264 <div id="hint">find changesets by author, revision,
263 files, or words in the commit message</div>
265 files, or words in the commit message</div>
264 </form>
266 </form>
265
267
266 <div class="navigate">
268 <div class="navigate">
267 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
269 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
268 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
270 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
269 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
271 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
270
272
271 <table class="bigtable">
273 <table class="bigtable">
272 <tr>
274 <tr>
273 <th class="age">age</th>
275 <th class="age">age</th>
274 <th class="author">author</th>
276 <th class="author">author</th>
275 <th class="description">description</th>
277 <th class="description">description</th>
276 </tr>
278 </tr>
277 <tr class="parity0">
279 <tr class="parity0">
278 <td class="age">1970-01-01</td>
280 <td class="age">1970-01-01</td>
279 <td class="author">test</td>
281 <td class="author">test</td>
280 <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
282 <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
281 </tr>
283 </tr>
282 <tr class="parity1">
284 <tr class="parity1">
283 <td class="age">1970-01-01</td>
285 <td class="age">1970-01-01</td>
284 <td class="author">test</td>
286 <td class="author">test</td>
285 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
287 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
286 </tr>
288 </tr>
287
289
288 </table>
290 </table>
289
291
290 <div class="navigate">
292 <div class="navigate">
291 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
293 <a href="/log/01de2d66a28d/a?revcount=30">less</a>
292 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
294 <a href="/log/01de2d66a28d/a?revcount=120">more</a>
293 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
295 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
294 </div>
296 </div>
295
297
296 </div>
298 </div>
297 </div>
299 </div>
298
300
299
301
300
302
301 </body>
303 </body>
302 </html>
304 </html>
303
305
304
306
305 first deleted - one revision
307 first deleted - one revision
306
308
307 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/2/a')
309 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/2/a')
308 200 Script output follows
310 200 Script output follows
309
311
310 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
312 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
311 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
313 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
312 <head>
314 <head>
313 <link rel="icon" href="/static/hgicon.png" type="image/png" />
315 <link rel="icon" href="/static/hgicon.png" type="image/png" />
314 <meta name="robots" content="index, nofollow" />
316 <meta name="robots" content="index, nofollow" />
315 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
317 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
316
318
317 <title>test: a history</title>
319 <title>test: a history</title>
318 <link rel="alternate" type="application/atom+xml"
320 <link rel="alternate" type="application/atom+xml"
319 href="/atom-log/tip/a" title="Atom feed for test:a" />
321 href="/atom-log/tip/a" title="Atom feed for test:a" />
320 <link rel="alternate" type="application/rss+xml"
322 <link rel="alternate" type="application/rss+xml"
321 href="/rss-log/tip/a" title="RSS feed for test:a" />
323 href="/rss-log/tip/a" title="RSS feed for test:a" />
322 </head>
324 </head>
323 <body>
325 <body>
324
326
325 <div class="container">
327 <div class="container">
326 <div class="menu">
328 <div class="menu">
327 <div class="logo">
329 <div class="logo">
328 <a href="http://mercurial.selenic.com/">
330 <a href="http://mercurial.selenic.com/">
329 <img src="/static/hglogo.png" alt="mercurial" /></a>
331 <img src="/static/hglogo.png" alt="mercurial" /></a>
330 </div>
332 </div>
331 <ul>
333 <ul>
332 <li><a href="/shortlog/5ed941583260">log</a></li>
334 <li><a href="/shortlog/5ed941583260">log</a></li>
333 <li><a href="/graph/5ed941583260">graph</a></li>
335 <li><a href="/graph/5ed941583260">graph</a></li>
334 <li><a href="/tags">tags</a></li>
336 <li><a href="/tags">tags</a></li>
337 <li><a href="/bookmarks">bookmarks</a></li>
335 <li><a href="/branches">branches</a></li>
338 <li><a href="/branches">branches</a></li>
336 </ul>
339 </ul>
337 <ul>
340 <ul>
338 <li><a href="/rev/5ed941583260">changeset</a></li>
341 <li><a href="/rev/5ed941583260">changeset</a></li>
339 <li><a href="/file/5ed941583260">browse</a></li>
342 <li><a href="/file/5ed941583260">browse</a></li>
340 </ul>
343 </ul>
341 <ul>
344 <ul>
342 <li><a href="/file/5ed941583260/a">file</a></li>
345 <li><a href="/file/5ed941583260/a">file</a></li>
343 <li><a href="/diff/5ed941583260/a">diff</a></li>
346 <li><a href="/diff/5ed941583260/a">diff</a></li>
344 <li><a href="/annotate/5ed941583260/a">annotate</a></li>
347 <li><a href="/annotate/5ed941583260/a">annotate</a></li>
345 <li class="active">file log</li>
348 <li class="active">file log</li>
346 <li><a href="/raw-file/5ed941583260/a">raw</a></li>
349 <li><a href="/raw-file/5ed941583260/a">raw</a></li>
347 </ul>
350 </ul>
348 <ul>
351 <ul>
349 <li><a href="/help">help</a></li>
352 <li><a href="/help">help</a></li>
350 </ul>
353 </ul>
351 </div>
354 </div>
352
355
353 <div class="main">
356 <div class="main">
354 <h2><a href="/">test</a></h2>
357 <h2><a href="/">test</a></h2>
355 <h3>log a</h3>
358 <h3>log a</h3>
356
359
357 <form class="search" action="/log">
360 <form class="search" action="/log">
358
361
359 <p><input name="rev" id="search1" type="text" size="30" /></p>
362 <p><input name="rev" id="search1" type="text" size="30" /></p>
360 <div id="hint">find changesets by author, revision,
363 <div id="hint">find changesets by author, revision,
361 files, or words in the commit message</div>
364 files, or words in the commit message</div>
362 </form>
365 </form>
363
366
364 <div class="navigate">
367 <div class="navigate">
365 <a href="/log/5ed941583260/a?revcount=30">less</a>
368 <a href="/log/5ed941583260/a?revcount=30">less</a>
366 <a href="/log/5ed941583260/a?revcount=120">more</a>
369 <a href="/log/5ed941583260/a?revcount=120">more</a>
367 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
370 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
368
371
369 <table class="bigtable">
372 <table class="bigtable">
370 <tr>
373 <tr>
371 <th class="age">age</th>
374 <th class="age">age</th>
372 <th class="author">author</th>
375 <th class="author">author</th>
373 <th class="description">description</th>
376 <th class="description">description</th>
374 </tr>
377 </tr>
375 <tr class="parity0">
378 <tr class="parity0">
376 <td class="age">1970-01-01</td>
379 <td class="age">1970-01-01</td>
377 <td class="author">test</td>
380 <td class="author">test</td>
378 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
381 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
379 </tr>
382 </tr>
380
383
381 </table>
384 </table>
382
385
383 <div class="navigate">
386 <div class="navigate">
384 <a href="/log/5ed941583260/a?revcount=30">less</a>
387 <a href="/log/5ed941583260/a?revcount=30">less</a>
385 <a href="/log/5ed941583260/a?revcount=120">more</a>
388 <a href="/log/5ed941583260/a?revcount=120">more</a>
386 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
389 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
387 </div>
390 </div>
388
391
389 </div>
392 </div>
390 </div>
393 </div>
391
394
392
395
393
396
394 </body>
397 </body>
395 </html>
398 </html>
396
399
397
400
398 first version - one revision
401 first version - one revision
399
402
400 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/1/a')
403 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/1/a')
401 200 Script output follows
404 200 Script output follows
402
405
403 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
406 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
404 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
407 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
405 <head>
408 <head>
406 <link rel="icon" href="/static/hgicon.png" type="image/png" />
409 <link rel="icon" href="/static/hgicon.png" type="image/png" />
407 <meta name="robots" content="index, nofollow" />
410 <meta name="robots" content="index, nofollow" />
408 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
411 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
409
412
410 <title>test: a history</title>
413 <title>test: a history</title>
411 <link rel="alternate" type="application/atom+xml"
414 <link rel="alternate" type="application/atom+xml"
412 href="/atom-log/tip/a" title="Atom feed for test:a" />
415 href="/atom-log/tip/a" title="Atom feed for test:a" />
413 <link rel="alternate" type="application/rss+xml"
416 <link rel="alternate" type="application/rss+xml"
414 href="/rss-log/tip/a" title="RSS feed for test:a" />
417 href="/rss-log/tip/a" title="RSS feed for test:a" />
415 </head>
418 </head>
416 <body>
419 <body>
417
420
418 <div class="container">
421 <div class="container">
419 <div class="menu">
422 <div class="menu">
420 <div class="logo">
423 <div class="logo">
421 <a href="http://mercurial.selenic.com/">
424 <a href="http://mercurial.selenic.com/">
422 <img src="/static/hglogo.png" alt="mercurial" /></a>
425 <img src="/static/hglogo.png" alt="mercurial" /></a>
423 </div>
426 </div>
424 <ul>
427 <ul>
425 <li><a href="/shortlog/5ed941583260">log</a></li>
428 <li><a href="/shortlog/5ed941583260">log</a></li>
426 <li><a href="/graph/5ed941583260">graph</a></li>
429 <li><a href="/graph/5ed941583260">graph</a></li>
427 <li><a href="/tags">tags</a></li>
430 <li><a href="/tags">tags</a></li>
431 <li><a href="/bookmarks">bookmarks</a></li>
428 <li><a href="/branches">branches</a></li>
432 <li><a href="/branches">branches</a></li>
429 </ul>
433 </ul>
430 <ul>
434 <ul>
431 <li><a href="/rev/5ed941583260">changeset</a></li>
435 <li><a href="/rev/5ed941583260">changeset</a></li>
432 <li><a href="/file/5ed941583260">browse</a></li>
436 <li><a href="/file/5ed941583260">browse</a></li>
433 </ul>
437 </ul>
434 <ul>
438 <ul>
435 <li><a href="/file/5ed941583260/a">file</a></li>
439 <li><a href="/file/5ed941583260/a">file</a></li>
436 <li><a href="/diff/5ed941583260/a">diff</a></li>
440 <li><a href="/diff/5ed941583260/a">diff</a></li>
437 <li><a href="/annotate/5ed941583260/a">annotate</a></li>
441 <li><a href="/annotate/5ed941583260/a">annotate</a></li>
438 <li class="active">file log</li>
442 <li class="active">file log</li>
439 <li><a href="/raw-file/5ed941583260/a">raw</a></li>
443 <li><a href="/raw-file/5ed941583260/a">raw</a></li>
440 </ul>
444 </ul>
441 <ul>
445 <ul>
442 <li><a href="/help">help</a></li>
446 <li><a href="/help">help</a></li>
443 </ul>
447 </ul>
444 </div>
448 </div>
445
449
446 <div class="main">
450 <div class="main">
447 <h2><a href="/">test</a></h2>
451 <h2><a href="/">test</a></h2>
448 <h3>log a</h3>
452 <h3>log a</h3>
449
453
450 <form class="search" action="/log">
454 <form class="search" action="/log">
451
455
452 <p><input name="rev" id="search1" type="text" size="30" /></p>
456 <p><input name="rev" id="search1" type="text" size="30" /></p>
453 <div id="hint">find changesets by author, revision,
457 <div id="hint">find changesets by author, revision,
454 files, or words in the commit message</div>
458 files, or words in the commit message</div>
455 </form>
459 </form>
456
460
457 <div class="navigate">
461 <div class="navigate">
458 <a href="/log/5ed941583260/a?revcount=30">less</a>
462 <a href="/log/5ed941583260/a?revcount=30">less</a>
459 <a href="/log/5ed941583260/a?revcount=120">more</a>
463 <a href="/log/5ed941583260/a?revcount=120">more</a>
460 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
464 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
461
465
462 <table class="bigtable">
466 <table class="bigtable">
463 <tr>
467 <tr>
464 <th class="age">age</th>
468 <th class="age">age</th>
465 <th class="author">author</th>
469 <th class="author">author</th>
466 <th class="description">description</th>
470 <th class="description">description</th>
467 </tr>
471 </tr>
468 <tr class="parity0">
472 <tr class="parity0">
469 <td class="age">1970-01-01</td>
473 <td class="age">1970-01-01</td>
470 <td class="author">test</td>
474 <td class="author">test</td>
471 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
475 <td class="description"><a href="/rev/5ed941583260">first a</a></td>
472 </tr>
476 </tr>
473
477
474 </table>
478 </table>
475
479
476 <div class="navigate">
480 <div class="navigate">
477 <a href="/log/5ed941583260/a?revcount=30">less</a>
481 <a href="/log/5ed941583260/a?revcount=30">less</a>
478 <a href="/log/5ed941583260/a?revcount=120">more</a>
482 <a href="/log/5ed941583260/a?revcount=120">more</a>
479 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
483 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
480 </div>
484 </div>
481
485
482 </div>
486 </div>
483 </div>
487 </div>
484
488
485
489
486
490
487 </body>
491 </body>
488 </html>
492 </html>
489
493
490
494
491 before addition - error
495 before addition - error
492
496
493 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/0/a')
497 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/0/a')
494 404 Not Found
498 404 Not Found
495
499
496 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
500 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
497 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
501 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
498 <head>
502 <head>
499 <link rel="icon" href="/static/hgicon.png" type="image/png" />
503 <link rel="icon" href="/static/hgicon.png" type="image/png" />
500 <meta name="robots" content="index, nofollow" />
504 <meta name="robots" content="index, nofollow" />
501 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
505 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
502
506
503 <title>test: error</title>
507 <title>test: error</title>
504 </head>
508 </head>
505 <body>
509 <body>
506
510
507 <div class="container">
511 <div class="container">
508 <div class="menu">
512 <div class="menu">
509 <div class="logo">
513 <div class="logo">
510 <a href="http://mercurial.selenic.com/">
514 <a href="http://mercurial.selenic.com/">
511 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
515 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
512 </div>
516 </div>
513 <ul>
517 <ul>
514 <li><a href="/shortlog">log</a></li>
518 <li><a href="/shortlog">log</a></li>
515 <li><a href="/graph">graph</a></li>
519 <li><a href="/graph">graph</a></li>
516 <li><a href="/tags">tags</a></li>
520 <li><a href="/tags">tags</a></li>
521 <li><a href="/bookmarks">bookmarks</a></li>
517 <li><a href="/branches">branches</a></li>
522 <li><a href="/branches">branches</a></li>
518 <li><a href="/help">help</a></li>
523 <li><a href="/help">help</a></li>
519 </ul>
524 </ul>
520 </div>
525 </div>
521
526
522 <div class="main">
527 <div class="main">
523
528
524 <h2><a href="/">test</a></h2>
529 <h2><a href="/">test</a></h2>
525 <h3>error</h3>
530 <h3>error</h3>
526
531
527 <form class="search" action="/log">
532 <form class="search" action="/log">
528
533
529 <p><input name="rev" id="search1" type="text" size="30"></p>
534 <p><input name="rev" id="search1" type="text" size="30"></p>
530 <div id="hint">find changesets by author, revision,
535 <div id="hint">find changesets by author, revision,
531 files, or words in the commit message</div>
536 files, or words in the commit message</div>
532 </form>
537 </form>
533
538
534 <div class="description">
539 <div class="description">
535 <p>
540 <p>
536 An error occurred while processing your request:
541 An error occurred while processing your request:
537 </p>
542 </p>
538 <p>
543 <p>
539 a@6563da9dcf87: not found in manifest
544 a@6563da9dcf87: not found in manifest
540 </p>
545 </p>
541 </div>
546 </div>
542 </div>
547 </div>
543 </div>
548 </div>
544
549
545
550
546
551
547 </body>
552 </body>
548 </html>
553 </html>
549
554
550 [1]
555 [1]
551
556
552 should show base link, use spartan because it shows it
557 should show base link, use spartan because it shows it
553
558
554 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/tip/c?style=spartan')
559 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/log/tip/c?style=spartan')
555 200 Script output follows
560 200 Script output follows
556
561
557 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
562 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
558 <html>
563 <html>
559 <head>
564 <head>
560 <link rel="icon" href="/static/hgicon.png" type="image/png">
565 <link rel="icon" href="/static/hgicon.png" type="image/png">
561 <meta name="robots" content="index, nofollow" />
566 <meta name="robots" content="index, nofollow" />
562 <link rel="stylesheet" href="/static/style.css" type="text/css" />
567 <link rel="stylesheet" href="/static/style.css" type="text/css" />
563
568
564 <title>test: c history</title>
569 <title>test: c history</title>
565 <link rel="alternate" type="application/atom+xml"
570 <link rel="alternate" type="application/atom+xml"
566 href="/atom-log/tip/c" title="Atom feed for test:c">
571 href="/atom-log/tip/c" title="Atom feed for test:c">
567 <link rel="alternate" type="application/rss+xml"
572 <link rel="alternate" type="application/rss+xml"
568 href="/rss-log/tip/c" title="RSS feed for test:c">
573 href="/rss-log/tip/c" title="RSS feed for test:c">
569 </head>
574 </head>
570 <body>
575 <body>
571
576
572 <div class="buttons">
577 <div class="buttons">
573 <a href="/log?style=spartan">changelog</a>
578 <a href="/log?style=spartan">changelog</a>
574 <a href="/shortlog?style=spartan">shortlog</a>
579 <a href="/shortlog?style=spartan">shortlog</a>
575 <a href="/graph?style=spartan">graph</a>
580 <a href="/graph?style=spartan">graph</a>
576 <a href="/tags?style=spartan">tags</a>
581 <a href="/tags?style=spartan">tags</a>
577 <a href="/branches?style=spartan">branches</a>
582 <a href="/branches?style=spartan">branches</a>
578 <a href="/file/b7682196df1c/c?style=spartan">file</a>
583 <a href="/file/b7682196df1c/c?style=spartan">file</a>
579 <a href="/annotate/b7682196df1c/c?style=spartan">annotate</a>
584 <a href="/annotate/b7682196df1c/c?style=spartan">annotate</a>
580 <a href="/help?style=spartan">help</a>
585 <a href="/help?style=spartan">help</a>
581 <a type="application/rss+xml" href="/rss-log/tip/c">rss</a>
586 <a type="application/rss+xml" href="/rss-log/tip/c">rss</a>
582 <a type="application/atom+xml" href="/atom-log/tip/c" title="Atom feed for test:c">atom</a>
587 <a type="application/atom+xml" href="/atom-log/tip/c" title="Atom feed for test:c">atom</a>
583 </div>
588 </div>
584
589
585 <h2>c revision history</h2>
590 <h2>c revision history</h2>
586
591
587 <p>navigate: <small class="navigate"><a href="/log/1a6696706df2/c?style=spartan">(0)</a> <a href="/log/tip/c?style=spartan">tip</a> </small></p>
592 <p>navigate: <small class="navigate"><a href="/log/1a6696706df2/c?style=spartan">(0)</a> <a href="/log/tip/c?style=spartan">tip</a> </small></p>
588
593
589 <table class="logEntry parity0">
594 <table class="logEntry parity0">
590 <tr>
595 <tr>
591 <th class="age">1970-01-01:</th>
596 <th class="age">1970-01-01:</th>
592 <th class="firstline"><a href="/rev/b7682196df1c?style=spartan">change c</a></th>
597 <th class="firstline"><a href="/rev/b7682196df1c?style=spartan">change c</a></th>
593 </tr>
598 </tr>
594 <tr>
599 <tr>
595 <th class="revision">revision 1:</td>
600 <th class="revision">revision 1:</td>
596 <td class="node">
601 <td class="node">
597 <a href="/file/b7682196df1c/c?style=spartan">b7682196df1c</a>
602 <a href="/file/b7682196df1c/c?style=spartan">b7682196df1c</a>
598 <a href="/diff/b7682196df1c/c?style=spartan">(diff)</a>
603 <a href="/diff/b7682196df1c/c?style=spartan">(diff)</a>
599 <a href="/annotate/b7682196df1c/c?style=spartan">(annotate)</a>
604 <a href="/annotate/b7682196df1c/c?style=spartan">(annotate)</a>
600 </td>
605 </td>
601 </tr>
606 </tr>
602
607
603 <tr>
608 <tr>
604 <th class="author">author:</th>
609 <th class="author">author:</th>
605 <td class="author">&#116;&#101;&#115;&#116;</td>
610 <td class="author">&#116;&#101;&#115;&#116;</td>
606 </tr>
611 </tr>
607 <tr>
612 <tr>
608 <th class="date">date:</th>
613 <th class="date">date:</th>
609 <td class="date">Thu Jan 01 00:00:00 1970 +0000</td>
614 <td class="date">Thu Jan 01 00:00:00 1970 +0000</td>
610 </tr>
615 </tr>
611 </table>
616 </table>
612
617
613
618
614 <table class="logEntry parity1">
619 <table class="logEntry parity1">
615 <tr>
620 <tr>
616 <th class="age">1970-01-01:</th>
621 <th class="age">1970-01-01:</th>
617 <th class="firstline"><a href="/rev/1a6696706df2?style=spartan">mv b</a></th>
622 <th class="firstline"><a href="/rev/1a6696706df2?style=spartan">mv b</a></th>
618 </tr>
623 </tr>
619 <tr>
624 <tr>
620 <th class="revision">revision 0:</td>
625 <th class="revision">revision 0:</td>
621 <td class="node">
626 <td class="node">
622 <a href="/file/1a6696706df2/c?style=spartan">1a6696706df2</a>
627 <a href="/file/1a6696706df2/c?style=spartan">1a6696706df2</a>
623 <a href="/diff/1a6696706df2/c?style=spartan">(diff)</a>
628 <a href="/diff/1a6696706df2/c?style=spartan">(diff)</a>
624 <a href="/annotate/1a6696706df2/c?style=spartan">(annotate)</a>
629 <a href="/annotate/1a6696706df2/c?style=spartan">(annotate)</a>
625 </td>
630 </td>
626 </tr>
631 </tr>
627
632
628 <tr>
633 <tr>
629 <th>base:</th>
634 <th>base:</th>
630 <td>
635 <td>
631 <a href="/file/1e88685f5dde/b?style=spartan">
636 <a href="/file/1e88685f5dde/b?style=spartan">
632 b@1e88685f5dde
637 b@1e88685f5dde
633 </a>
638 </a>
634 </td>
639 </td>
635 </tr>
640 </tr>
636 <tr>
641 <tr>
637 <th class="author">author:</th>
642 <th class="author">author:</th>
638 <td class="author">&#116;&#101;&#115;&#116;</td>
643 <td class="author">&#116;&#101;&#115;&#116;</td>
639 </tr>
644 </tr>
640 <tr>
645 <tr>
641 <th class="date">date:</th>
646 <th class="date">date:</th>
642 <td class="date">Thu Jan 01 00:00:00 1970 +0000</td>
647 <td class="date">Thu Jan 01 00:00:00 1970 +0000</td>
643 </tr>
648 </tr>
644 </table>
649 </table>
645
650
646
651
647
652
648
653
649
654
650 <div class="logo">
655 <div class="logo">
651 <a href="http://mercurial.selenic.com/">
656 <a href="http://mercurial.selenic.com/">
652 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
657 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
653 </div>
658 </div>
654
659
655 </body>
660 </body>
656 </html>
661 </html>
657
662
658
663
659 rss log
664 rss log
660
665
661 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rss-log/tip/a')
666 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rss-log/tip/a')
662 200 Script output follows
667 200 Script output follows
663
668
664 <?xml version="1.0" encoding="ascii"?>
669 <?xml version="1.0" encoding="ascii"?>
665 <rss version="2.0">
670 <rss version="2.0">
666 <channel>
671 <channel>
667 <link>http://*:$HGPORT/</link> (glob)
672 <link>http://*:$HGPORT/</link> (glob)
668 <language>en-us</language>
673 <language>en-us</language>
669
674
670 <title>test: a history</title>
675 <title>test: a history</title>
671 <description>a revision history</description>
676 <description>a revision history</description>
672 <item>
677 <item>
673 <title>second a</title>
678 <title>second a</title>
674 <link>http://*:$HGPORT/log01de2d66a28d/a</link> (glob)
679 <link>http://*:$HGPORT/log01de2d66a28d/a</link> (glob)
675 <description><![CDATA[second a]]></description>
680 <description><![CDATA[second a]]></description>
676 <author>&#116;&#101;&#115;&#116;</author>
681 <author>&#116;&#101;&#115;&#116;</author>
677 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
682 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
678 </item>
683 </item>
679 <item>
684 <item>
680 <title>first a</title>
685 <title>first a</title>
681 <link>http://*:$HGPORT/log5ed941583260/a</link> (glob)
686 <link>http://*:$HGPORT/log5ed941583260/a</link> (glob)
682 <description><![CDATA[first a]]></description>
687 <description><![CDATA[first a]]></description>
683 <author>&#116;&#101;&#115;&#116;</author>
688 <author>&#116;&#101;&#115;&#116;</author>
684 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
689 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
685 </item>
690 </item>
686
691
687 </channel>
692 </channel>
688 </rss>
693 </rss>
689
694
690 atom log
695 atom log
691
696
692 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/atom-log/tip/a')
697 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/atom-log/tip/a')
693 200 Script output follows
698 200 Script output follows
694
699
695 <?xml version="1.0" encoding="ascii"?>
700 <?xml version="1.0" encoding="ascii"?>
696 <feed xmlns="http://www.w3.org/2005/Atom">
701 <feed xmlns="http://www.w3.org/2005/Atom">
697 <id>http://*:$HGPORT/atom-log/tip/a</id> (glob)
702 <id>http://*:$HGPORT/atom-log/tip/a</id> (glob)
698 <link rel="self" href="http://*:$HGPORT/atom-log/tip/a"/> (glob)
703 <link rel="self" href="http://*:$HGPORT/atom-log/tip/a"/> (glob)
699 <title>test: a history</title>
704 <title>test: a history</title>
700 <updated>1970-01-01T00:00:00+00:00</updated>
705 <updated>1970-01-01T00:00:00+00:00</updated>
701
706
702 <entry>
707 <entry>
703 <title>second a</title>
708 <title>second a</title>
704 <id>http://*:$HGPORT/#changeset-01de2d66a28df5549090991dccda788726948517</id> (glob)
709 <id>http://*:$HGPORT/#changeset-01de2d66a28df5549090991dccda788726948517</id> (glob)
705 <link href="http://*:$HGPORT/rev/01de2d66a28d"/> (glob)
710 <link href="http://*:$HGPORT/rev/01de2d66a28d"/> (glob)
706 <author>
711 <author>
707 <name>test</name>
712 <name>test</name>
708 <email>&#116;&#101;&#115;&#116;</email>
713 <email>&#116;&#101;&#115;&#116;</email>
709 </author>
714 </author>
710 <updated>1970-01-01T00:00:00+00:00</updated>
715 <updated>1970-01-01T00:00:00+00:00</updated>
711 <published>1970-01-01T00:00:00+00:00</published>
716 <published>1970-01-01T00:00:00+00:00</published>
712 <content type="xhtml">
717 <content type="xhtml">
713 <div xmlns="http://www.w3.org/1999/xhtml">
718 <div xmlns="http://www.w3.org/1999/xhtml">
714 <pre xml:space="preserve">second a</pre>
719 <pre xml:space="preserve">second a</pre>
715 </div>
720 </div>
716 </content>
721 </content>
717 </entry>
722 </entry>
718 <entry>
723 <entry>
719 <title>first a</title>
724 <title>first a</title>
720 <id>http://*:$HGPORT/#changeset-5ed941583260248620985524192fdc382ef57c36</id> (glob)
725 <id>http://*:$HGPORT/#changeset-5ed941583260248620985524192fdc382ef57c36</id> (glob)
721 <link href="http://*:$HGPORT/rev/5ed941583260"/> (glob)
726 <link href="http://*:$HGPORT/rev/5ed941583260"/> (glob)
722 <author>
727 <author>
723 <name>test</name>
728 <name>test</name>
724 <email>&#116;&#101;&#115;&#116;</email>
729 <email>&#116;&#101;&#115;&#116;</email>
725 </author>
730 </author>
726 <updated>1970-01-01T00:00:00+00:00</updated>
731 <updated>1970-01-01T00:00:00+00:00</updated>
727 <published>1970-01-01T00:00:00+00:00</published>
732 <published>1970-01-01T00:00:00+00:00</published>
728 <content type="xhtml">
733 <content type="xhtml">
729 <div xmlns="http://www.w3.org/1999/xhtml">
734 <div xmlns="http://www.w3.org/1999/xhtml">
730 <pre xml:space="preserve">first a</pre>
735 <pre xml:space="preserve">first a</pre>
731 </div>
736 </div>
732 </content>
737 </content>
733 </entry>
738 </entry>
734
739
735 </feed>
740 </feed>
736
741
737 errors
742 errors
738
743
739 $ cat errors.log
744 $ cat errors.log
@@ -1,204 +1,206 b''
1 setting up repo
1 setting up repo
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ echo a > a
5 $ echo a > a
6 $ hg ci -Ama
6 $ hg ci -Ama
7 adding a
7 adding a
8 $ hg rm a
8 $ hg rm a
9 $ hg ci -mdel
9 $ hg ci -mdel
10
10
11 set up hgweb
11 set up hgweb
12
12
13 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
13 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
14 $ cat hg.pid >> $DAEMON_PIDS
14 $ cat hg.pid >> $DAEMON_PIDS
15
15
16 revision
16 revision
17
17
18 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/tip'
18 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/rev/tip'
19 200 Script output follows
19 200 Script output follows
20
20
21 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
21 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
22 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
22 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
23 <head>
23 <head>
24 <link rel="icon" href="/static/hgicon.png" type="image/png" />
24 <link rel="icon" href="/static/hgicon.png" type="image/png" />
25 <meta name="robots" content="index, nofollow" />
25 <meta name="robots" content="index, nofollow" />
26 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
26 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
27
27
28 <title>test: c78f6c5cbea9</title>
28 <title>test: c78f6c5cbea9</title>
29 </head>
29 </head>
30 <body>
30 <body>
31 <div class="container">
31 <div class="container">
32 <div class="menu">
32 <div class="menu">
33 <div class="logo">
33 <div class="logo">
34 <a href="http://mercurial.selenic.com/">
34 <a href="http://mercurial.selenic.com/">
35 <img src="/static/hglogo.png" alt="mercurial" /></a>
35 <img src="/static/hglogo.png" alt="mercurial" /></a>
36 </div>
36 </div>
37 <ul>
37 <ul>
38 <li><a href="/shortlog/c78f6c5cbea9">log</a></li>
38 <li><a href="/shortlog/c78f6c5cbea9">log</a></li>
39 <li><a href="/graph/c78f6c5cbea9">graph</a></li>
39 <li><a href="/graph/c78f6c5cbea9">graph</a></li>
40 <li><a href="/tags">tags</a></li>
40 <li><a href="/tags">tags</a></li>
41 <li><a href="/bookmarks">bookmarks</a></li>
41 <li><a href="/branches">branches</a></li>
42 <li><a href="/branches">branches</a></li>
42 </ul>
43 </ul>
43 <ul>
44 <ul>
44 <li class="active">changeset</li>
45 <li class="active">changeset</li>
45 <li><a href="/raw-rev/c78f6c5cbea9">raw</a></li>
46 <li><a href="/raw-rev/c78f6c5cbea9">raw</a></li>
46 <li><a href="/file/c78f6c5cbea9">browse</a></li>
47 <li><a href="/file/c78f6c5cbea9">browse</a></li>
47 </ul>
48 </ul>
48 <ul>
49 <ul>
49
50
50 </ul>
51 </ul>
51 <ul>
52 <ul>
52 <li><a href="/help">help</a></li>
53 <li><a href="/help">help</a></li>
53 </ul>
54 </ul>
54 </div>
55 </div>
55
56
56 <div class="main">
57 <div class="main">
57
58
58 <h2><a href="/">test</a></h2>
59 <h2><a href="/">test</a></h2>
59 <h3>changeset 1:c78f6c5cbea9 <span class="tag">tip</span> </h3>
60 <h3>changeset 1:c78f6c5cbea9 <span class="tag">tip</span> </h3>
60
61
61 <form class="search" action="/log">
62 <form class="search" action="/log">
62
63
63 <p><input name="rev" id="search1" type="text" size="30" /></p>
64 <p><input name="rev" id="search1" type="text" size="30" /></p>
64 <div id="hint">find changesets by author, revision,
65 <div id="hint">find changesets by author, revision,
65 files, or words in the commit message</div>
66 files, or words in the commit message</div>
66 </form>
67 </form>
67
68
68 <div class="description">del</div>
69 <div class="description">del</div>
69
70
70 <table id="changesetEntry">
71 <table id="changesetEntry">
71 <tr>
72 <tr>
72 <th class="author">author</th>
73 <th class="author">author</th>
73 <td class="author">&#116;&#101;&#115;&#116;</td>
74 <td class="author">&#116;&#101;&#115;&#116;</td>
74 </tr>
75 </tr>
75 <tr>
76 <tr>
76 <th class="date">date</th>
77 <th class="date">date</th>
77 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
78 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
78 <tr>
79 <tr>
79 <th class="author">parents</th>
80 <th class="author">parents</th>
80 <td class="author"><a href="/rev/cb9a9f314b8b">cb9a9f314b8b</a> </td>
81 <td class="author"><a href="/rev/cb9a9f314b8b">cb9a9f314b8b</a> </td>
81 </tr>
82 </tr>
82 <tr>
83 <tr>
83 <th class="author">children</th>
84 <th class="author">children</th>
84 <td class="author"></td>
85 <td class="author"></td>
85 </tr>
86 </tr>
86 <tr>
87 <tr>
87 <th class="files">files</th>
88 <th class="files">files</th>
88 <td class="files">a </td>
89 <td class="files">a </td>
89 </tr>
90 </tr>
90 </table>
91 </table>
91
92
92 <div class="overflow">
93 <div class="overflow">
93 <div class="sourcefirst"> line diff</div>
94 <div class="sourcefirst"> line diff</div>
94
95
95 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- a/a Thu Jan 01 00:00:00 1970 +0000
96 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- a/a Thu Jan 01 00:00:00 1970 +0000
96 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
97 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
97 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -1,1 +0,0 @@
98 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -1,1 +0,0 @@
98 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="minusline">-a
99 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="minusline">-a
99 </span></pre></div>
100 </span></pre></div>
100 </div>
101 </div>
101
102
102 </div>
103 </div>
103 </div>
104 </div>
104
105
105
106
106 </body>
107 </body>
107 </html>
108 </html>
108
109
109
110
110 diff removed file
111 diff removed file
111
112
112 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
113 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/a'
113 200 Script output follows
114 200 Script output follows
114
115
115 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
116 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
116 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
117 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
117 <head>
118 <head>
118 <link rel="icon" href="/static/hgicon.png" type="image/png" />
119 <link rel="icon" href="/static/hgicon.png" type="image/png" />
119 <meta name="robots" content="index, nofollow" />
120 <meta name="robots" content="index, nofollow" />
120 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
121 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
121
122
122 <title>test: a diff</title>
123 <title>test: a diff</title>
123 </head>
124 </head>
124 <body>
125 <body>
125
126
126 <div class="container">
127 <div class="container">
127 <div class="menu">
128 <div class="menu">
128 <div class="logo">
129 <div class="logo">
129 <a href="http://mercurial.selenic.com/">
130 <a href="http://mercurial.selenic.com/">
130 <img src="/static/hglogo.png" alt="mercurial" /></a>
131 <img src="/static/hglogo.png" alt="mercurial" /></a>
131 </div>
132 </div>
132 <ul>
133 <ul>
133 <li><a href="/shortlog/c78f6c5cbea9">log</a></li>
134 <li><a href="/shortlog/c78f6c5cbea9">log</a></li>
134 <li><a href="/graph/c78f6c5cbea9">graph</a></li>
135 <li><a href="/graph/c78f6c5cbea9">graph</a></li>
135 <li><a href="/tags">tags</a></li>
136 <li><a href="/tags">tags</a></li>
137 <li><a href="/bookmarks">bookmarks</a></li>
136 <li><a href="/branches">branches</a></li>
138 <li><a href="/branches">branches</a></li>
137 </ul>
139 </ul>
138 <ul>
140 <ul>
139 <li><a href="/rev/c78f6c5cbea9">changeset</a></li>
141 <li><a href="/rev/c78f6c5cbea9">changeset</a></li>
140 <li><a href="/file/c78f6c5cbea9">browse</a></li>
142 <li><a href="/file/c78f6c5cbea9">browse</a></li>
141 </ul>
143 </ul>
142 <ul>
144 <ul>
143 <li><a href="/file/c78f6c5cbea9/a">file</a></li>
145 <li><a href="/file/c78f6c5cbea9/a">file</a></li>
144 <li><a href="/file/tip/a">latest</a></li>
146 <li><a href="/file/tip/a">latest</a></li>
145 <li class="active">diff</li>
147 <li class="active">diff</li>
146 <li><a href="/annotate/c78f6c5cbea9/a">annotate</a></li>
148 <li><a href="/annotate/c78f6c5cbea9/a">annotate</a></li>
147 <li><a href="/log/c78f6c5cbea9/a">file log</a></li>
149 <li><a href="/log/c78f6c5cbea9/a">file log</a></li>
148 <li><a href="/raw-file/c78f6c5cbea9/a">raw</a></li>
150 <li><a href="/raw-file/c78f6c5cbea9/a">raw</a></li>
149 </ul>
151 </ul>
150 <ul>
152 <ul>
151 <li><a href="/help">help</a></li>
153 <li><a href="/help">help</a></li>
152 </ul>
154 </ul>
153 </div>
155 </div>
154
156
155 <div class="main">
157 <div class="main">
156 <h2><a href="/">test</a></h2>
158 <h2><a href="/">test</a></h2>
157 <h3>diff a @ 1:c78f6c5cbea9</h3>
159 <h3>diff a @ 1:c78f6c5cbea9</h3>
158
160
159 <form class="search" action="/log">
161 <form class="search" action="/log">
160 <p></p>
162 <p></p>
161 <p><input name="rev" id="search1" type="text" size="30" /></p>
163 <p><input name="rev" id="search1" type="text" size="30" /></p>
162 <div id="hint">find changesets by author, revision,
164 <div id="hint">find changesets by author, revision,
163 files, or words in the commit message</div>
165 files, or words in the commit message</div>
164 </form>
166 </form>
165
167
166 <div class="description">del</div>
168 <div class="description">del</div>
167
169
168 <table id="changesetEntry">
170 <table id="changesetEntry">
169 <tr>
171 <tr>
170 <th>author</th>
172 <th>author</th>
171 <td>&#116;&#101;&#115;&#116;</td>
173 <td>&#116;&#101;&#115;&#116;</td>
172 </tr>
174 </tr>
173 <tr>
175 <tr>
174 <th>date</th>
176 <th>date</th>
175 <td>Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
177 <td>Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
176 </tr>
178 </tr>
177 <tr>
179 <tr>
178 <th>parents</th>
180 <th>parents</th>
179 <td><a href="/file/cb9a9f314b8b/a">cb9a9f314b8b</a> </td>
181 <td><a href="/file/cb9a9f314b8b/a">cb9a9f314b8b</a> </td>
180 </tr>
182 </tr>
181 <tr>
183 <tr>
182 <th>children</th>
184 <th>children</th>
183 <td></td>
185 <td></td>
184 </tr>
186 </tr>
185
187
186 </table>
188 </table>
187
189
188 <div class="overflow">
190 <div class="overflow">
189 <div class="sourcefirst"> line diff</div>
191 <div class="sourcefirst"> line diff</div>
190
192
191 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- a/a Thu Jan 01 00:00:00 1970 +0000
193 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- a/a Thu Jan 01 00:00:00 1970 +0000
192 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
194 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
193 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -1,1 +0,0 @@
195 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -1,1 +0,0 @@
194 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="minusline">-a
196 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="minusline">-a
195 </span></pre></div>
197 </span></pre></div>
196 </div>
198 </div>
197 </div>
199 </div>
198 </div>
200 </div>
199
201
200
202
201
203
202 </body>
204 </body>
203 </html>
205 </html>
204
206
@@ -1,430 +1,433 b''
1 Some tests for hgweb. Tests static files, plain files and different 404's.
1 Some tests for hgweb. Tests static files, plain files and different 404's.
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ mkdir da
5 $ mkdir da
6 $ echo foo > da/foo
6 $ echo foo > da/foo
7 $ echo foo > foo
7 $ echo foo > foo
8 $ hg ci -Ambase
8 $ hg ci -Ambase
9 adding da/foo
9 adding da/foo
10 adding foo
10 adding foo
11 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
11 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
12 $ cat hg.pid >> $DAEMON_PIDS
12 $ cat hg.pid >> $DAEMON_PIDS
13
13
14 manifest
14 manifest
15
15
16 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/?style=raw')
16 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/?style=raw')
17 200 Script output follows
17 200 Script output follows
18
18
19
19
20 drwxr-xr-x da
20 drwxr-xr-x da
21 -rw-r--r-- 4 foo
21 -rw-r--r-- 4 foo
22
22
23
23
24 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/da?style=raw')
24 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/da?style=raw')
25 200 Script output follows
25 200 Script output follows
26
26
27
27
28 -rw-r--r-- 4 foo
28 -rw-r--r-- 4 foo
29
29
30
30
31
31
32 plain file
32 plain file
33
33
34 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/foo?style=raw'
34 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/foo?style=raw'
35 200 Script output follows
35 200 Script output follows
36
36
37 foo
37 foo
38
38
39 should give a 404 - static file that does not exist
39 should give a 404 - static file that does not exist
40
40
41 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/static/bogus'
41 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/static/bogus'
42 404 Not Found
42 404 Not Found
43
43
44 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
44 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
45 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
45 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
46 <head>
46 <head>
47 <link rel="icon" href="/static/hgicon.png" type="image/png" />
47 <link rel="icon" href="/static/hgicon.png" type="image/png" />
48 <meta name="robots" content="index, nofollow" />
48 <meta name="robots" content="index, nofollow" />
49 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
49 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
50
50
51 <title>test: error</title>
51 <title>test: error</title>
52 </head>
52 </head>
53 <body>
53 <body>
54
54
55 <div class="container">
55 <div class="container">
56 <div class="menu">
56 <div class="menu">
57 <div class="logo">
57 <div class="logo">
58 <a href="http://mercurial.selenic.com/">
58 <a href="http://mercurial.selenic.com/">
59 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
59 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
60 </div>
60 </div>
61 <ul>
61 <ul>
62 <li><a href="/shortlog">log</a></li>
62 <li><a href="/shortlog">log</a></li>
63 <li><a href="/graph">graph</a></li>
63 <li><a href="/graph">graph</a></li>
64 <li><a href="/tags">tags</a></li>
64 <li><a href="/tags">tags</a></li>
65 <li><a href="/bookmarks">bookmarks</a></li>
65 <li><a href="/branches">branches</a></li>
66 <li><a href="/branches">branches</a></li>
66 <li><a href="/help">help</a></li>
67 <li><a href="/help">help</a></li>
67 </ul>
68 </ul>
68 </div>
69 </div>
69
70
70 <div class="main">
71 <div class="main">
71
72
72 <h2><a href="/">test</a></h2>
73 <h2><a href="/">test</a></h2>
73 <h3>error</h3>
74 <h3>error</h3>
74
75
75 <form class="search" action="/log">
76 <form class="search" action="/log">
76
77
77 <p><input name="rev" id="search1" type="text" size="30"></p>
78 <p><input name="rev" id="search1" type="text" size="30"></p>
78 <div id="hint">find changesets by author, revision,
79 <div id="hint">find changesets by author, revision,
79 files, or words in the commit message</div>
80 files, or words in the commit message</div>
80 </form>
81 </form>
81
82
82 <div class="description">
83 <div class="description">
83 <p>
84 <p>
84 An error occurred while processing your request:
85 An error occurred while processing your request:
85 </p>
86 </p>
86 <p>
87 <p>
87 Not Found
88 Not Found
88 </p>
89 </p>
89 </div>
90 </div>
90 </div>
91 </div>
91 </div>
92 </div>
92
93
93
94
94
95
95 </body>
96 </body>
96 </html>
97 </html>
97
98
98 [1]
99 [1]
99
100
100 should give a 404 - bad revision
101 should give a 404 - bad revision
101
102
102 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/spam/foo?style=raw'
103 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/spam/foo?style=raw'
103 404 Not Found
104 404 Not Found
104
105
105
106
106 error: revision not found: spam
107 error: revision not found: spam
107 [1]
108 [1]
108
109
109 should give a 400 - bad command
110 should give a 400 - bad command
110
111
111 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/foo?cmd=spam&style=raw'
112 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/foo?cmd=spam&style=raw'
112 400* (glob)
113 400* (glob)
113
114
114
115
115 error: no such method: spam
116 error: no such method: spam
116 [1]
117 [1]
117
118
118 should give a 404 - file does not exist
119 should give a 404 - file does not exist
119
120
120 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/bork?style=raw'
121 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/bork?style=raw'
121 404 Not Found
122 404 Not Found
122
123
123
124
124 error: bork@2ef0ac749a14: not found in manifest
125 error: bork@2ef0ac749a14: not found in manifest
125 [1]
126 [1]
126 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/bork'
127 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/bork'
127 404 Not Found
128 404 Not Found
128
129
129 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
130 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
130 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
131 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
131 <head>
132 <head>
132 <link rel="icon" href="/static/hgicon.png" type="image/png" />
133 <link rel="icon" href="/static/hgicon.png" type="image/png" />
133 <meta name="robots" content="index, nofollow" />
134 <meta name="robots" content="index, nofollow" />
134 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
135 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
135
136
136 <title>test: error</title>
137 <title>test: error</title>
137 </head>
138 </head>
138 <body>
139 <body>
139
140
140 <div class="container">
141 <div class="container">
141 <div class="menu">
142 <div class="menu">
142 <div class="logo">
143 <div class="logo">
143 <a href="http://mercurial.selenic.com/">
144 <a href="http://mercurial.selenic.com/">
144 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
145 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
145 </div>
146 </div>
146 <ul>
147 <ul>
147 <li><a href="/shortlog">log</a></li>
148 <li><a href="/shortlog">log</a></li>
148 <li><a href="/graph">graph</a></li>
149 <li><a href="/graph">graph</a></li>
149 <li><a href="/tags">tags</a></li>
150 <li><a href="/tags">tags</a></li>
151 <li><a href="/bookmarks">bookmarks</a></li>
150 <li><a href="/branches">branches</a></li>
152 <li><a href="/branches">branches</a></li>
151 <li><a href="/help">help</a></li>
153 <li><a href="/help">help</a></li>
152 </ul>
154 </ul>
153 </div>
155 </div>
154
156
155 <div class="main">
157 <div class="main">
156
158
157 <h2><a href="/">test</a></h2>
159 <h2><a href="/">test</a></h2>
158 <h3>error</h3>
160 <h3>error</h3>
159
161
160 <form class="search" action="/log">
162 <form class="search" action="/log">
161
163
162 <p><input name="rev" id="search1" type="text" size="30"></p>
164 <p><input name="rev" id="search1" type="text" size="30"></p>
163 <div id="hint">find changesets by author, revision,
165 <div id="hint">find changesets by author, revision,
164 files, or words in the commit message</div>
166 files, or words in the commit message</div>
165 </form>
167 </form>
166
168
167 <div class="description">
169 <div class="description">
168 <p>
170 <p>
169 An error occurred while processing your request:
171 An error occurred while processing your request:
170 </p>
172 </p>
171 <p>
173 <p>
172 bork@2ef0ac749a14: not found in manifest
174 bork@2ef0ac749a14: not found in manifest
173 </p>
175 </p>
174 </div>
176 </div>
175 </div>
177 </div>
176 </div>
178 </div>
177
179
178
180
179
181
180 </body>
182 </body>
181 </html>
183 </html>
182
184
183 [1]
185 [1]
184 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/bork?style=raw'
186 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/bork?style=raw'
185 404 Not Found
187 404 Not Found
186
188
187
189
188 error: bork@2ef0ac749a14: not found in manifest
190 error: bork@2ef0ac749a14: not found in manifest
189 [1]
191 [1]
190
192
191 try bad style
193 try bad style
192
194
193 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/?style=foobar')
195 $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/?style=foobar')
194 200 Script output follows
196 200 Script output follows
195
197
196 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
198 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
197 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
199 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
198 <head>
200 <head>
199 <link rel="icon" href="/static/hgicon.png" type="image/png" />
201 <link rel="icon" href="/static/hgicon.png" type="image/png" />
200 <meta name="robots" content="index, nofollow" />
202 <meta name="robots" content="index, nofollow" />
201 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
203 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
202
204
203 <title>test: 2ef0ac749a14 /</title>
205 <title>test: 2ef0ac749a14 /</title>
204 </head>
206 </head>
205 <body>
207 <body>
206
208
207 <div class="container">
209 <div class="container">
208 <div class="menu">
210 <div class="menu">
209 <div class="logo">
211 <div class="logo">
210 <a href="http://mercurial.selenic.com/">
212 <a href="http://mercurial.selenic.com/">
211 <img src="/static/hglogo.png" alt="mercurial" /></a>
213 <img src="/static/hglogo.png" alt="mercurial" /></a>
212 </div>
214 </div>
213 <ul>
215 <ul>
214 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
216 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
215 <li><a href="/graph/2ef0ac749a14">graph</a></li>
217 <li><a href="/graph/2ef0ac749a14">graph</a></li>
216 <li><a href="/tags">tags</a></li>
218 <li><a href="/tags">tags</a></li>
219 <li><a href="/bookmarks">bookmarks</a></li>
217 <li><a href="/branches">branches</a></li>
220 <li><a href="/branches">branches</a></li>
218 </ul>
221 </ul>
219 <ul>
222 <ul>
220 <li><a href="/rev/2ef0ac749a14">changeset</a></li>
223 <li><a href="/rev/2ef0ac749a14">changeset</a></li>
221 <li class="active">browse</li>
224 <li class="active">browse</li>
222 </ul>
225 </ul>
223 <ul>
226 <ul>
224
227
225 </ul>
228 </ul>
226 <ul>
229 <ul>
227 <li><a href="/help">help</a></li>
230 <li><a href="/help">help</a></li>
228 </ul>
231 </ul>
229 </div>
232 </div>
230
233
231 <div class="main">
234 <div class="main">
232 <h2><a href="/">test</a></h2>
235 <h2><a href="/">test</a></h2>
233 <h3>directory / @ 0:2ef0ac749a14 <span class="tag">tip</span> </h3>
236 <h3>directory / @ 0:2ef0ac749a14 <span class="tag">tip</span> </h3>
234
237
235 <form class="search" action="/log">
238 <form class="search" action="/log">
236
239
237 <p><input name="rev" id="search1" type="text" size="30" /></p>
240 <p><input name="rev" id="search1" type="text" size="30" /></p>
238 <div id="hint">find changesets by author, revision,
241 <div id="hint">find changesets by author, revision,
239 files, or words in the commit message</div>
242 files, or words in the commit message</div>
240 </form>
243 </form>
241
244
242 <table class="bigtable">
245 <table class="bigtable">
243 <tr>
246 <tr>
244 <th class="name">name</th>
247 <th class="name">name</th>
245 <th class="size">size</th>
248 <th class="size">size</th>
246 <th class="permissions">permissions</th>
249 <th class="permissions">permissions</th>
247 </tr>
250 </tr>
248 <tr class="fileline parity0">
251 <tr class="fileline parity0">
249 <td class="name"><a href="/file/2ef0ac749a14/">[up]</a></td>
252 <td class="name"><a href="/file/2ef0ac749a14/">[up]</a></td>
250 <td class="size"></td>
253 <td class="size"></td>
251 <td class="permissions">drwxr-xr-x</td>
254 <td class="permissions">drwxr-xr-x</td>
252 </tr>
255 </tr>
253
256
254 <tr class="fileline parity1">
257 <tr class="fileline parity1">
255 <td class="name">
258 <td class="name">
256 <a href="/file/2ef0ac749a14/da">
259 <a href="/file/2ef0ac749a14/da">
257 <img src="/static/coal-folder.png" alt="dir."/> da/
260 <img src="/static/coal-folder.png" alt="dir."/> da/
258 </a>
261 </a>
259 <a href="/file/2ef0ac749a14/da/">
262 <a href="/file/2ef0ac749a14/da/">
260
263
261 </a>
264 </a>
262 </td>
265 </td>
263 <td class="size"></td>
266 <td class="size"></td>
264 <td class="permissions">drwxr-xr-x</td>
267 <td class="permissions">drwxr-xr-x</td>
265 </tr>
268 </tr>
266
269
267 <tr class="fileline parity0">
270 <tr class="fileline parity0">
268 <td class="filename">
271 <td class="filename">
269 <a href="/file/2ef0ac749a14/foo">
272 <a href="/file/2ef0ac749a14/foo">
270 <img src="/static/coal-file.png" alt="file"/> foo
273 <img src="/static/coal-file.png" alt="file"/> foo
271 </a>
274 </a>
272 </td>
275 </td>
273 <td class="size">4</td>
276 <td class="size">4</td>
274 <td class="permissions">-rw-r--r--</td>
277 <td class="permissions">-rw-r--r--</td>
275 </tr>
278 </tr>
276 </table>
279 </table>
277 </div>
280 </div>
278 </div>
281 </div>
279
282
280
283
281 </body>
284 </body>
282 </html>
285 </html>
283
286
284
287
285 stop and restart
288 stop and restart
286
289
287 $ "$TESTDIR/killdaemons.py"
290 $ "$TESTDIR/killdaemons.py"
288 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log
291 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log
289 $ cat hg.pid >> $DAEMON_PIDS
292 $ cat hg.pid >> $DAEMON_PIDS
290
293
291 Test the access/error files are opened in append mode
294 Test the access/error files are opened in append mode
292
295
293 $ python -c "print len(file('access.log').readlines()), 'log lines written'"
296 $ python -c "print len(file('access.log').readlines()), 'log lines written'"
294 10 log lines written
297 10 log lines written
295
298
296 static file
299 static file
297
300
298 $ "$TESTDIR/get-with-headers.py" --twice localhost:$HGPORT '/static/style-gitweb.css'
301 $ "$TESTDIR/get-with-headers.py" --twice localhost:$HGPORT '/static/style-gitweb.css'
299 200 Script output follows
302 200 Script output follows
300
303
301 body { font-family: sans-serif; font-size: 12px; margin:0px; border:solid #d9d8d1; border-width:1px; margin:10px; }
304 body { font-family: sans-serif; font-size: 12px; margin:0px; border:solid #d9d8d1; border-width:1px; margin:10px; }
302 a { color:#0000cc; }
305 a { color:#0000cc; }
303 a:hover, a:visited, a:active { color:#880000; }
306 a:hover, a:visited, a:active { color:#880000; }
304 div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
307 div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
305 div.page_header a:visited { color:#0000cc; }
308 div.page_header a:visited { color:#0000cc; }
306 div.page_header a:hover { color:#880000; }
309 div.page_header a:hover { color:#880000; }
307 div.page_nav { padding:8px; }
310 div.page_nav { padding:8px; }
308 div.page_nav a:visited { color:#0000cc; }
311 div.page_nav a:visited { color:#0000cc; }
309 div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
312 div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
310 div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
313 div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
311 div.page_footer_text { float:left; color:#555555; font-style:italic; }
314 div.page_footer_text { float:left; color:#555555; font-style:italic; }
312 div.page_body { padding:8px; }
315 div.page_body { padding:8px; }
313 div.title, a.title {
316 div.title, a.title {
314 display:block; padding:6px 8px;
317 display:block; padding:6px 8px;
315 font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
318 font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
316 }
319 }
317 a.title:hover { background-color: #d9d8d1; }
320 a.title:hover { background-color: #d9d8d1; }
318 div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
321 div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
319 div.log_body { padding:8px 8px 8px 150px; }
322 div.log_body { padding:8px 8px 8px 150px; }
320 .age { white-space:nowrap; }
323 .age { white-space:nowrap; }
321 span.age { position:relative; float:left; width:142px; font-style:italic; }
324 span.age { position:relative; float:left; width:142px; font-style:italic; }
322 div.log_link {
325 div.log_link {
323 padding:0px 8px;
326 padding:0px 8px;
324 font-size:10px; font-family:sans-serif; font-style:normal;
327 font-size:10px; font-family:sans-serif; font-style:normal;
325 position:relative; float:left; width:136px;
328 position:relative; float:left; width:136px;
326 }
329 }
327 div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
330 div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
328 a.list { text-decoration:none; color:#000000; }
331 a.list { text-decoration:none; color:#000000; }
329 a.list:hover { text-decoration:underline; color:#880000; }
332 a.list:hover { text-decoration:underline; color:#880000; }
330 table { padding:8px 4px; }
333 table { padding:8px 4px; }
331 th { padding:2px 5px; font-size:12px; text-align:left; }
334 th { padding:2px 5px; font-size:12px; text-align:left; }
332 tr.light:hover, .parity0:hover { background-color:#edece6; }
335 tr.light:hover, .parity0:hover { background-color:#edece6; }
333 tr.dark, .parity1 { background-color:#f6f6f0; }
336 tr.dark, .parity1 { background-color:#f6f6f0; }
334 tr.dark:hover, .parity1:hover { background-color:#edece6; }
337 tr.dark:hover, .parity1:hover { background-color:#edece6; }
335 td { padding:2px 5px; font-size:12px; vertical-align:top; }
338 td { padding:2px 5px; font-size:12px; vertical-align:top; }
336 td.closed { background-color: #99f; }
339 td.closed { background-color: #99f; }
337 td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
340 td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
338 td.indexlinks { white-space: nowrap; }
341 td.indexlinks { white-space: nowrap; }
339 td.indexlinks a {
342 td.indexlinks a {
340 padding: 2px 5px; line-height: 10px;
343 padding: 2px 5px; line-height: 10px;
341 border: 1px solid;
344 border: 1px solid;
342 color: #ffffff; background-color: #7777bb;
345 color: #ffffff; background-color: #7777bb;
343 border-color: #aaaadd #333366 #333366 #aaaadd;
346 border-color: #aaaadd #333366 #333366 #aaaadd;
344 font-weight: bold; text-align: center; text-decoration: none;
347 font-weight: bold; text-align: center; text-decoration: none;
345 font-size: 10px;
348 font-size: 10px;
346 }
349 }
347 td.indexlinks a:hover { background-color: #6666aa; }
350 td.indexlinks a:hover { background-color: #6666aa; }
348 div.pre { font-family:monospace; font-size:12px; white-space:pre; }
351 div.pre { font-family:monospace; font-size:12px; white-space:pre; }
349 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
352 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
350 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
353 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
351 div.search { margin:4px 8px; position:absolute; top:56px; right:12px }
354 div.search { margin:4px 8px; position:absolute; top:56px; right:12px }
352 .linenr { color:#999999; text-decoration:none }
355 .linenr { color:#999999; text-decoration:none }
353 div.rss_logo { float: right; white-space: nowrap; }
356 div.rss_logo { float: right; white-space: nowrap; }
354 div.rss_logo a {
357 div.rss_logo a {
355 padding:3px 6px; line-height:10px;
358 padding:3px 6px; line-height:10px;
356 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
359 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
357 color:#ffffff; background-color:#ff6600;
360 color:#ffffff; background-color:#ff6600;
358 font-weight:bold; font-family:sans-serif; font-size:10px;
361 font-weight:bold; font-family:sans-serif; font-size:10px;
359 text-align:center; text-decoration:none;
362 text-align:center; text-decoration:none;
360 }
363 }
361 div.rss_logo a:hover { background-color:#ee5500; }
364 div.rss_logo a:hover { background-color:#ee5500; }
362 pre { margin: 0; }
365 pre { margin: 0; }
363 span.logtags span {
366 span.logtags span {
364 padding: 0px 4px;
367 padding: 0px 4px;
365 font-size: 10px;
368 font-size: 10px;
366 font-weight: normal;
369 font-weight: normal;
367 border: 1px solid;
370 border: 1px solid;
368 background-color: #ffaaff;
371 background-color: #ffaaff;
369 border-color: #ffccff #ff00ee #ff00ee #ffccff;
372 border-color: #ffccff #ff00ee #ff00ee #ffccff;
370 }
373 }
371 span.logtags span.tagtag {
374 span.logtags span.tagtag {
372 background-color: #ffffaa;
375 background-color: #ffffaa;
373 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
376 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
374 }
377 }
375 span.logtags span.branchtag {
378 span.logtags span.branchtag {
376 background-color: #aaffaa;
379 background-color: #aaffaa;
377 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
380 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
378 }
381 }
379 span.logtags span.inbranchtag {
382 span.logtags span.inbranchtag {
380 background-color: #d5dde6;
383 background-color: #d5dde6;
381 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
384 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
382 }
385 }
383
386
384 /* Graph */
387 /* Graph */
385 div#wrapper {
388 div#wrapper {
386 position: relative;
389 position: relative;
387 margin: 0;
390 margin: 0;
388 padding: 0;
391 padding: 0;
389 margin-top: 3px;
392 margin-top: 3px;
390 }
393 }
391
394
392 canvas {
395 canvas {
393 position: absolute;
396 position: absolute;
394 z-index: 5;
397 z-index: 5;
395 top: -0.9em;
398 top: -0.9em;
396 margin: 0;
399 margin: 0;
397 }
400 }
398
401
399 ul#nodebgs {
402 ul#nodebgs {
400 list-style: none inside none;
403 list-style: none inside none;
401 padding: 0;
404 padding: 0;
402 margin: 0;
405 margin: 0;
403 top: -0.7em;
406 top: -0.7em;
404 }
407 }
405
408
406 ul#graphnodes li, ul#nodebgs li {
409 ul#graphnodes li, ul#nodebgs li {
407 height: 39px;
410 height: 39px;
408 }
411 }
409
412
410 ul#graphnodes {
413 ul#graphnodes {
411 position: absolute;
414 position: absolute;
412 z-index: 10;
415 z-index: 10;
413 top: -0.8em;
416 top: -0.8em;
414 list-style: none inside none;
417 list-style: none inside none;
415 padding: 0;
418 padding: 0;
416 }
419 }
417
420
418 ul#graphnodes li .info {
421 ul#graphnodes li .info {
419 display: block;
422 display: block;
420 font-size: 100%;
423 font-size: 100%;
421 position: relative;
424 position: relative;
422 top: -3px;
425 top: -3px;
423 font-style: italic;
426 font-style: italic;
424 }
427 }
425 304 Not Modified
428 304 Not Modified
426
429
427
430
428 errors
431 errors
429
432
430 $ cat errors.log
433 $ cat errors.log
General Comments 0
You need to be logged in to leave comments. Login now