##// END OF EJS Templates
paper: show current revision on file log page...
av6 -
r27081:37290f2f default
parent child Browse files
Show More
@@ -1,1340 +1,1344 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 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import cgi
10 import cgi
11 import copy
11 import copy
12 import mimetypes
12 import mimetypes
13 import os
13 import os
14 import re
14 import re
15
15
16 from ..i18n import _
16 from ..i18n import _
17 from ..node import hex, short
17 from ..node import hex, short
18
18
19 from .common import (
19 from .common import (
20 ErrorResponse,
20 ErrorResponse,
21 HTTP_FORBIDDEN,
21 HTTP_FORBIDDEN,
22 HTTP_NOT_FOUND,
22 HTTP_NOT_FOUND,
23 HTTP_OK,
23 HTTP_OK,
24 get_contact,
24 get_contact,
25 paritygen,
25 paritygen,
26 staticfile,
26 staticfile,
27 )
27 )
28
28
29 from .. import (
29 from .. import (
30 archival,
30 archival,
31 encoding,
31 encoding,
32 error,
32 error,
33 graphmod,
33 graphmod,
34 patch,
34 patch,
35 revset,
35 revset,
36 scmutil,
36 scmutil,
37 templatefilters,
37 templatefilters,
38 templater,
38 templater,
39 util,
39 util,
40 )
40 )
41
41
42 from . import (
42 from . import (
43 webutil,
43 webutil,
44 )
44 )
45
45
46 __all__ = []
46 __all__ = []
47 commands = {}
47 commands = {}
48
48
49 class webcommand(object):
49 class webcommand(object):
50 """Decorator used to register a web command handler.
50 """Decorator used to register a web command handler.
51
51
52 The decorator takes as its positional arguments the name/path the
52 The decorator takes as its positional arguments the name/path the
53 command should be accessible under.
53 command should be accessible under.
54
54
55 Usage:
55 Usage:
56
56
57 @webcommand('mycommand')
57 @webcommand('mycommand')
58 def mycommand(web, req, tmpl):
58 def mycommand(web, req, tmpl):
59 pass
59 pass
60 """
60 """
61
61
62 def __init__(self, name):
62 def __init__(self, name):
63 self.name = name
63 self.name = name
64
64
65 def __call__(self, func):
65 def __call__(self, func):
66 __all__.append(self.name)
66 __all__.append(self.name)
67 commands[self.name] = func
67 commands[self.name] = func
68 return func
68 return func
69
69
70 @webcommand('log')
70 @webcommand('log')
71 def log(web, req, tmpl):
71 def log(web, req, tmpl):
72 """
72 """
73 /log[/{revision}[/{path}]]
73 /log[/{revision}[/{path}]]
74 --------------------------
74 --------------------------
75
75
76 Show repository or file history.
76 Show repository or file history.
77
77
78 For URLs of the form ``/log/{revision}``, a list of changesets starting at
78 For URLs of the form ``/log/{revision}``, a list of changesets starting at
79 the specified changeset identifier is shown. If ``{revision}`` is not
79 the specified changeset identifier is shown. If ``{revision}`` is not
80 defined, the default is ``tip``. This form is equivalent to the
80 defined, the default is ``tip``. This form is equivalent to the
81 ``changelog`` handler.
81 ``changelog`` handler.
82
82
83 For URLs of the form ``/log/{revision}/{file}``, the history for a specific
83 For URLs of the form ``/log/{revision}/{file}``, the history for a specific
84 file will be shown. This form is equivalent to the ``filelog`` handler.
84 file will be shown. This form is equivalent to the ``filelog`` handler.
85 """
85 """
86
86
87 if 'file' in req.form and req.form['file'][0]:
87 if 'file' in req.form and req.form['file'][0]:
88 return filelog(web, req, tmpl)
88 return filelog(web, req, tmpl)
89 else:
89 else:
90 return changelog(web, req, tmpl)
90 return changelog(web, req, tmpl)
91
91
92 @webcommand('rawfile')
92 @webcommand('rawfile')
93 def rawfile(web, req, tmpl):
93 def rawfile(web, req, tmpl):
94 guessmime = web.configbool('web', 'guessmime', False)
94 guessmime = web.configbool('web', 'guessmime', False)
95
95
96 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
96 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
97 if not path:
97 if not path:
98 content = manifest(web, req, tmpl)
98 content = manifest(web, req, tmpl)
99 req.respond(HTTP_OK, web.ctype)
99 req.respond(HTTP_OK, web.ctype)
100 return content
100 return content
101
101
102 try:
102 try:
103 fctx = webutil.filectx(web.repo, req)
103 fctx = webutil.filectx(web.repo, req)
104 except error.LookupError as inst:
104 except error.LookupError as inst:
105 try:
105 try:
106 content = manifest(web, req, tmpl)
106 content = manifest(web, req, tmpl)
107 req.respond(HTTP_OK, web.ctype)
107 req.respond(HTTP_OK, web.ctype)
108 return content
108 return content
109 except ErrorResponse:
109 except ErrorResponse:
110 raise inst
110 raise inst
111
111
112 path = fctx.path()
112 path = fctx.path()
113 text = fctx.data()
113 text = fctx.data()
114 mt = 'application/binary'
114 mt = 'application/binary'
115 if guessmime:
115 if guessmime:
116 mt = mimetypes.guess_type(path)[0]
116 mt = mimetypes.guess_type(path)[0]
117 if mt is None:
117 if mt is None:
118 if util.binary(text):
118 if util.binary(text):
119 mt = 'application/binary'
119 mt = 'application/binary'
120 else:
120 else:
121 mt = 'text/plain'
121 mt = 'text/plain'
122 if mt.startswith('text/'):
122 if mt.startswith('text/'):
123 mt += '; charset="%s"' % encoding.encoding
123 mt += '; charset="%s"' % encoding.encoding
124
124
125 req.respond(HTTP_OK, mt, path, body=text)
125 req.respond(HTTP_OK, mt, path, body=text)
126 return []
126 return []
127
127
128 def _filerevision(web, req, tmpl, fctx):
128 def _filerevision(web, req, tmpl, fctx):
129 f = fctx.path()
129 f = fctx.path()
130 text = fctx.data()
130 text = fctx.data()
131 parity = paritygen(web.stripecount)
131 parity = paritygen(web.stripecount)
132
132
133 if util.binary(text):
133 if util.binary(text):
134 mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
134 mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
135 text = '(binary:%s)' % mt
135 text = '(binary:%s)' % mt
136
136
137 def lines():
137 def lines():
138 for lineno, t in enumerate(text.splitlines(True)):
138 for lineno, t in enumerate(text.splitlines(True)):
139 yield {"line": t,
139 yield {"line": t,
140 "lineid": "l%d" % (lineno + 1),
140 "lineid": "l%d" % (lineno + 1),
141 "linenumber": "% 6d" % (lineno + 1),
141 "linenumber": "% 6d" % (lineno + 1),
142 "parity": parity.next()}
142 "parity": parity.next()}
143
143
144 return tmpl("filerevision",
144 return tmpl("filerevision",
145 file=f,
145 file=f,
146 path=webutil.up(f),
146 path=webutil.up(f),
147 text=lines(),
147 text=lines(),
148 rev=fctx.rev(),
148 rev=fctx.rev(),
149 symrev=webutil.symrevorshortnode(req, fctx),
149 symrev=webutil.symrevorshortnode(req, fctx),
150 node=fctx.hex(),
150 node=fctx.hex(),
151 author=fctx.user(),
151 author=fctx.user(),
152 date=fctx.date(),
152 date=fctx.date(),
153 desc=fctx.description(),
153 desc=fctx.description(),
154 extra=fctx.extra(),
154 extra=fctx.extra(),
155 branch=webutil.nodebranchnodefault(fctx),
155 branch=webutil.nodebranchnodefault(fctx),
156 parent=webutil.parents(fctx),
156 parent=webutil.parents(fctx),
157 child=webutil.children(fctx),
157 child=webutil.children(fctx),
158 rename=webutil.renamelink(fctx),
158 rename=webutil.renamelink(fctx),
159 tags=webutil.nodetagsdict(web.repo, fctx.node()),
159 tags=webutil.nodetagsdict(web.repo, fctx.node()),
160 bookmarks=webutil.nodebookmarksdict(web.repo, fctx.node()),
160 bookmarks=webutil.nodebookmarksdict(web.repo, fctx.node()),
161 permissions=fctx.manifest().flags(f))
161 permissions=fctx.manifest().flags(f))
162
162
163 @webcommand('file')
163 @webcommand('file')
164 def file(web, req, tmpl):
164 def file(web, req, tmpl):
165 """
165 """
166 /file/{revision}[/{path}]
166 /file/{revision}[/{path}]
167 -------------------------
167 -------------------------
168
168
169 Show information about a directory or file in the repository.
169 Show information about a directory or file in the repository.
170
170
171 Info about the ``path`` given as a URL parameter will be rendered.
171 Info about the ``path`` given as a URL parameter will be rendered.
172
172
173 If ``path`` is a directory, information about the entries in that
173 If ``path`` is a directory, information about the entries in that
174 directory will be rendered. This form is equivalent to the ``manifest``
174 directory will be rendered. This form is equivalent to the ``manifest``
175 handler.
175 handler.
176
176
177 If ``path`` is a file, information about that file will be shown via
177 If ``path`` is a file, information about that file will be shown via
178 the ``filerevision`` template.
178 the ``filerevision`` template.
179
179
180 If ``path`` is not defined, information about the root directory will
180 If ``path`` is not defined, information about the root directory will
181 be rendered.
181 be rendered.
182 """
182 """
183 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
183 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
184 if not path:
184 if not path:
185 return manifest(web, req, tmpl)
185 return manifest(web, req, tmpl)
186 try:
186 try:
187 return _filerevision(web, req, tmpl, webutil.filectx(web.repo, req))
187 return _filerevision(web, req, tmpl, webutil.filectx(web.repo, req))
188 except error.LookupError as inst:
188 except error.LookupError as inst:
189 try:
189 try:
190 return manifest(web, req, tmpl)
190 return manifest(web, req, tmpl)
191 except ErrorResponse:
191 except ErrorResponse:
192 raise inst
192 raise inst
193
193
194 def _search(web, req, tmpl):
194 def _search(web, req, tmpl):
195 MODE_REVISION = 'rev'
195 MODE_REVISION = 'rev'
196 MODE_KEYWORD = 'keyword'
196 MODE_KEYWORD = 'keyword'
197 MODE_REVSET = 'revset'
197 MODE_REVSET = 'revset'
198
198
199 def revsearch(ctx):
199 def revsearch(ctx):
200 yield ctx
200 yield ctx
201
201
202 def keywordsearch(query):
202 def keywordsearch(query):
203 lower = encoding.lower
203 lower = encoding.lower
204 qw = lower(query).split()
204 qw = lower(query).split()
205
205
206 def revgen():
206 def revgen():
207 cl = web.repo.changelog
207 cl = web.repo.changelog
208 for i in xrange(len(web.repo) - 1, 0, -100):
208 for i in xrange(len(web.repo) - 1, 0, -100):
209 l = []
209 l = []
210 for j in cl.revs(max(0, i - 99), i):
210 for j in cl.revs(max(0, i - 99), i):
211 ctx = web.repo[j]
211 ctx = web.repo[j]
212 l.append(ctx)
212 l.append(ctx)
213 l.reverse()
213 l.reverse()
214 for e in l:
214 for e in l:
215 yield e
215 yield e
216
216
217 for ctx in revgen():
217 for ctx in revgen():
218 miss = 0
218 miss = 0
219 for q in qw:
219 for q in qw:
220 if not (q in lower(ctx.user()) or
220 if not (q in lower(ctx.user()) or
221 q in lower(ctx.description()) or
221 q in lower(ctx.description()) or
222 q in lower(" ".join(ctx.files()))):
222 q in lower(" ".join(ctx.files()))):
223 miss = 1
223 miss = 1
224 break
224 break
225 if miss:
225 if miss:
226 continue
226 continue
227
227
228 yield ctx
228 yield ctx
229
229
230 def revsetsearch(revs):
230 def revsetsearch(revs):
231 for r in revs:
231 for r in revs:
232 yield web.repo[r]
232 yield web.repo[r]
233
233
234 searchfuncs = {
234 searchfuncs = {
235 MODE_REVISION: (revsearch, 'exact revision search'),
235 MODE_REVISION: (revsearch, 'exact revision search'),
236 MODE_KEYWORD: (keywordsearch, 'literal keyword search'),
236 MODE_KEYWORD: (keywordsearch, 'literal keyword search'),
237 MODE_REVSET: (revsetsearch, 'revset expression search'),
237 MODE_REVSET: (revsetsearch, 'revset expression search'),
238 }
238 }
239
239
240 def getsearchmode(query):
240 def getsearchmode(query):
241 try:
241 try:
242 ctx = web.repo[query]
242 ctx = web.repo[query]
243 except (error.RepoError, error.LookupError):
243 except (error.RepoError, error.LookupError):
244 # query is not an exact revision pointer, need to
244 # query is not an exact revision pointer, need to
245 # decide if it's a revset expression or keywords
245 # decide if it's a revset expression or keywords
246 pass
246 pass
247 else:
247 else:
248 return MODE_REVISION, ctx
248 return MODE_REVISION, ctx
249
249
250 revdef = 'reverse(%s)' % query
250 revdef = 'reverse(%s)' % query
251 try:
251 try:
252 tree = revset.parse(revdef)
252 tree = revset.parse(revdef)
253 except error.ParseError:
253 except error.ParseError:
254 # can't parse to a revset tree
254 # can't parse to a revset tree
255 return MODE_KEYWORD, query
255 return MODE_KEYWORD, query
256
256
257 if revset.depth(tree) <= 2:
257 if revset.depth(tree) <= 2:
258 # no revset syntax used
258 # no revset syntax used
259 return MODE_KEYWORD, query
259 return MODE_KEYWORD, query
260
260
261 if any((token, (value or '')[:3]) == ('string', 're:')
261 if any((token, (value or '')[:3]) == ('string', 're:')
262 for token, value, pos in revset.tokenize(revdef)):
262 for token, value, pos in revset.tokenize(revdef)):
263 return MODE_KEYWORD, query
263 return MODE_KEYWORD, query
264
264
265 funcsused = revset.funcsused(tree)
265 funcsused = revset.funcsused(tree)
266 if not funcsused.issubset(revset.safesymbols):
266 if not funcsused.issubset(revset.safesymbols):
267 return MODE_KEYWORD, query
267 return MODE_KEYWORD, query
268
268
269 mfunc = revset.match(web.repo.ui, revdef)
269 mfunc = revset.match(web.repo.ui, revdef)
270 try:
270 try:
271 revs = mfunc(web.repo)
271 revs = mfunc(web.repo)
272 return MODE_REVSET, revs
272 return MODE_REVSET, revs
273 # ParseError: wrongly placed tokens, wrongs arguments, etc
273 # ParseError: wrongly placed tokens, wrongs arguments, etc
274 # RepoLookupError: no such revision, e.g. in 'revision:'
274 # RepoLookupError: no such revision, e.g. in 'revision:'
275 # Abort: bookmark/tag not exists
275 # Abort: bookmark/tag not exists
276 # LookupError: ambiguous identifier, e.g. in '(bc)' on a large repo
276 # LookupError: ambiguous identifier, e.g. in '(bc)' on a large repo
277 except (error.ParseError, error.RepoLookupError, error.Abort,
277 except (error.ParseError, error.RepoLookupError, error.Abort,
278 LookupError):
278 LookupError):
279 return MODE_KEYWORD, query
279 return MODE_KEYWORD, query
280
280
281 def changelist(**map):
281 def changelist(**map):
282 count = 0
282 count = 0
283
283
284 for ctx in searchfunc[0](funcarg):
284 for ctx in searchfunc[0](funcarg):
285 count += 1
285 count += 1
286 n = ctx.node()
286 n = ctx.node()
287 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
287 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
288 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
288 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
289
289
290 yield tmpl('searchentry',
290 yield tmpl('searchentry',
291 parity=parity.next(),
291 parity=parity.next(),
292 author=ctx.user(),
292 author=ctx.user(),
293 parent=lambda **x: webutil.parents(ctx),
293 parent=lambda **x: webutil.parents(ctx),
294 child=lambda **x: webutil.children(ctx),
294 child=lambda **x: webutil.children(ctx),
295 changelogtag=showtags,
295 changelogtag=showtags,
296 desc=ctx.description(),
296 desc=ctx.description(),
297 extra=ctx.extra(),
297 extra=ctx.extra(),
298 date=ctx.date(),
298 date=ctx.date(),
299 files=files,
299 files=files,
300 rev=ctx.rev(),
300 rev=ctx.rev(),
301 node=hex(n),
301 node=hex(n),
302 tags=webutil.nodetagsdict(web.repo, n),
302 tags=webutil.nodetagsdict(web.repo, n),
303 bookmarks=webutil.nodebookmarksdict(web.repo, n),
303 bookmarks=webutil.nodebookmarksdict(web.repo, n),
304 inbranch=webutil.nodeinbranch(web.repo, ctx),
304 inbranch=webutil.nodeinbranch(web.repo, ctx),
305 branches=webutil.nodebranchdict(web.repo, ctx))
305 branches=webutil.nodebranchdict(web.repo, ctx))
306
306
307 if count >= revcount:
307 if count >= revcount:
308 break
308 break
309
309
310 query = req.form['rev'][0]
310 query = req.form['rev'][0]
311 revcount = web.maxchanges
311 revcount = web.maxchanges
312 if 'revcount' in req.form:
312 if 'revcount' in req.form:
313 try:
313 try:
314 revcount = int(req.form.get('revcount', [revcount])[0])
314 revcount = int(req.form.get('revcount', [revcount])[0])
315 revcount = max(revcount, 1)
315 revcount = max(revcount, 1)
316 tmpl.defaults['sessionvars']['revcount'] = revcount
316 tmpl.defaults['sessionvars']['revcount'] = revcount
317 except ValueError:
317 except ValueError:
318 pass
318 pass
319
319
320 lessvars = copy.copy(tmpl.defaults['sessionvars'])
320 lessvars = copy.copy(tmpl.defaults['sessionvars'])
321 lessvars['revcount'] = max(revcount / 2, 1)
321 lessvars['revcount'] = max(revcount / 2, 1)
322 lessvars['rev'] = query
322 lessvars['rev'] = query
323 morevars = copy.copy(tmpl.defaults['sessionvars'])
323 morevars = copy.copy(tmpl.defaults['sessionvars'])
324 morevars['revcount'] = revcount * 2
324 morevars['revcount'] = revcount * 2
325 morevars['rev'] = query
325 morevars['rev'] = query
326
326
327 mode, funcarg = getsearchmode(query)
327 mode, funcarg = getsearchmode(query)
328
328
329 if 'forcekw' in req.form:
329 if 'forcekw' in req.form:
330 showforcekw = ''
330 showforcekw = ''
331 showunforcekw = searchfuncs[mode][1]
331 showunforcekw = searchfuncs[mode][1]
332 mode = MODE_KEYWORD
332 mode = MODE_KEYWORD
333 funcarg = query
333 funcarg = query
334 else:
334 else:
335 if mode != MODE_KEYWORD:
335 if mode != MODE_KEYWORD:
336 showforcekw = searchfuncs[MODE_KEYWORD][1]
336 showforcekw = searchfuncs[MODE_KEYWORD][1]
337 else:
337 else:
338 showforcekw = ''
338 showforcekw = ''
339 showunforcekw = ''
339 showunforcekw = ''
340
340
341 searchfunc = searchfuncs[mode]
341 searchfunc = searchfuncs[mode]
342
342
343 tip = web.repo['tip']
343 tip = web.repo['tip']
344 parity = paritygen(web.stripecount)
344 parity = paritygen(web.stripecount)
345
345
346 return tmpl('search', query=query, node=tip.hex(), symrev='tip',
346 return tmpl('search', query=query, node=tip.hex(), symrev='tip',
347 entries=changelist, archives=web.archivelist("tip"),
347 entries=changelist, archives=web.archivelist("tip"),
348 morevars=morevars, lessvars=lessvars,
348 morevars=morevars, lessvars=lessvars,
349 modedesc=searchfunc[1],
349 modedesc=searchfunc[1],
350 showforcekw=showforcekw, showunforcekw=showunforcekw)
350 showforcekw=showforcekw, showunforcekw=showunforcekw)
351
351
352 @webcommand('changelog')
352 @webcommand('changelog')
353 def changelog(web, req, tmpl, shortlog=False):
353 def changelog(web, req, tmpl, shortlog=False):
354 """
354 """
355 /changelog[/{revision}]
355 /changelog[/{revision}]
356 -----------------------
356 -----------------------
357
357
358 Show information about multiple changesets.
358 Show information about multiple changesets.
359
359
360 If the optional ``revision`` URL argument is absent, information about
360 If the optional ``revision`` URL argument is absent, information about
361 all changesets starting at ``tip`` will be rendered. If the ``revision``
361 all changesets starting at ``tip`` will be rendered. If the ``revision``
362 argument is present, changesets will be shown starting from the specified
362 argument is present, changesets will be shown starting from the specified
363 revision.
363 revision.
364
364
365 If ``revision`` is absent, the ``rev`` query string argument may be
365 If ``revision`` is absent, the ``rev`` query string argument may be
366 defined. This will perform a search for changesets.
366 defined. This will perform a search for changesets.
367
367
368 The argument for ``rev`` can be a single revision, a revision set,
368 The argument for ``rev`` can be a single revision, a revision set,
369 or a literal keyword to search for in changeset data (equivalent to
369 or a literal keyword to search for in changeset data (equivalent to
370 :hg:`log -k`).
370 :hg:`log -k`).
371
371
372 The ``revcount`` query string argument defines the maximum numbers of
372 The ``revcount`` query string argument defines the maximum numbers of
373 changesets to render.
373 changesets to render.
374
374
375 For non-searches, the ``changelog`` template will be rendered.
375 For non-searches, the ``changelog`` template will be rendered.
376 """
376 """
377
377
378 query = ''
378 query = ''
379 if 'node' in req.form:
379 if 'node' in req.form:
380 ctx = webutil.changectx(web.repo, req)
380 ctx = webutil.changectx(web.repo, req)
381 symrev = webutil.symrevorshortnode(req, ctx)
381 symrev = webutil.symrevorshortnode(req, ctx)
382 elif 'rev' in req.form:
382 elif 'rev' in req.form:
383 return _search(web, req, tmpl)
383 return _search(web, req, tmpl)
384 else:
384 else:
385 ctx = web.repo['tip']
385 ctx = web.repo['tip']
386 symrev = 'tip'
386 symrev = 'tip'
387
387
388 def changelist():
388 def changelist():
389 revs = []
389 revs = []
390 if pos != -1:
390 if pos != -1:
391 revs = web.repo.changelog.revs(pos, 0)
391 revs = web.repo.changelog.revs(pos, 0)
392 curcount = 0
392 curcount = 0
393 for rev in revs:
393 for rev in revs:
394 curcount += 1
394 curcount += 1
395 if curcount > revcount + 1:
395 if curcount > revcount + 1:
396 break
396 break
397
397
398 entry = webutil.changelistentry(web, web.repo[rev], tmpl)
398 entry = webutil.changelistentry(web, web.repo[rev], tmpl)
399 entry['parity'] = parity.next()
399 entry['parity'] = parity.next()
400 yield entry
400 yield entry
401
401
402 if shortlog:
402 if shortlog:
403 revcount = web.maxshortchanges
403 revcount = web.maxshortchanges
404 else:
404 else:
405 revcount = web.maxchanges
405 revcount = web.maxchanges
406
406
407 if 'revcount' in req.form:
407 if 'revcount' in req.form:
408 try:
408 try:
409 revcount = int(req.form.get('revcount', [revcount])[0])
409 revcount = int(req.form.get('revcount', [revcount])[0])
410 revcount = max(revcount, 1)
410 revcount = max(revcount, 1)
411 tmpl.defaults['sessionvars']['revcount'] = revcount
411 tmpl.defaults['sessionvars']['revcount'] = revcount
412 except ValueError:
412 except ValueError:
413 pass
413 pass
414
414
415 lessvars = copy.copy(tmpl.defaults['sessionvars'])
415 lessvars = copy.copy(tmpl.defaults['sessionvars'])
416 lessvars['revcount'] = max(revcount / 2, 1)
416 lessvars['revcount'] = max(revcount / 2, 1)
417 morevars = copy.copy(tmpl.defaults['sessionvars'])
417 morevars = copy.copy(tmpl.defaults['sessionvars'])
418 morevars['revcount'] = revcount * 2
418 morevars['revcount'] = revcount * 2
419
419
420 count = len(web.repo)
420 count = len(web.repo)
421 pos = ctx.rev()
421 pos = ctx.rev()
422 parity = paritygen(web.stripecount)
422 parity = paritygen(web.stripecount)
423
423
424 changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
424 changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
425
425
426 entries = list(changelist())
426 entries = list(changelist())
427 latestentry = entries[:1]
427 latestentry = entries[:1]
428 if len(entries) > revcount:
428 if len(entries) > revcount:
429 nextentry = entries[-1:]
429 nextentry = entries[-1:]
430 entries = entries[:-1]
430 entries = entries[:-1]
431 else:
431 else:
432 nextentry = []
432 nextentry = []
433
433
434 return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
434 return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
435 node=ctx.hex(), rev=pos, symrev=symrev, changesets=count,
435 node=ctx.hex(), rev=pos, symrev=symrev, changesets=count,
436 entries=entries,
436 entries=entries,
437 latestentry=latestentry, nextentry=nextentry,
437 latestentry=latestentry, nextentry=nextentry,
438 archives=web.archivelist("tip"), revcount=revcount,
438 archives=web.archivelist("tip"), revcount=revcount,
439 morevars=morevars, lessvars=lessvars, query=query)
439 morevars=morevars, lessvars=lessvars, query=query)
440
440
441 @webcommand('shortlog')
441 @webcommand('shortlog')
442 def shortlog(web, req, tmpl):
442 def shortlog(web, req, tmpl):
443 """
443 """
444 /shortlog
444 /shortlog
445 ---------
445 ---------
446
446
447 Show basic information about a set of changesets.
447 Show basic information about a set of changesets.
448
448
449 This accepts the same parameters as the ``changelog`` handler. The only
449 This accepts the same parameters as the ``changelog`` handler. The only
450 difference is the ``shortlog`` template will be rendered instead of the
450 difference is the ``shortlog`` template will be rendered instead of the
451 ``changelog`` template.
451 ``changelog`` template.
452 """
452 """
453 return changelog(web, req, tmpl, shortlog=True)
453 return changelog(web, req, tmpl, shortlog=True)
454
454
455 @webcommand('changeset')
455 @webcommand('changeset')
456 def changeset(web, req, tmpl):
456 def changeset(web, req, tmpl):
457 """
457 """
458 /changeset[/{revision}]
458 /changeset[/{revision}]
459 -----------------------
459 -----------------------
460
460
461 Show information about a single changeset.
461 Show information about a single changeset.
462
462
463 A URL path argument is the changeset identifier to show. See ``hg help
463 A URL path argument is the changeset identifier to show. See ``hg help
464 revisions`` for possible values. If not defined, the ``tip`` changeset
464 revisions`` for possible values. If not defined, the ``tip`` changeset
465 will be shown.
465 will be shown.
466
466
467 The ``changeset`` template is rendered. Contents of the ``changesettag``,
467 The ``changeset`` template is rendered. Contents of the ``changesettag``,
468 ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many
468 ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many
469 templates related to diffs may all be used to produce the output.
469 templates related to diffs may all be used to produce the output.
470 """
470 """
471 ctx = webutil.changectx(web.repo, req)
471 ctx = webutil.changectx(web.repo, req)
472
472
473 return tmpl('changeset', **webutil.changesetentry(web, req, tmpl, ctx))
473 return tmpl('changeset', **webutil.changesetentry(web, req, tmpl, ctx))
474
474
475 rev = webcommand('rev')(changeset)
475 rev = webcommand('rev')(changeset)
476
476
477 def decodepath(path):
477 def decodepath(path):
478 """Hook for mapping a path in the repository to a path in the
478 """Hook for mapping a path in the repository to a path in the
479 working copy.
479 working copy.
480
480
481 Extensions (e.g., largefiles) can override this to remap files in
481 Extensions (e.g., largefiles) can override this to remap files in
482 the virtual file system presented by the manifest command below."""
482 the virtual file system presented by the manifest command below."""
483 return path
483 return path
484
484
485 @webcommand('manifest')
485 @webcommand('manifest')
486 def manifest(web, req, tmpl):
486 def manifest(web, req, tmpl):
487 """
487 """
488 /manifest[/{revision}[/{path}]]
488 /manifest[/{revision}[/{path}]]
489 -------------------------------
489 -------------------------------
490
490
491 Show information about a directory.
491 Show information about a directory.
492
492
493 If the URL path arguments are omitted, information about the root
493 If the URL path arguments are omitted, information about the root
494 directory for the ``tip`` changeset will be shown.
494 directory for the ``tip`` changeset will be shown.
495
495
496 Because this handler can only show information for directories, it
496 Because this handler can only show information for directories, it
497 is recommended to use the ``file`` handler instead, as it can handle both
497 is recommended to use the ``file`` handler instead, as it can handle both
498 directories and files.
498 directories and files.
499
499
500 The ``manifest`` template will be rendered for this handler.
500 The ``manifest`` template will be rendered for this handler.
501 """
501 """
502 if 'node' in req.form:
502 if 'node' in req.form:
503 ctx = webutil.changectx(web.repo, req)
503 ctx = webutil.changectx(web.repo, req)
504 symrev = webutil.symrevorshortnode(req, ctx)
504 symrev = webutil.symrevorshortnode(req, ctx)
505 else:
505 else:
506 ctx = web.repo['tip']
506 ctx = web.repo['tip']
507 symrev = 'tip'
507 symrev = 'tip'
508 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
508 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
509 mf = ctx.manifest()
509 mf = ctx.manifest()
510 node = ctx.node()
510 node = ctx.node()
511
511
512 files = {}
512 files = {}
513 dirs = {}
513 dirs = {}
514 parity = paritygen(web.stripecount)
514 parity = paritygen(web.stripecount)
515
515
516 if path and path[-1] != "/":
516 if path and path[-1] != "/":
517 path += "/"
517 path += "/"
518 l = len(path)
518 l = len(path)
519 abspath = "/" + path
519 abspath = "/" + path
520
520
521 for full, n in mf.iteritems():
521 for full, n in mf.iteritems():
522 # the virtual path (working copy path) used for the full
522 # the virtual path (working copy path) used for the full
523 # (repository) path
523 # (repository) path
524 f = decodepath(full)
524 f = decodepath(full)
525
525
526 if f[:l] != path:
526 if f[:l] != path:
527 continue
527 continue
528 remain = f[l:]
528 remain = f[l:]
529 elements = remain.split('/')
529 elements = remain.split('/')
530 if len(elements) == 1:
530 if len(elements) == 1:
531 files[remain] = full
531 files[remain] = full
532 else:
532 else:
533 h = dirs # need to retain ref to dirs (root)
533 h = dirs # need to retain ref to dirs (root)
534 for elem in elements[0:-1]:
534 for elem in elements[0:-1]:
535 if elem not in h:
535 if elem not in h:
536 h[elem] = {}
536 h[elem] = {}
537 h = h[elem]
537 h = h[elem]
538 if len(h) > 1:
538 if len(h) > 1:
539 break
539 break
540 h[None] = None # denotes files present
540 h[None] = None # denotes files present
541
541
542 if mf and not files and not dirs:
542 if mf and not files and not dirs:
543 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
543 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
544
544
545 def filelist(**map):
545 def filelist(**map):
546 for f in sorted(files):
546 for f in sorted(files):
547 full = files[f]
547 full = files[f]
548
548
549 fctx = ctx.filectx(full)
549 fctx = ctx.filectx(full)
550 yield {"file": full,
550 yield {"file": full,
551 "parity": parity.next(),
551 "parity": parity.next(),
552 "basename": f,
552 "basename": f,
553 "date": fctx.date(),
553 "date": fctx.date(),
554 "size": fctx.size(),
554 "size": fctx.size(),
555 "permissions": mf.flags(full)}
555 "permissions": mf.flags(full)}
556
556
557 def dirlist(**map):
557 def dirlist(**map):
558 for d in sorted(dirs):
558 for d in sorted(dirs):
559
559
560 emptydirs = []
560 emptydirs = []
561 h = dirs[d]
561 h = dirs[d]
562 while isinstance(h, dict) and len(h) == 1:
562 while isinstance(h, dict) and len(h) == 1:
563 k, v = h.items()[0]
563 k, v = h.items()[0]
564 if v:
564 if v:
565 emptydirs.append(k)
565 emptydirs.append(k)
566 h = v
566 h = v
567
567
568 path = "%s%s" % (abspath, d)
568 path = "%s%s" % (abspath, d)
569 yield {"parity": parity.next(),
569 yield {"parity": parity.next(),
570 "path": path,
570 "path": path,
571 "emptydirs": "/".join(emptydirs),
571 "emptydirs": "/".join(emptydirs),
572 "basename": d}
572 "basename": d}
573
573
574 return tmpl("manifest",
574 return tmpl("manifest",
575 rev=ctx.rev(),
575 rev=ctx.rev(),
576 symrev=symrev,
576 symrev=symrev,
577 node=hex(node),
577 node=hex(node),
578 path=abspath,
578 path=abspath,
579 up=webutil.up(abspath),
579 up=webutil.up(abspath),
580 upparity=parity.next(),
580 upparity=parity.next(),
581 fentries=filelist,
581 fentries=filelist,
582 dentries=dirlist,
582 dentries=dirlist,
583 archives=web.archivelist(hex(node)),
583 archives=web.archivelist(hex(node)),
584 tags=webutil.nodetagsdict(web.repo, node),
584 tags=webutil.nodetagsdict(web.repo, node),
585 bookmarks=webutil.nodebookmarksdict(web.repo, node),
585 bookmarks=webutil.nodebookmarksdict(web.repo, node),
586 branch=webutil.nodebranchnodefault(ctx),
586 branch=webutil.nodebranchnodefault(ctx),
587 inbranch=webutil.nodeinbranch(web.repo, ctx),
587 inbranch=webutil.nodeinbranch(web.repo, ctx),
588 branches=webutil.nodebranchdict(web.repo, ctx))
588 branches=webutil.nodebranchdict(web.repo, ctx))
589
589
590 @webcommand('tags')
590 @webcommand('tags')
591 def tags(web, req, tmpl):
591 def tags(web, req, tmpl):
592 """
592 """
593 /tags
593 /tags
594 -----
594 -----
595
595
596 Show information about tags.
596 Show information about tags.
597
597
598 No arguments are accepted.
598 No arguments are accepted.
599
599
600 The ``tags`` template is rendered.
600 The ``tags`` template is rendered.
601 """
601 """
602 i = list(reversed(web.repo.tagslist()))
602 i = list(reversed(web.repo.tagslist()))
603 parity = paritygen(web.stripecount)
603 parity = paritygen(web.stripecount)
604
604
605 def entries(notip, latestonly, **map):
605 def entries(notip, latestonly, **map):
606 t = i
606 t = i
607 if notip:
607 if notip:
608 t = [(k, n) for k, n in i if k != "tip"]
608 t = [(k, n) for k, n in i if k != "tip"]
609 if latestonly:
609 if latestonly:
610 t = t[:1]
610 t = t[:1]
611 for k, n in t:
611 for k, n in t:
612 yield {"parity": parity.next(),
612 yield {"parity": parity.next(),
613 "tag": k,
613 "tag": k,
614 "date": web.repo[n].date(),
614 "date": web.repo[n].date(),
615 "node": hex(n)}
615 "node": hex(n)}
616
616
617 return tmpl("tags",
617 return tmpl("tags",
618 node=hex(web.repo.changelog.tip()),
618 node=hex(web.repo.changelog.tip()),
619 entries=lambda **x: entries(False, False, **x),
619 entries=lambda **x: entries(False, False, **x),
620 entriesnotip=lambda **x: entries(True, False, **x),
620 entriesnotip=lambda **x: entries(True, False, **x),
621 latestentry=lambda **x: entries(True, True, **x))
621 latestentry=lambda **x: entries(True, True, **x))
622
622
623 @webcommand('bookmarks')
623 @webcommand('bookmarks')
624 def bookmarks(web, req, tmpl):
624 def bookmarks(web, req, tmpl):
625 """
625 """
626 /bookmarks
626 /bookmarks
627 ----------
627 ----------
628
628
629 Show information about bookmarks.
629 Show information about bookmarks.
630
630
631 No arguments are accepted.
631 No arguments are accepted.
632
632
633 The ``bookmarks`` template is rendered.
633 The ``bookmarks`` template is rendered.
634 """
634 """
635 i = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
635 i = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
636 parity = paritygen(web.stripecount)
636 parity = paritygen(web.stripecount)
637
637
638 def entries(latestonly, **map):
638 def entries(latestonly, **map):
639 if latestonly:
639 if latestonly:
640 t = [min(i)]
640 t = [min(i)]
641 else:
641 else:
642 t = sorted(i)
642 t = sorted(i)
643 for k, n in t:
643 for k, n in t:
644 yield {"parity": parity.next(),
644 yield {"parity": parity.next(),
645 "bookmark": k,
645 "bookmark": k,
646 "date": web.repo[n].date(),
646 "date": web.repo[n].date(),
647 "node": hex(n)}
647 "node": hex(n)}
648
648
649 return tmpl("bookmarks",
649 return tmpl("bookmarks",
650 node=hex(web.repo.changelog.tip()),
650 node=hex(web.repo.changelog.tip()),
651 entries=lambda **x: entries(latestonly=False, **x),
651 entries=lambda **x: entries(latestonly=False, **x),
652 latestentry=lambda **x: entries(latestonly=True, **x))
652 latestentry=lambda **x: entries(latestonly=True, **x))
653
653
654 @webcommand('branches')
654 @webcommand('branches')
655 def branches(web, req, tmpl):
655 def branches(web, req, tmpl):
656 """
656 """
657 /branches
657 /branches
658 ---------
658 ---------
659
659
660 Show information about branches.
660 Show information about branches.
661
661
662 All known branches are contained in the output, even closed branches.
662 All known branches are contained in the output, even closed branches.
663
663
664 No arguments are accepted.
664 No arguments are accepted.
665
665
666 The ``branches`` template is rendered.
666 The ``branches`` template is rendered.
667 """
667 """
668 entries = webutil.branchentries(web.repo, web.stripecount)
668 entries = webutil.branchentries(web.repo, web.stripecount)
669 latestentry = webutil.branchentries(web.repo, web.stripecount, 1)
669 latestentry = webutil.branchentries(web.repo, web.stripecount, 1)
670 return tmpl('branches', node=hex(web.repo.changelog.tip()),
670 return tmpl('branches', node=hex(web.repo.changelog.tip()),
671 entries=entries, latestentry=latestentry)
671 entries=entries, latestentry=latestentry)
672
672
673 @webcommand('summary')
673 @webcommand('summary')
674 def summary(web, req, tmpl):
674 def summary(web, req, tmpl):
675 """
675 """
676 /summary
676 /summary
677 --------
677 --------
678
678
679 Show a summary of repository state.
679 Show a summary of repository state.
680
680
681 Information about the latest changesets, bookmarks, tags, and branches
681 Information about the latest changesets, bookmarks, tags, and branches
682 is captured by this handler.
682 is captured by this handler.
683
683
684 The ``summary`` template is rendered.
684 The ``summary`` template is rendered.
685 """
685 """
686 i = reversed(web.repo.tagslist())
686 i = reversed(web.repo.tagslist())
687
687
688 def tagentries(**map):
688 def tagentries(**map):
689 parity = paritygen(web.stripecount)
689 parity = paritygen(web.stripecount)
690 count = 0
690 count = 0
691 for k, n in i:
691 for k, n in i:
692 if k == "tip": # skip tip
692 if k == "tip": # skip tip
693 continue
693 continue
694
694
695 count += 1
695 count += 1
696 if count > 10: # limit to 10 tags
696 if count > 10: # limit to 10 tags
697 break
697 break
698
698
699 yield tmpl("tagentry",
699 yield tmpl("tagentry",
700 parity=parity.next(),
700 parity=parity.next(),
701 tag=k,
701 tag=k,
702 node=hex(n),
702 node=hex(n),
703 date=web.repo[n].date())
703 date=web.repo[n].date())
704
704
705 def bookmarks(**map):
705 def bookmarks(**map):
706 parity = paritygen(web.stripecount)
706 parity = paritygen(web.stripecount)
707 marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
707 marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
708 for k, n in sorted(marks)[:10]: # limit to 10 bookmarks
708 for k, n in sorted(marks)[:10]: # limit to 10 bookmarks
709 yield {'parity': parity.next(),
709 yield {'parity': parity.next(),
710 'bookmark': k,
710 'bookmark': k,
711 'date': web.repo[n].date(),
711 'date': web.repo[n].date(),
712 'node': hex(n)}
712 'node': hex(n)}
713
713
714 def changelist(**map):
714 def changelist(**map):
715 parity = paritygen(web.stripecount, offset=start - end)
715 parity = paritygen(web.stripecount, offset=start - end)
716 l = [] # build a list in forward order for efficiency
716 l = [] # build a list in forward order for efficiency
717 revs = []
717 revs = []
718 if start < end:
718 if start < end:
719 revs = web.repo.changelog.revs(start, end - 1)
719 revs = web.repo.changelog.revs(start, end - 1)
720 for i in revs:
720 for i in revs:
721 ctx = web.repo[i]
721 ctx = web.repo[i]
722 n = ctx.node()
722 n = ctx.node()
723 hn = hex(n)
723 hn = hex(n)
724
724
725 l.append(tmpl(
725 l.append(tmpl(
726 'shortlogentry',
726 'shortlogentry',
727 parity=parity.next(),
727 parity=parity.next(),
728 author=ctx.user(),
728 author=ctx.user(),
729 desc=ctx.description(),
729 desc=ctx.description(),
730 extra=ctx.extra(),
730 extra=ctx.extra(),
731 date=ctx.date(),
731 date=ctx.date(),
732 rev=i,
732 rev=i,
733 node=hn,
733 node=hn,
734 tags=webutil.nodetagsdict(web.repo, n),
734 tags=webutil.nodetagsdict(web.repo, n),
735 bookmarks=webutil.nodebookmarksdict(web.repo, n),
735 bookmarks=webutil.nodebookmarksdict(web.repo, n),
736 inbranch=webutil.nodeinbranch(web.repo, ctx),
736 inbranch=webutil.nodeinbranch(web.repo, ctx),
737 branches=webutil.nodebranchdict(web.repo, ctx)))
737 branches=webutil.nodebranchdict(web.repo, ctx)))
738
738
739 l.reverse()
739 l.reverse()
740 yield l
740 yield l
741
741
742 tip = web.repo['tip']
742 tip = web.repo['tip']
743 count = len(web.repo)
743 count = len(web.repo)
744 start = max(0, count - web.maxchanges)
744 start = max(0, count - web.maxchanges)
745 end = min(count, start + web.maxchanges)
745 end = min(count, start + web.maxchanges)
746
746
747 return tmpl("summary",
747 return tmpl("summary",
748 desc=web.config("web", "description", "unknown"),
748 desc=web.config("web", "description", "unknown"),
749 owner=get_contact(web.config) or "unknown",
749 owner=get_contact(web.config) or "unknown",
750 lastchange=tip.date(),
750 lastchange=tip.date(),
751 tags=tagentries,
751 tags=tagentries,
752 bookmarks=bookmarks,
752 bookmarks=bookmarks,
753 branches=webutil.branchentries(web.repo, web.stripecount, 10),
753 branches=webutil.branchentries(web.repo, web.stripecount, 10),
754 shortlog=changelist,
754 shortlog=changelist,
755 node=tip.hex(),
755 node=tip.hex(),
756 symrev='tip',
756 symrev='tip',
757 archives=web.archivelist("tip"))
757 archives=web.archivelist("tip"))
758
758
759 @webcommand('filediff')
759 @webcommand('filediff')
760 def filediff(web, req, tmpl):
760 def filediff(web, req, tmpl):
761 """
761 """
762 /diff/{revision}/{path}
762 /diff/{revision}/{path}
763 -----------------------
763 -----------------------
764
764
765 Show how a file changed in a particular commit.
765 Show how a file changed in a particular commit.
766
766
767 The ``filediff`` template is rendered.
767 The ``filediff`` template is rendered.
768
768
769 This handler is registered under both the ``/diff`` and ``/filediff``
769 This handler is registered under both the ``/diff`` and ``/filediff``
770 paths. ``/diff`` is used in modern code.
770 paths. ``/diff`` is used in modern code.
771 """
771 """
772 fctx, ctx = None, None
772 fctx, ctx = None, None
773 try:
773 try:
774 fctx = webutil.filectx(web.repo, req)
774 fctx = webutil.filectx(web.repo, req)
775 except LookupError:
775 except LookupError:
776 ctx = webutil.changectx(web.repo, req)
776 ctx = webutil.changectx(web.repo, req)
777 path = webutil.cleanpath(web.repo, req.form['file'][0])
777 path = webutil.cleanpath(web.repo, req.form['file'][0])
778 if path not in ctx.files():
778 if path not in ctx.files():
779 raise
779 raise
780
780
781 if fctx is not None:
781 if fctx is not None:
782 n = fctx.node()
782 n = fctx.node()
783 path = fctx.path()
783 path = fctx.path()
784 ctx = fctx.changectx()
784 ctx = fctx.changectx()
785 else:
785 else:
786 n = ctx.node()
786 n = ctx.node()
787 # path already defined in except clause
787 # path already defined in except clause
788
788
789 parity = paritygen(web.stripecount)
789 parity = paritygen(web.stripecount)
790 style = web.config('web', 'style', 'paper')
790 style = web.config('web', 'style', 'paper')
791 if 'style' in req.form:
791 if 'style' in req.form:
792 style = req.form['style'][0]
792 style = req.form['style'][0]
793
793
794 diffs = webutil.diffs(web.repo, tmpl, ctx, None, [path], parity, style)
794 diffs = webutil.diffs(web.repo, tmpl, ctx, None, [path], parity, style)
795 if fctx:
795 if fctx:
796 rename = webutil.renamelink(fctx)
796 rename = webutil.renamelink(fctx)
797 ctx = fctx
797 ctx = fctx
798 else:
798 else:
799 rename = []
799 rename = []
800 ctx = ctx
800 ctx = ctx
801 return tmpl("filediff",
801 return tmpl("filediff",
802 file=path,
802 file=path,
803 node=hex(n),
803 node=hex(n),
804 rev=ctx.rev(),
804 rev=ctx.rev(),
805 symrev=webutil.symrevorshortnode(req, ctx),
805 symrev=webutil.symrevorshortnode(req, ctx),
806 date=ctx.date(),
806 date=ctx.date(),
807 desc=ctx.description(),
807 desc=ctx.description(),
808 extra=ctx.extra(),
808 extra=ctx.extra(),
809 author=ctx.user(),
809 author=ctx.user(),
810 rename=rename,
810 rename=rename,
811 branch=webutil.nodebranchnodefault(ctx),
811 branch=webutil.nodebranchnodefault(ctx),
812 parent=webutil.parents(ctx),
812 parent=webutil.parents(ctx),
813 child=webutil.children(ctx),
813 child=webutil.children(ctx),
814 tags=webutil.nodetagsdict(web.repo, n),
814 tags=webutil.nodetagsdict(web.repo, n),
815 bookmarks=webutil.nodebookmarksdict(web.repo, n),
815 bookmarks=webutil.nodebookmarksdict(web.repo, n),
816 diff=diffs)
816 diff=diffs)
817
817
818 diff = webcommand('diff')(filediff)
818 diff = webcommand('diff')(filediff)
819
819
820 @webcommand('comparison')
820 @webcommand('comparison')
821 def comparison(web, req, tmpl):
821 def comparison(web, req, tmpl):
822 """
822 """
823 /comparison/{revision}/{path}
823 /comparison/{revision}/{path}
824 -----------------------------
824 -----------------------------
825
825
826 Show a comparison between the old and new versions of a file from changes
826 Show a comparison between the old and new versions of a file from changes
827 made on a particular revision.
827 made on a particular revision.
828
828
829 This is similar to the ``diff`` handler. However, this form features
829 This is similar to the ``diff`` handler. However, this form features
830 a split or side-by-side diff rather than a unified diff.
830 a split or side-by-side diff rather than a unified diff.
831
831
832 The ``context`` query string argument can be used to control the lines of
832 The ``context`` query string argument can be used to control the lines of
833 context in the diff.
833 context in the diff.
834
834
835 The ``filecomparison`` template is rendered.
835 The ``filecomparison`` template is rendered.
836 """
836 """
837 ctx = webutil.changectx(web.repo, req)
837 ctx = webutil.changectx(web.repo, req)
838 if 'file' not in req.form:
838 if 'file' not in req.form:
839 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
839 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
840 path = webutil.cleanpath(web.repo, req.form['file'][0])
840 path = webutil.cleanpath(web.repo, req.form['file'][0])
841 rename = path in ctx and webutil.renamelink(ctx[path]) or []
841 rename = path in ctx and webutil.renamelink(ctx[path]) or []
842
842
843 parsecontext = lambda v: v == 'full' and -1 or int(v)
843 parsecontext = lambda v: v == 'full' and -1 or int(v)
844 if 'context' in req.form:
844 if 'context' in req.form:
845 context = parsecontext(req.form['context'][0])
845 context = parsecontext(req.form['context'][0])
846 else:
846 else:
847 context = parsecontext(web.config('web', 'comparisoncontext', '5'))
847 context = parsecontext(web.config('web', 'comparisoncontext', '5'))
848
848
849 def filelines(f):
849 def filelines(f):
850 if util.binary(f.data()):
850 if util.binary(f.data()):
851 mt = mimetypes.guess_type(f.path())[0]
851 mt = mimetypes.guess_type(f.path())[0]
852 if not mt:
852 if not mt:
853 mt = 'application/octet-stream'
853 mt = 'application/octet-stream'
854 return [_('(binary file %s, hash: %s)') % (mt, hex(f.filenode()))]
854 return [_('(binary file %s, hash: %s)') % (mt, hex(f.filenode()))]
855 return f.data().splitlines()
855 return f.data().splitlines()
856
856
857 parent = ctx.p1()
857 parent = ctx.p1()
858 leftrev = parent.rev()
858 leftrev = parent.rev()
859 leftnode = parent.node()
859 leftnode = parent.node()
860 rightrev = ctx.rev()
860 rightrev = ctx.rev()
861 rightnode = ctx.node()
861 rightnode = ctx.node()
862 if path in ctx:
862 if path in ctx:
863 fctx = ctx[path]
863 fctx = ctx[path]
864 rightlines = filelines(fctx)
864 rightlines = filelines(fctx)
865 if path not in parent:
865 if path not in parent:
866 leftlines = ()
866 leftlines = ()
867 else:
867 else:
868 pfctx = parent[path]
868 pfctx = parent[path]
869 leftlines = filelines(pfctx)
869 leftlines = filelines(pfctx)
870 else:
870 else:
871 rightlines = ()
871 rightlines = ()
872 fctx = ctx.parents()[0][path]
872 fctx = ctx.parents()[0][path]
873 leftlines = filelines(fctx)
873 leftlines = filelines(fctx)
874
874
875 comparison = webutil.compare(tmpl, context, leftlines, rightlines)
875 comparison = webutil.compare(tmpl, context, leftlines, rightlines)
876 return tmpl('filecomparison',
876 return tmpl('filecomparison',
877 file=path,
877 file=path,
878 node=hex(ctx.node()),
878 node=hex(ctx.node()),
879 rev=ctx.rev(),
879 rev=ctx.rev(),
880 symrev=webutil.symrevorshortnode(req, ctx),
880 symrev=webutil.symrevorshortnode(req, ctx),
881 date=ctx.date(),
881 date=ctx.date(),
882 desc=ctx.description(),
882 desc=ctx.description(),
883 extra=ctx.extra(),
883 extra=ctx.extra(),
884 author=ctx.user(),
884 author=ctx.user(),
885 rename=rename,
885 rename=rename,
886 branch=webutil.nodebranchnodefault(ctx),
886 branch=webutil.nodebranchnodefault(ctx),
887 parent=webutil.parents(fctx),
887 parent=webutil.parents(fctx),
888 child=webutil.children(fctx),
888 child=webutil.children(fctx),
889 tags=webutil.nodetagsdict(web.repo, ctx.node()),
889 tags=webutil.nodetagsdict(web.repo, ctx.node()),
890 bookmarks=webutil.nodebookmarksdict(web.repo, ctx.node()),
890 bookmarks=webutil.nodebookmarksdict(web.repo, ctx.node()),
891 leftrev=leftrev,
891 leftrev=leftrev,
892 leftnode=hex(leftnode),
892 leftnode=hex(leftnode),
893 rightrev=rightrev,
893 rightrev=rightrev,
894 rightnode=hex(rightnode),
894 rightnode=hex(rightnode),
895 comparison=comparison)
895 comparison=comparison)
896
896
897 @webcommand('annotate')
897 @webcommand('annotate')
898 def annotate(web, req, tmpl):
898 def annotate(web, req, tmpl):
899 """
899 """
900 /annotate/{revision}/{path}
900 /annotate/{revision}/{path}
901 ---------------------------
901 ---------------------------
902
902
903 Show changeset information for each line in a file.
903 Show changeset information for each line in a file.
904
904
905 The ``fileannotate`` template is rendered.
905 The ``fileannotate`` template is rendered.
906 """
906 """
907 fctx = webutil.filectx(web.repo, req)
907 fctx = webutil.filectx(web.repo, req)
908 f = fctx.path()
908 f = fctx.path()
909 parity = paritygen(web.stripecount)
909 parity = paritygen(web.stripecount)
910 diffopts = patch.difffeatureopts(web.repo.ui, untrusted=True,
910 diffopts = patch.difffeatureopts(web.repo.ui, untrusted=True,
911 section='annotate', whitespace=True)
911 section='annotate', whitespace=True)
912
912
913 def annotate(**map):
913 def annotate(**map):
914 last = None
914 last = None
915 if util.binary(fctx.data()):
915 if util.binary(fctx.data()):
916 mt = (mimetypes.guess_type(fctx.path())[0]
916 mt = (mimetypes.guess_type(fctx.path())[0]
917 or 'application/octet-stream')
917 or 'application/octet-stream')
918 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
918 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
919 '(binary:%s)' % mt)])
919 '(binary:%s)' % mt)])
920 else:
920 else:
921 lines = enumerate(fctx.annotate(follow=True, linenumber=True,
921 lines = enumerate(fctx.annotate(follow=True, linenumber=True,
922 diffopts=diffopts))
922 diffopts=diffopts))
923 for lineno, ((f, targetline), l) in lines:
923 for lineno, ((f, targetline), l) in lines:
924 fnode = f.filenode()
924 fnode = f.filenode()
925
925
926 if last != fnode:
926 if last != fnode:
927 last = fnode
927 last = fnode
928
928
929 yield {"parity": parity.next(),
929 yield {"parity": parity.next(),
930 "node": f.hex(),
930 "node": f.hex(),
931 "rev": f.rev(),
931 "rev": f.rev(),
932 "author": f.user(),
932 "author": f.user(),
933 "desc": f.description(),
933 "desc": f.description(),
934 "extra": f.extra(),
934 "extra": f.extra(),
935 "file": f.path(),
935 "file": f.path(),
936 "targetline": targetline,
936 "targetline": targetline,
937 "line": l,
937 "line": l,
938 "lineno": lineno + 1,
938 "lineno": lineno + 1,
939 "lineid": "l%d" % (lineno + 1),
939 "lineid": "l%d" % (lineno + 1),
940 "linenumber": "% 6d" % (lineno + 1),
940 "linenumber": "% 6d" % (lineno + 1),
941 "revdate": f.date()}
941 "revdate": f.date()}
942
942
943 return tmpl("fileannotate",
943 return tmpl("fileannotate",
944 file=f,
944 file=f,
945 annotate=annotate,
945 annotate=annotate,
946 path=webutil.up(f),
946 path=webutil.up(f),
947 rev=fctx.rev(),
947 rev=fctx.rev(),
948 symrev=webutil.symrevorshortnode(req, fctx),
948 symrev=webutil.symrevorshortnode(req, fctx),
949 node=fctx.hex(),
949 node=fctx.hex(),
950 author=fctx.user(),
950 author=fctx.user(),
951 date=fctx.date(),
951 date=fctx.date(),
952 desc=fctx.description(),
952 desc=fctx.description(),
953 extra=fctx.extra(),
953 extra=fctx.extra(),
954 rename=webutil.renamelink(fctx),
954 rename=webutil.renamelink(fctx),
955 branch=webutil.nodebranchnodefault(fctx),
955 branch=webutil.nodebranchnodefault(fctx),
956 parent=webutil.parents(fctx),
956 parent=webutil.parents(fctx),
957 child=webutil.children(fctx),
957 child=webutil.children(fctx),
958 tags=webutil.nodetagsdict(web.repo, fctx.node()),
958 tags=webutil.nodetagsdict(web.repo, fctx.node()),
959 bookmarks=webutil.nodebookmarksdict(web.repo, fctx.node()),
959 bookmarks=webutil.nodebookmarksdict(web.repo, fctx.node()),
960 permissions=fctx.manifest().flags(f))
960 permissions=fctx.manifest().flags(f))
961
961
962 @webcommand('filelog')
962 @webcommand('filelog')
963 def filelog(web, req, tmpl):
963 def filelog(web, req, tmpl):
964 """
964 """
965 /filelog/{revision}/{path}
965 /filelog/{revision}/{path}
966 --------------------------
966 --------------------------
967
967
968 Show information about the history of a file in the repository.
968 Show information about the history of a file in the repository.
969
969
970 The ``revcount`` query string argument can be defined to control the
970 The ``revcount`` query string argument can be defined to control the
971 maximum number of entries to show.
971 maximum number of entries to show.
972
972
973 The ``filelog`` template will be rendered.
973 The ``filelog`` template will be rendered.
974 """
974 """
975
975
976 try:
976 try:
977 fctx = webutil.filectx(web.repo, req)
977 fctx = webutil.filectx(web.repo, req)
978 f = fctx.path()
978 f = fctx.path()
979 fl = fctx.filelog()
979 fl = fctx.filelog()
980 except error.LookupError:
980 except error.LookupError:
981 f = webutil.cleanpath(web.repo, req.form['file'][0])
981 f = webutil.cleanpath(web.repo, req.form['file'][0])
982 fl = web.repo.file(f)
982 fl = web.repo.file(f)
983 numrevs = len(fl)
983 numrevs = len(fl)
984 if not numrevs: # file doesn't exist at all
984 if not numrevs: # file doesn't exist at all
985 raise
985 raise
986 rev = webutil.changectx(web.repo, req).rev()
986 rev = webutil.changectx(web.repo, req).rev()
987 first = fl.linkrev(0)
987 first = fl.linkrev(0)
988 if rev < first: # current rev is from before file existed
988 if rev < first: # current rev is from before file existed
989 raise
989 raise
990 frev = numrevs - 1
990 frev = numrevs - 1
991 while fl.linkrev(frev) > rev:
991 while fl.linkrev(frev) > rev:
992 frev -= 1
992 frev -= 1
993 fctx = web.repo.filectx(f, fl.linkrev(frev))
993 fctx = web.repo.filectx(f, fl.linkrev(frev))
994
994
995 revcount = web.maxshortchanges
995 revcount = web.maxshortchanges
996 if 'revcount' in req.form:
996 if 'revcount' in req.form:
997 try:
997 try:
998 revcount = int(req.form.get('revcount', [revcount])[0])
998 revcount = int(req.form.get('revcount', [revcount])[0])
999 revcount = max(revcount, 1)
999 revcount = max(revcount, 1)
1000 tmpl.defaults['sessionvars']['revcount'] = revcount
1000 tmpl.defaults['sessionvars']['revcount'] = revcount
1001 except ValueError:
1001 except ValueError:
1002 pass
1002 pass
1003
1003
1004 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1004 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1005 lessvars['revcount'] = max(revcount / 2, 1)
1005 lessvars['revcount'] = max(revcount / 2, 1)
1006 morevars = copy.copy(tmpl.defaults['sessionvars'])
1006 morevars = copy.copy(tmpl.defaults['sessionvars'])
1007 morevars['revcount'] = revcount * 2
1007 morevars['revcount'] = revcount * 2
1008
1008
1009 count = fctx.filerev() + 1
1009 count = fctx.filerev() + 1
1010 start = max(0, fctx.filerev() - revcount + 1) # first rev on this page
1010 start = max(0, fctx.filerev() - revcount + 1) # first rev on this page
1011 end = min(count, start + revcount) # last rev on this page
1011 end = min(count, start + revcount) # last rev on this page
1012 parity = paritygen(web.stripecount, offset=start - end)
1012 parity = paritygen(web.stripecount, offset=start - end)
1013
1013
1014 def entries():
1014 def entries():
1015 l = []
1015 l = []
1016
1016
1017 repo = web.repo
1017 repo = web.repo
1018 revs = fctx.filelog().revs(start, end - 1)
1018 revs = fctx.filelog().revs(start, end - 1)
1019 for i in revs:
1019 for i in revs:
1020 iterfctx = fctx.filectx(i)
1020 iterfctx = fctx.filectx(i)
1021
1021
1022 l.append({"parity": parity.next(),
1022 l.append({"parity": parity.next(),
1023 "filerev": i,
1023 "filerev": i,
1024 "file": f,
1024 "file": f,
1025 "node": iterfctx.hex(),
1025 "node": iterfctx.hex(),
1026 "author": iterfctx.user(),
1026 "author": iterfctx.user(),
1027 "date": iterfctx.date(),
1027 "date": iterfctx.date(),
1028 "rename": webutil.renamelink(iterfctx),
1028 "rename": webutil.renamelink(iterfctx),
1029 "parent": lambda **x: webutil.parents(iterfctx),
1029 "parent": lambda **x: webutil.parents(iterfctx),
1030 "child": lambda **x: webutil.children(iterfctx),
1030 "child": lambda **x: webutil.children(iterfctx),
1031 "desc": iterfctx.description(),
1031 "desc": iterfctx.description(),
1032 "extra": iterfctx.extra(),
1032 "extra": iterfctx.extra(),
1033 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
1033 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
1034 "bookmarks": webutil.nodebookmarksdict(
1034 "bookmarks": webutil.nodebookmarksdict(
1035 repo, iterfctx.node()),
1035 repo, iterfctx.node()),
1036 "branch": webutil.nodebranchnodefault(iterfctx),
1036 "branch": webutil.nodebranchnodefault(iterfctx),
1037 "inbranch": webutil.nodeinbranch(repo, iterfctx),
1037 "inbranch": webutil.nodeinbranch(repo, iterfctx),
1038 "branches": webutil.nodebranchdict(repo, iterfctx)})
1038 "branches": webutil.nodebranchdict(repo, iterfctx)})
1039 for e in reversed(l):
1039 for e in reversed(l):
1040 yield e
1040 yield e
1041
1041
1042 entries = list(entries())
1042 entries = list(entries())
1043 latestentry = entries[:1]
1043 latestentry = entries[:1]
1044
1044
1045 revnav = webutil.filerevnav(web.repo, fctx.path())
1045 revnav = webutil.filerevnav(web.repo, fctx.path())
1046 nav = revnav.gen(end - 1, revcount, count)
1046 nav = revnav.gen(end - 1, revcount, count)
1047 return tmpl("filelog", file=f, node=fctx.hex(), nav=nav,
1047 return tmpl("filelog", file=f, node=fctx.hex(), nav=nav,
1048 rev=fctx.rev(),
1048 symrev=webutil.symrevorshortnode(req, fctx),
1049 symrev=webutil.symrevorshortnode(req, fctx),
1050 branch=webutil.nodebranchnodefault(fctx),
1051 tags=webutil.nodetagsdict(web.repo, fctx.node()),
1052 bookmarks=webutil.nodebookmarksdict(web.repo, fctx.node()),
1049 entries=entries,
1053 entries=entries,
1050 latestentry=latestentry,
1054 latestentry=latestentry,
1051 revcount=revcount, morevars=morevars, lessvars=lessvars)
1055 revcount=revcount, morevars=morevars, lessvars=lessvars)
1052
1056
1053 @webcommand('archive')
1057 @webcommand('archive')
1054 def archive(web, req, tmpl):
1058 def archive(web, req, tmpl):
1055 """
1059 """
1056 /archive/{revision}.{format}[/{path}]
1060 /archive/{revision}.{format}[/{path}]
1057 -------------------------------------
1061 -------------------------------------
1058
1062
1059 Obtain an archive of repository content.
1063 Obtain an archive of repository content.
1060
1064
1061 The content and type of the archive is defined by a URL path parameter.
1065 The content and type of the archive is defined by a URL path parameter.
1062 ``format`` is the file extension of the archive type to be generated. e.g.
1066 ``format`` is the file extension of the archive type to be generated. e.g.
1063 ``zip`` or ``tar.bz2``. Not all archive types may be allowed by your
1067 ``zip`` or ``tar.bz2``. Not all archive types may be allowed by your
1064 server configuration.
1068 server configuration.
1065
1069
1066 The optional ``path`` URL parameter controls content to include in the
1070 The optional ``path`` URL parameter controls content to include in the
1067 archive. If omitted, every file in the specified revision is present in the
1071 archive. If omitted, every file in the specified revision is present in the
1068 archive. If included, only the specified file or contents of the specified
1072 archive. If included, only the specified file or contents of the specified
1069 directory will be included in the archive.
1073 directory will be included in the archive.
1070
1074
1071 No template is used for this handler. Raw, binary content is generated.
1075 No template is used for this handler. Raw, binary content is generated.
1072 """
1076 """
1073
1077
1074 type_ = req.form.get('type', [None])[0]
1078 type_ = req.form.get('type', [None])[0]
1075 allowed = web.configlist("web", "allow_archive")
1079 allowed = web.configlist("web", "allow_archive")
1076 key = req.form['node'][0]
1080 key = req.form['node'][0]
1077
1081
1078 if type_ not in web.archives:
1082 if type_ not in web.archives:
1079 msg = 'Unsupported archive type: %s' % type_
1083 msg = 'Unsupported archive type: %s' % type_
1080 raise ErrorResponse(HTTP_NOT_FOUND, msg)
1084 raise ErrorResponse(HTTP_NOT_FOUND, msg)
1081
1085
1082 if not ((type_ in allowed or
1086 if not ((type_ in allowed or
1083 web.configbool("web", "allow" + type_, False))):
1087 web.configbool("web", "allow" + type_, False))):
1084 msg = 'Archive type not allowed: %s' % type_
1088 msg = 'Archive type not allowed: %s' % type_
1085 raise ErrorResponse(HTTP_FORBIDDEN, msg)
1089 raise ErrorResponse(HTTP_FORBIDDEN, msg)
1086
1090
1087 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
1091 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
1088 cnode = web.repo.lookup(key)
1092 cnode = web.repo.lookup(key)
1089 arch_version = key
1093 arch_version = key
1090 if cnode == key or key == 'tip':
1094 if cnode == key or key == 'tip':
1091 arch_version = short(cnode)
1095 arch_version = short(cnode)
1092 name = "%s-%s" % (reponame, arch_version)
1096 name = "%s-%s" % (reponame, arch_version)
1093
1097
1094 ctx = webutil.changectx(web.repo, req)
1098 ctx = webutil.changectx(web.repo, req)
1095 pats = []
1099 pats = []
1096 matchfn = scmutil.match(ctx, [])
1100 matchfn = scmutil.match(ctx, [])
1097 file = req.form.get('file', None)
1101 file = req.form.get('file', None)
1098 if file:
1102 if file:
1099 pats = ['path:' + file[0]]
1103 pats = ['path:' + file[0]]
1100 matchfn = scmutil.match(ctx, pats, default='path')
1104 matchfn = scmutil.match(ctx, pats, default='path')
1101 if pats:
1105 if pats:
1102 files = [f for f in ctx.manifest().keys() if matchfn(f)]
1106 files = [f for f in ctx.manifest().keys() if matchfn(f)]
1103 if not files:
1107 if not files:
1104 raise ErrorResponse(HTTP_NOT_FOUND,
1108 raise ErrorResponse(HTTP_NOT_FOUND,
1105 'file(s) not found: %s' % file[0])
1109 'file(s) not found: %s' % file[0])
1106
1110
1107 mimetype, artype, extension, encoding = web.archivespecs[type_]
1111 mimetype, artype, extension, encoding = web.archivespecs[type_]
1108 headers = [
1112 headers = [
1109 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
1113 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
1110 ]
1114 ]
1111 if encoding:
1115 if encoding:
1112 headers.append(('Content-Encoding', encoding))
1116 headers.append(('Content-Encoding', encoding))
1113 req.headers.extend(headers)
1117 req.headers.extend(headers)
1114 req.respond(HTTP_OK, mimetype)
1118 req.respond(HTTP_OK, mimetype)
1115
1119
1116 archival.archive(web.repo, req, cnode, artype, prefix=name,
1120 archival.archive(web.repo, req, cnode, artype, prefix=name,
1117 matchfn=matchfn,
1121 matchfn=matchfn,
1118 subrepos=web.configbool("web", "archivesubrepos"))
1122 subrepos=web.configbool("web", "archivesubrepos"))
1119 return []
1123 return []
1120
1124
1121
1125
1122 @webcommand('static')
1126 @webcommand('static')
1123 def static(web, req, tmpl):
1127 def static(web, req, tmpl):
1124 fname = req.form['file'][0]
1128 fname = req.form['file'][0]
1125 # a repo owner may set web.static in .hg/hgrc to get any file
1129 # a repo owner may set web.static in .hg/hgrc to get any file
1126 # readable by the user running the CGI script
1130 # readable by the user running the CGI script
1127 static = web.config("web", "static", None, untrusted=False)
1131 static = web.config("web", "static", None, untrusted=False)
1128 if not static:
1132 if not static:
1129 tp = web.templatepath or templater.templatepaths()
1133 tp = web.templatepath or templater.templatepaths()
1130 if isinstance(tp, str):
1134 if isinstance(tp, str):
1131 tp = [tp]
1135 tp = [tp]
1132 static = [os.path.join(p, 'static') for p in tp]
1136 static = [os.path.join(p, 'static') for p in tp]
1133 staticfile(static, fname, req)
1137 staticfile(static, fname, req)
1134 return []
1138 return []
1135
1139
1136 @webcommand('graph')
1140 @webcommand('graph')
1137 def graph(web, req, tmpl):
1141 def graph(web, req, tmpl):
1138 """
1142 """
1139 /graph[/{revision}]
1143 /graph[/{revision}]
1140 -------------------
1144 -------------------
1141
1145
1142 Show information about the graphical topology of the repository.
1146 Show information about the graphical topology of the repository.
1143
1147
1144 Information rendered by this handler can be used to create visual
1148 Information rendered by this handler can be used to create visual
1145 representations of repository topology.
1149 representations of repository topology.
1146
1150
1147 The ``revision`` URL parameter controls the starting changeset.
1151 The ``revision`` URL parameter controls the starting changeset.
1148
1152
1149 The ``revcount`` query string argument can define the number of changesets
1153 The ``revcount`` query string argument can define the number of changesets
1150 to show information for.
1154 to show information for.
1151
1155
1152 This handler will render the ``graph`` template.
1156 This handler will render the ``graph`` template.
1153 """
1157 """
1154
1158
1155 if 'node' in req.form:
1159 if 'node' in req.form:
1156 ctx = webutil.changectx(web.repo, req)
1160 ctx = webutil.changectx(web.repo, req)
1157 symrev = webutil.symrevorshortnode(req, ctx)
1161 symrev = webutil.symrevorshortnode(req, ctx)
1158 else:
1162 else:
1159 ctx = web.repo['tip']
1163 ctx = web.repo['tip']
1160 symrev = 'tip'
1164 symrev = 'tip'
1161 rev = ctx.rev()
1165 rev = ctx.rev()
1162
1166
1163 bg_height = 39
1167 bg_height = 39
1164 revcount = web.maxshortchanges
1168 revcount = web.maxshortchanges
1165 if 'revcount' in req.form:
1169 if 'revcount' in req.form:
1166 try:
1170 try:
1167 revcount = int(req.form.get('revcount', [revcount])[0])
1171 revcount = int(req.form.get('revcount', [revcount])[0])
1168 revcount = max(revcount, 1)
1172 revcount = max(revcount, 1)
1169 tmpl.defaults['sessionvars']['revcount'] = revcount
1173 tmpl.defaults['sessionvars']['revcount'] = revcount
1170 except ValueError:
1174 except ValueError:
1171 pass
1175 pass
1172
1176
1173 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1177 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1174 lessvars['revcount'] = max(revcount / 2, 1)
1178 lessvars['revcount'] = max(revcount / 2, 1)
1175 morevars = copy.copy(tmpl.defaults['sessionvars'])
1179 morevars = copy.copy(tmpl.defaults['sessionvars'])
1176 morevars['revcount'] = revcount * 2
1180 morevars['revcount'] = revcount * 2
1177
1181
1178 count = len(web.repo)
1182 count = len(web.repo)
1179 pos = rev
1183 pos = rev
1180
1184
1181 uprev = min(max(0, count - 1), rev + revcount)
1185 uprev = min(max(0, count - 1), rev + revcount)
1182 downrev = max(0, rev - revcount)
1186 downrev = max(0, rev - revcount)
1183 changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
1187 changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
1184
1188
1185 tree = []
1189 tree = []
1186 if pos != -1:
1190 if pos != -1:
1187 allrevs = web.repo.changelog.revs(pos, 0)
1191 allrevs = web.repo.changelog.revs(pos, 0)
1188 revs = []
1192 revs = []
1189 for i in allrevs:
1193 for i in allrevs:
1190 revs.append(i)
1194 revs.append(i)
1191 if len(revs) >= revcount:
1195 if len(revs) >= revcount:
1192 break
1196 break
1193
1197
1194 # We have to feed a baseset to dagwalker as it is expecting smartset
1198 # We have to feed a baseset to dagwalker as it is expecting smartset
1195 # object. This does not have a big impact on hgweb performance itself
1199 # object. This does not have a big impact on hgweb performance itself
1196 # since hgweb graphing code is not itself lazy yet.
1200 # since hgweb graphing code is not itself lazy yet.
1197 dag = graphmod.dagwalker(web.repo, revset.baseset(revs))
1201 dag = graphmod.dagwalker(web.repo, revset.baseset(revs))
1198 # As we said one line above... not lazy.
1202 # As we said one line above... not lazy.
1199 tree = list(graphmod.colored(dag, web.repo))
1203 tree = list(graphmod.colored(dag, web.repo))
1200
1204
1201 def getcolumns(tree):
1205 def getcolumns(tree):
1202 cols = 0
1206 cols = 0
1203 for (id, type, ctx, vtx, edges) in tree:
1207 for (id, type, ctx, vtx, edges) in tree:
1204 if type != graphmod.CHANGESET:
1208 if type != graphmod.CHANGESET:
1205 continue
1209 continue
1206 cols = max(cols, max([edge[0] for edge in edges] or [0]),
1210 cols = max(cols, max([edge[0] for edge in edges] or [0]),
1207 max([edge[1] for edge in edges] or [0]))
1211 max([edge[1] for edge in edges] or [0]))
1208 return cols
1212 return cols
1209
1213
1210 def graphdata(usetuples, **map):
1214 def graphdata(usetuples, **map):
1211 data = []
1215 data = []
1212
1216
1213 row = 0
1217 row = 0
1214 for (id, type, ctx, vtx, edges) in tree:
1218 for (id, type, ctx, vtx, edges) in tree:
1215 if type != graphmod.CHANGESET:
1219 if type != graphmod.CHANGESET:
1216 continue
1220 continue
1217 node = str(ctx)
1221 node = str(ctx)
1218 age = templatefilters.age(ctx.date())
1222 age = templatefilters.age(ctx.date())
1219 desc = templatefilters.firstline(ctx.description())
1223 desc = templatefilters.firstline(ctx.description())
1220 desc = cgi.escape(templatefilters.nonempty(desc))
1224 desc = cgi.escape(templatefilters.nonempty(desc))
1221 user = cgi.escape(templatefilters.person(ctx.user()))
1225 user = cgi.escape(templatefilters.person(ctx.user()))
1222 branch = cgi.escape(ctx.branch())
1226 branch = cgi.escape(ctx.branch())
1223 try:
1227 try:
1224 branchnode = web.repo.branchtip(branch)
1228 branchnode = web.repo.branchtip(branch)
1225 except error.RepoLookupError:
1229 except error.RepoLookupError:
1226 branchnode = None
1230 branchnode = None
1227 branch = branch, branchnode == ctx.node()
1231 branch = branch, branchnode == ctx.node()
1228
1232
1229 if usetuples:
1233 if usetuples:
1230 data.append((node, vtx, edges, desc, user, age, branch,
1234 data.append((node, vtx, edges, desc, user, age, branch,
1231 [cgi.escape(x) for x in ctx.tags()],
1235 [cgi.escape(x) for x in ctx.tags()],
1232 [cgi.escape(x) for x in ctx.bookmarks()]))
1236 [cgi.escape(x) for x in ctx.bookmarks()]))
1233 else:
1237 else:
1234 edgedata = [{'col': edge[0], 'nextcol': edge[1],
1238 edgedata = [{'col': edge[0], 'nextcol': edge[1],
1235 'color': (edge[2] - 1) % 6 + 1,
1239 'color': (edge[2] - 1) % 6 + 1,
1236 'width': edge[3], 'bcolor': edge[4]}
1240 'width': edge[3], 'bcolor': edge[4]}
1237 for edge in edges]
1241 for edge in edges]
1238
1242
1239 data.append(
1243 data.append(
1240 {'node': node,
1244 {'node': node,
1241 'col': vtx[0],
1245 'col': vtx[0],
1242 'color': (vtx[1] - 1) % 6 + 1,
1246 'color': (vtx[1] - 1) % 6 + 1,
1243 'edges': edgedata,
1247 'edges': edgedata,
1244 'row': row,
1248 'row': row,
1245 'nextrow': row + 1,
1249 'nextrow': row + 1,
1246 'desc': desc,
1250 'desc': desc,
1247 'user': user,
1251 'user': user,
1248 'age': age,
1252 'age': age,
1249 'bookmarks': webutil.nodebookmarksdict(
1253 'bookmarks': webutil.nodebookmarksdict(
1250 web.repo, ctx.node()),
1254 web.repo, ctx.node()),
1251 'branches': webutil.nodebranchdict(web.repo, ctx),
1255 'branches': webutil.nodebranchdict(web.repo, ctx),
1252 'inbranch': webutil.nodeinbranch(web.repo, ctx),
1256 'inbranch': webutil.nodeinbranch(web.repo, ctx),
1253 'tags': webutil.nodetagsdict(web.repo, ctx.node())})
1257 'tags': webutil.nodetagsdict(web.repo, ctx.node())})
1254
1258
1255 row += 1
1259 row += 1
1256
1260
1257 return data
1261 return data
1258
1262
1259 cols = getcolumns(tree)
1263 cols = getcolumns(tree)
1260 rows = len(tree)
1264 rows = len(tree)
1261 canvasheight = (rows + 1) * bg_height - 27
1265 canvasheight = (rows + 1) * bg_height - 27
1262
1266
1263 return tmpl('graph', rev=rev, symrev=symrev, revcount=revcount,
1267 return tmpl('graph', rev=rev, symrev=symrev, revcount=revcount,
1264 uprev=uprev,
1268 uprev=uprev,
1265 lessvars=lessvars, morevars=morevars, downrev=downrev,
1269 lessvars=lessvars, morevars=morevars, downrev=downrev,
1266 cols=cols, rows=rows,
1270 cols=cols, rows=rows,
1267 canvaswidth=(cols + 1) * bg_height,
1271 canvaswidth=(cols + 1) * bg_height,
1268 truecanvasheight=rows * bg_height,
1272 truecanvasheight=rows * bg_height,
1269 canvasheight=canvasheight, bg_height=bg_height,
1273 canvasheight=canvasheight, bg_height=bg_height,
1270 jsdata=lambda **x: graphdata(True, **x),
1274 jsdata=lambda **x: graphdata(True, **x),
1271 nodes=lambda **x: graphdata(False, **x),
1275 nodes=lambda **x: graphdata(False, **x),
1272 node=ctx.hex(), changenav=changenav)
1276 node=ctx.hex(), changenav=changenav)
1273
1277
1274 def _getdoc(e):
1278 def _getdoc(e):
1275 doc = e[0].__doc__
1279 doc = e[0].__doc__
1276 if doc:
1280 if doc:
1277 doc = _(doc).partition('\n')[0]
1281 doc = _(doc).partition('\n')[0]
1278 else:
1282 else:
1279 doc = _('(no help text available)')
1283 doc = _('(no help text available)')
1280 return doc
1284 return doc
1281
1285
1282 @webcommand('help')
1286 @webcommand('help')
1283 def help(web, req, tmpl):
1287 def help(web, req, tmpl):
1284 """
1288 """
1285 /help[/{topic}]
1289 /help[/{topic}]
1286 ---------------
1290 ---------------
1287
1291
1288 Render help documentation.
1292 Render help documentation.
1289
1293
1290 This web command is roughly equivalent to :hg:`help`. If a ``topic``
1294 This web command is roughly equivalent to :hg:`help`. If a ``topic``
1291 is defined, that help topic will be rendered. If not, an index of
1295 is defined, that help topic will be rendered. If not, an index of
1292 available help topics will be rendered.
1296 available help topics will be rendered.
1293
1297
1294 The ``help`` template will be rendered when requesting help for a topic.
1298 The ``help`` template will be rendered when requesting help for a topic.
1295 ``helptopics`` will be rendered for the index of help topics.
1299 ``helptopics`` will be rendered for the index of help topics.
1296 """
1300 """
1297 from .. import commands, help as helpmod # avoid cycle
1301 from .. import commands, help as helpmod # avoid cycle
1298
1302
1299 topicname = req.form.get('node', [None])[0]
1303 topicname = req.form.get('node', [None])[0]
1300 if not topicname:
1304 if not topicname:
1301 def topics(**map):
1305 def topics(**map):
1302 for entries, summary, _doc in helpmod.helptable:
1306 for entries, summary, _doc in helpmod.helptable:
1303 yield {'topic': entries[0], 'summary': summary}
1307 yield {'topic': entries[0], 'summary': summary}
1304
1308
1305 early, other = [], []
1309 early, other = [], []
1306 primary = lambda s: s.partition('|')[0]
1310 primary = lambda s: s.partition('|')[0]
1307 for c, e in commands.table.iteritems():
1311 for c, e in commands.table.iteritems():
1308 doc = _getdoc(e)
1312 doc = _getdoc(e)
1309 if 'DEPRECATED' in doc or c.startswith('debug'):
1313 if 'DEPRECATED' in doc or c.startswith('debug'):
1310 continue
1314 continue
1311 cmd = primary(c)
1315 cmd = primary(c)
1312 if cmd.startswith('^'):
1316 if cmd.startswith('^'):
1313 early.append((cmd[1:], doc))
1317 early.append((cmd[1:], doc))
1314 else:
1318 else:
1315 other.append((cmd, doc))
1319 other.append((cmd, doc))
1316
1320
1317 early.sort()
1321 early.sort()
1318 other.sort()
1322 other.sort()
1319
1323
1320 def earlycommands(**map):
1324 def earlycommands(**map):
1321 for c, doc in early:
1325 for c, doc in early:
1322 yield {'topic': c, 'summary': doc}
1326 yield {'topic': c, 'summary': doc}
1323
1327
1324 def othercommands(**map):
1328 def othercommands(**map):
1325 for c, doc in other:
1329 for c, doc in other:
1326 yield {'topic': c, 'summary': doc}
1330 yield {'topic': c, 'summary': doc}
1327
1331
1328 return tmpl('helptopics', topics=topics, earlycommands=earlycommands,
1332 return tmpl('helptopics', topics=topics, earlycommands=earlycommands,
1329 othercommands=othercommands, title='Index')
1333 othercommands=othercommands, title='Index')
1330
1334
1331 u = webutil.wsgiui()
1335 u = webutil.wsgiui()
1332 u.verbose = True
1336 u.verbose = True
1333 try:
1337 try:
1334 doc = helpmod.help_(u, topicname)
1338 doc = helpmod.help_(u, topicname)
1335 except error.UnknownCommand:
1339 except error.UnknownCommand:
1336 raise ErrorResponse(HTTP_NOT_FOUND)
1340 raise ErrorResponse(HTTP_NOT_FOUND)
1337 return tmpl('help', topic=topicname, doc=doc)
1341 return tmpl('help', topic=topicname, doc=doc)
1338
1342
1339 # tell hggettext to extract docstrings from these functions:
1343 # tell hggettext to extract docstrings from these functions:
1340 i18nfunctions = commands.values()
1344 i18nfunctions = commands.values()
@@ -1,82 +1,85 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|urlescape}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
4 href="{url|urlescape}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|urlescape}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
6 href="{url|urlescape}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="{logourl}">
13 <a href="{logourl}">
14 <img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
14 <img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
15 </div>
15 </div>
16 <ul>
16 <ul>
17 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
17 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
18 <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
18 <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
19 <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
19 <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
20 <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
20 <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
21 <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
22 </ul>
22 </ul>
23 <ul>
23 <ul>
24 <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
24 <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
25 <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
25 <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
26 </ul>
26 </ul>
27 <ul>
27 <ul>
28 <li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
28 <li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
29 <li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
29 <li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
30 <li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
30 <li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
31 <li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
31 <li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
32 <li class="active">file log</li>
32 <li class="active">file log</li>
33 <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
33 <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
34 </ul>
34 </ul>
35 <ul>
35 <ul>
36 <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
36 <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
37 </ul>
37 </ul>
38 <div class="atom-logo">
38 <div class="atom-logo">
39 <a href="{url|urlescape}atom-log/{node|short}/{file|urlescape}" title="subscribe to atom feed">
39 <a href="{url|urlescape}atom-log/{node|short}/{file|urlescape}" title="subscribe to atom feed">
40 <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
40 <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
41 </a>
41 </a>
42 </div>
42 </div>
43 </div>
43 </div>
44
44
45 <div class="main">
45 <div class="main">
46 <h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
46 <h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
47 <h3>log {file|escape}</h3>
47 <h3>
48 log {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
49 {branch%changelogbranchname}{tags%changelogtag}{bookmarks%changelogtag}
50 </h3>
48
51
49 <form class="search" action="{url|urlescape}log">
52 <form class="search" action="{url|urlescape}log">
50 {sessionvars%hiddenformentry}
53 {sessionvars%hiddenformentry}
51 <p><input name="rev" id="search1" type="text" size="30" /></p>
54 <p><input name="rev" id="search1" type="text" size="30" /></p>
52 <div id="hint">{searchhint}</div>
55 <div id="hint">{searchhint}</div>
53 </form>
56 </form>
54
57
55 <div class="navigate">
58 <div class="navigate">
56 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
59 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
57 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
60 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
58 | {nav%filenav}</div>
61 | {nav%filenav}</div>
59
62
60 <table class="bigtable">
63 <table class="bigtable">
61 <thead>
64 <thead>
62 <tr>
65 <tr>
63 <th class="age">age</th>
66 <th class="age">age</th>
64 <th class="author">author</th>
67 <th class="author">author</th>
65 <th class="description">description</th>
68 <th class="description">description</th>
66 </tr>
69 </tr>
67 </thead>
70 </thead>
68 <tbody class="stripes2">
71 <tbody class="stripes2">
69 {entries%filelogentry}
72 {entries%filelogentry}
70 </tbody>
73 </tbody>
71 </table>
74 </table>
72
75
73 <div class="navigate">
76 <div class="navigate">
74 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
77 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
75 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
78 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
76 | {nav%filenav}
79 | {nav%filenav}
77 </div>
80 </div>
78
81
79 </div>
82 </div>
80 </div>
83 </div>
81
84
82 {footer}
85 {footer}
@@ -1,895 +1,907 b''
1 #require serve
1 #require serve
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ echo b > b
5 $ echo b > b
6 $ hg ci -Am "b"
6 $ hg ci -Am "b"
7 adding b
7 adding b
8 $ echo a > a
8 $ echo a > a
9 $ hg ci -Am "first a"
9 $ hg ci -Am "first a"
10 adding a
10 adding a
11 $ hg tag -r 1 a-tag
11 $ hg tag -r 1 a-tag
12 $ hg bookmark -r 1 a-bookmark
12 $ hg bookmark -r 1 a-bookmark
13 $ hg rm a
13 $ hg rm a
14 $ hg ci -m "del a"
14 $ hg ci -m "del a"
15 $ hg branch a-branch
15 $ hg branch a-branch
16 marked working directory as branch a-branch
16 marked working directory as branch a-branch
17 (branches are permanent and global, did you want a bookmark?)
17 (branches are permanent and global, did you want a bookmark?)
18 $ echo b > a
18 $ echo b > a
19 $ hg ci -Am "second a"
19 $ hg ci -Am "second a"
20 adding a
20 adding a
21 $ hg rm a
21 $ hg rm a
22 $ hg ci -m "del2 a"
22 $ hg ci -m "del2 a"
23 $ hg mv b c
23 $ hg mv b c
24 $ hg ci -m "mv b"
24 $ hg ci -m "mv b"
25 $ echo c >> c
25 $ echo c >> c
26 $ hg ci -m "change c"
26 $ hg ci -m "change c"
27 $ hg log -p
27 $ hg log -p
28 changeset: 7:46c1a66bd8fc
28 changeset: 7:46c1a66bd8fc
29 branch: a-branch
29 branch: a-branch
30 tag: tip
30 tag: tip
31 user: test
31 user: test
32 date: Thu Jan 01 00:00:00 1970 +0000
32 date: Thu Jan 01 00:00:00 1970 +0000
33 summary: change c
33 summary: change c
34
34
35 diff -r c9637d3cc8ef -r 46c1a66bd8fc c
35 diff -r c9637d3cc8ef -r 46c1a66bd8fc c
36 --- a/c Thu Jan 01 00:00:00 1970 +0000
36 --- a/c Thu Jan 01 00:00:00 1970 +0000
37 +++ b/c Thu Jan 01 00:00:00 1970 +0000
37 +++ b/c Thu Jan 01 00:00:00 1970 +0000
38 @@ -1,1 +1,2 @@
38 @@ -1,1 +1,2 @@
39 b
39 b
40 +c
40 +c
41
41
42 changeset: 6:c9637d3cc8ef
42 changeset: 6:c9637d3cc8ef
43 branch: a-branch
43 branch: a-branch
44 user: test
44 user: test
45 date: Thu Jan 01 00:00:00 1970 +0000
45 date: Thu Jan 01 00:00:00 1970 +0000
46 summary: mv b
46 summary: mv b
47
47
48 diff -r 958bd88be4eb -r c9637d3cc8ef b
48 diff -r 958bd88be4eb -r c9637d3cc8ef b
49 --- a/b Thu Jan 01 00:00:00 1970 +0000
49 --- a/b Thu Jan 01 00:00:00 1970 +0000
50 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
50 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
51 @@ -1,1 +0,0 @@
51 @@ -1,1 +0,0 @@
52 -b
52 -b
53 diff -r 958bd88be4eb -r c9637d3cc8ef c
53 diff -r 958bd88be4eb -r c9637d3cc8ef c
54 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
54 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
55 +++ b/c Thu Jan 01 00:00:00 1970 +0000
55 +++ b/c Thu Jan 01 00:00:00 1970 +0000
56 @@ -0,0 +1,1 @@
56 @@ -0,0 +1,1 @@
57 +b
57 +b
58
58
59 changeset: 5:958bd88be4eb
59 changeset: 5:958bd88be4eb
60 branch: a-branch
60 branch: a-branch
61 user: test
61 user: test
62 date: Thu Jan 01 00:00:00 1970 +0000
62 date: Thu Jan 01 00:00:00 1970 +0000
63 summary: del2 a
63 summary: del2 a
64
64
65 diff -r 3f41bc784e7e -r 958bd88be4eb a
65 diff -r 3f41bc784e7e -r 958bd88be4eb a
66 --- a/a Thu Jan 01 00:00:00 1970 +0000
66 --- a/a Thu Jan 01 00:00:00 1970 +0000
67 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
67 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
68 @@ -1,1 +0,0 @@
68 @@ -1,1 +0,0 @@
69 -b
69 -b
70
70
71 changeset: 4:3f41bc784e7e
71 changeset: 4:3f41bc784e7e
72 branch: a-branch
72 branch: a-branch
73 user: test
73 user: test
74 date: Thu Jan 01 00:00:00 1970 +0000
74 date: Thu Jan 01 00:00:00 1970 +0000
75 summary: second a
75 summary: second a
76
76
77 diff -r 292258f86fdf -r 3f41bc784e7e a
77 diff -r 292258f86fdf -r 3f41bc784e7e a
78 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
78 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
79 +++ b/a Thu Jan 01 00:00:00 1970 +0000
79 +++ b/a Thu Jan 01 00:00:00 1970 +0000
80 @@ -0,0 +1,1 @@
80 @@ -0,0 +1,1 @@
81 +b
81 +b
82
82
83 changeset: 3:292258f86fdf
83 changeset: 3:292258f86fdf
84 user: test
84 user: test
85 date: Thu Jan 01 00:00:00 1970 +0000
85 date: Thu Jan 01 00:00:00 1970 +0000
86 summary: del a
86 summary: del a
87
87
88 diff -r 94c9dd5ca9b4 -r 292258f86fdf a
88 diff -r 94c9dd5ca9b4 -r 292258f86fdf a
89 --- a/a Thu Jan 01 00:00:00 1970 +0000
89 --- a/a Thu Jan 01 00:00:00 1970 +0000
90 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
90 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
91 @@ -1,1 +0,0 @@
91 @@ -1,1 +0,0 @@
92 -a
92 -a
93
93
94 changeset: 2:94c9dd5ca9b4
94 changeset: 2:94c9dd5ca9b4
95 user: test
95 user: test
96 date: Thu Jan 01 00:00:00 1970 +0000
96 date: Thu Jan 01 00:00:00 1970 +0000
97 summary: Added tag a-tag for changeset 5ed941583260
97 summary: Added tag a-tag for changeset 5ed941583260
98
98
99 diff -r 5ed941583260 -r 94c9dd5ca9b4 .hgtags
99 diff -r 5ed941583260 -r 94c9dd5ca9b4 .hgtags
100 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
100 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
101 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
101 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
102 @@ -0,0 +1,1 @@
102 @@ -0,0 +1,1 @@
103 +5ed941583260248620985524192fdc382ef57c36 a-tag
103 +5ed941583260248620985524192fdc382ef57c36 a-tag
104
104
105 changeset: 1:5ed941583260
105 changeset: 1:5ed941583260
106 bookmark: a-bookmark
106 bookmark: a-bookmark
107 tag: a-tag
107 tag: a-tag
108 user: test
108 user: test
109 date: Thu Jan 01 00:00:00 1970 +0000
109 date: Thu Jan 01 00:00:00 1970 +0000
110 summary: first a
110 summary: first a
111
111
112 diff -r 6563da9dcf87 -r 5ed941583260 a
112 diff -r 6563da9dcf87 -r 5ed941583260 a
113 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
113 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
114 +++ b/a Thu Jan 01 00:00:00 1970 +0000
114 +++ b/a Thu Jan 01 00:00:00 1970 +0000
115 @@ -0,0 +1,1 @@
115 @@ -0,0 +1,1 @@
116 +a
116 +a
117
117
118 changeset: 0:6563da9dcf87
118 changeset: 0:6563da9dcf87
119 user: test
119 user: test
120 date: Thu Jan 01 00:00:00 1970 +0000
120 date: Thu Jan 01 00:00:00 1970 +0000
121 summary: b
121 summary: b
122
122
123 diff -r 000000000000 -r 6563da9dcf87 b
123 diff -r 000000000000 -r 6563da9dcf87 b
124 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
124 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
125 +++ b/b Thu Jan 01 00:00:00 1970 +0000
125 +++ b/b Thu Jan 01 00:00:00 1970 +0000
126 @@ -0,0 +1,1 @@
126 @@ -0,0 +1,1 @@
127 +b
127 +b
128
128
129 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
129 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
130 $ cat hg.pid >> $DAEMON_PIDS
130 $ cat hg.pid >> $DAEMON_PIDS
131
131
132 tip - two revisions
132 tip - two revisions
133
133
134 $ (get-with-headers.py localhost:$HGPORT 'log/tip/a')
134 $ (get-with-headers.py localhost:$HGPORT 'log/tip/a')
135 200 Script output follows
135 200 Script output follows
136
136
137 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
137 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
138 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
138 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
139 <head>
139 <head>
140 <link rel="icon" href="/static/hgicon.png" type="image/png" />
140 <link rel="icon" href="/static/hgicon.png" type="image/png" />
141 <meta name="robots" content="index, nofollow" />
141 <meta name="robots" content="index, nofollow" />
142 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
142 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
143 <script type="text/javascript" src="/static/mercurial.js"></script>
143 <script type="text/javascript" src="/static/mercurial.js"></script>
144
144
145 <title>test: a history</title>
145 <title>test: a history</title>
146 <link rel="alternate" type="application/atom+xml"
146 <link rel="alternate" type="application/atom+xml"
147 href="/atom-log/tip/a" title="Atom feed for test:a" />
147 href="/atom-log/tip/a" title="Atom feed for test:a" />
148 <link rel="alternate" type="application/rss+xml"
148 <link rel="alternate" type="application/rss+xml"
149 href="/rss-log/tip/a" title="RSS feed for test:a" />
149 href="/rss-log/tip/a" title="RSS feed for test:a" />
150 </head>
150 </head>
151 <body>
151 <body>
152
152
153 <div class="container">
153 <div class="container">
154 <div class="menu">
154 <div class="menu">
155 <div class="logo">
155 <div class="logo">
156 <a href="https://mercurial-scm.org/">
156 <a href="https://mercurial-scm.org/">
157 <img src="/static/hglogo.png" alt="mercurial" /></a>
157 <img src="/static/hglogo.png" alt="mercurial" /></a>
158 </div>
158 </div>
159 <ul>
159 <ul>
160 <li><a href="/shortlog/tip">log</a></li>
160 <li><a href="/shortlog/tip">log</a></li>
161 <li><a href="/graph/tip">graph</a></li>
161 <li><a href="/graph/tip">graph</a></li>
162 <li><a href="/tags">tags</a></li>
162 <li><a href="/tags">tags</a></li>
163 <li><a href="/bookmarks">bookmarks</a></li>
163 <li><a href="/bookmarks">bookmarks</a></li>
164 <li><a href="/branches">branches</a></li>
164 <li><a href="/branches">branches</a></li>
165 </ul>
165 </ul>
166 <ul>
166 <ul>
167 <li><a href="/rev/tip">changeset</a></li>
167 <li><a href="/rev/tip">changeset</a></li>
168 <li><a href="/file/tip">browse</a></li>
168 <li><a href="/file/tip">browse</a></li>
169 </ul>
169 </ul>
170 <ul>
170 <ul>
171 <li><a href="/file/tip/a">file</a></li>
171 <li><a href="/file/tip/a">file</a></li>
172 <li><a href="/diff/tip/a">diff</a></li>
172 <li><a href="/diff/tip/a">diff</a></li>
173 <li><a href="/comparison/tip/a">comparison</a></li>
173 <li><a href="/comparison/tip/a">comparison</a></li>
174 <li><a href="/annotate/tip/a">annotate</a></li>
174 <li><a href="/annotate/tip/a">annotate</a></li>
175 <li class="active">file log</li>
175 <li class="active">file log</li>
176 <li><a href="/raw-file/tip/a">raw</a></li>
176 <li><a href="/raw-file/tip/a">raw</a></li>
177 </ul>
177 </ul>
178 <ul>
178 <ul>
179 <li><a href="/help">help</a></li>
179 <li><a href="/help">help</a></li>
180 </ul>
180 </ul>
181 <div class="atom-logo">
181 <div class="atom-logo">
182 <a href="/atom-log/3f41bc784e7e/a" title="subscribe to atom feed">
182 <a href="/atom-log/3f41bc784e7e/a" title="subscribe to atom feed">
183 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
183 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
184 </a>
184 </a>
185 </div>
185 </div>
186 </div>
186 </div>
187
187
188 <div class="main">
188 <div class="main">
189 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
189 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
190 <h3>log a</h3>
190 <h3>
191 log a @ 4:<a href="/rev/3f41bc784e7e">3f41bc784e7e</a>
192 <span class="branchname">a-branch</span>
193 </h3>
191
194
192 <form class="search" action="/log">
195 <form class="search" action="/log">
193
196
194 <p><input name="rev" id="search1" type="text" size="30" /></p>
197 <p><input name="rev" id="search1" type="text" size="30" /></p>
195 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
198 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
196 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
199 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
197 </form>
200 </form>
198
201
199 <div class="navigate">
202 <div class="navigate">
200 <a href="/log/tip/a?revcount=30">less</a>
203 <a href="/log/tip/a?revcount=30">less</a>
201 <a href="/log/tip/a?revcount=120">more</a>
204 <a href="/log/tip/a?revcount=120">more</a>
202 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
205 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
203
206
204 <table class="bigtable">
207 <table class="bigtable">
205 <thead>
208 <thead>
206 <tr>
209 <tr>
207 <th class="age">age</th>
210 <th class="age">age</th>
208 <th class="author">author</th>
211 <th class="author">author</th>
209 <th class="description">description</th>
212 <th class="description">description</th>
210 </tr>
213 </tr>
211 </thead>
214 </thead>
212 <tbody class="stripes2">
215 <tbody class="stripes2">
213 <tr>
216 <tr>
214 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
217 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
215 <td class="author">test</td>
218 <td class="author">test</td>
216 <td class="description">
219 <td class="description">
217 <a href="/rev/3f41bc784e7e">second a</a>
220 <a href="/rev/3f41bc784e7e">second a</a>
218 <span class="branchname">a-branch</span>
221 <span class="branchname">a-branch</span>
219 </td>
222 </td>
220 </tr>
223 </tr>
221 <tr>
224 <tr>
222 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
225 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
223 <td class="author">test</td>
226 <td class="author">test</td>
224 <td class="description">
227 <td class="description">
225 <a href="/rev/5ed941583260">first a</a>
228 <a href="/rev/5ed941583260">first a</a>
226 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
229 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
227 </td>
230 </td>
228 </tr>
231 </tr>
229
232
230 </tbody>
233 </tbody>
231 </table>
234 </table>
232
235
233 <div class="navigate">
236 <div class="navigate">
234 <a href="/log/tip/a?revcount=30">less</a>
237 <a href="/log/tip/a?revcount=30">less</a>
235 <a href="/log/tip/a?revcount=120">more</a>
238 <a href="/log/tip/a?revcount=120">more</a>
236 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
239 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
237 </div>
240 </div>
238
241
239 </div>
242 </div>
240 </div>
243 </div>
241
244
242 <script type="text/javascript">process_dates()</script>
245 <script type="text/javascript">process_dates()</script>
243
246
244
247
245 </body>
248 </body>
246 </html>
249 </html>
247
250
248
251
249 second version - two revisions
252 second version - two revisions
250
253
251 $ (get-with-headers.py localhost:$HGPORT 'log/4/a')
254 $ (get-with-headers.py localhost:$HGPORT 'log/4/a')
252 200 Script output follows
255 200 Script output follows
253
256
254 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
257 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
255 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
258 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
256 <head>
259 <head>
257 <link rel="icon" href="/static/hgicon.png" type="image/png" />
260 <link rel="icon" href="/static/hgicon.png" type="image/png" />
258 <meta name="robots" content="index, nofollow" />
261 <meta name="robots" content="index, nofollow" />
259 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
262 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
260 <script type="text/javascript" src="/static/mercurial.js"></script>
263 <script type="text/javascript" src="/static/mercurial.js"></script>
261
264
262 <title>test: a history</title>
265 <title>test: a history</title>
263 <link rel="alternate" type="application/atom+xml"
266 <link rel="alternate" type="application/atom+xml"
264 href="/atom-log/tip/a" title="Atom feed for test:a" />
267 href="/atom-log/tip/a" title="Atom feed for test:a" />
265 <link rel="alternate" type="application/rss+xml"
268 <link rel="alternate" type="application/rss+xml"
266 href="/rss-log/tip/a" title="RSS feed for test:a" />
269 href="/rss-log/tip/a" title="RSS feed for test:a" />
267 </head>
270 </head>
268 <body>
271 <body>
269
272
270 <div class="container">
273 <div class="container">
271 <div class="menu">
274 <div class="menu">
272 <div class="logo">
275 <div class="logo">
273 <a href="https://mercurial-scm.org/">
276 <a href="https://mercurial-scm.org/">
274 <img src="/static/hglogo.png" alt="mercurial" /></a>
277 <img src="/static/hglogo.png" alt="mercurial" /></a>
275 </div>
278 </div>
276 <ul>
279 <ul>
277 <li><a href="/shortlog/4">log</a></li>
280 <li><a href="/shortlog/4">log</a></li>
278 <li><a href="/graph/4">graph</a></li>
281 <li><a href="/graph/4">graph</a></li>
279 <li><a href="/tags">tags</a></li>
282 <li><a href="/tags">tags</a></li>
280 <li><a href="/bookmarks">bookmarks</a></li>
283 <li><a href="/bookmarks">bookmarks</a></li>
281 <li><a href="/branches">branches</a></li>
284 <li><a href="/branches">branches</a></li>
282 </ul>
285 </ul>
283 <ul>
286 <ul>
284 <li><a href="/rev/4">changeset</a></li>
287 <li><a href="/rev/4">changeset</a></li>
285 <li><a href="/file/4">browse</a></li>
288 <li><a href="/file/4">browse</a></li>
286 </ul>
289 </ul>
287 <ul>
290 <ul>
288 <li><a href="/file/4/a">file</a></li>
291 <li><a href="/file/4/a">file</a></li>
289 <li><a href="/diff/4/a">diff</a></li>
292 <li><a href="/diff/4/a">diff</a></li>
290 <li><a href="/comparison/4/a">comparison</a></li>
293 <li><a href="/comparison/4/a">comparison</a></li>
291 <li><a href="/annotate/4/a">annotate</a></li>
294 <li><a href="/annotate/4/a">annotate</a></li>
292 <li class="active">file log</li>
295 <li class="active">file log</li>
293 <li><a href="/raw-file/4/a">raw</a></li>
296 <li><a href="/raw-file/4/a">raw</a></li>
294 </ul>
297 </ul>
295 <ul>
298 <ul>
296 <li><a href="/help">help</a></li>
299 <li><a href="/help">help</a></li>
297 </ul>
300 </ul>
298 <div class="atom-logo">
301 <div class="atom-logo">
299 <a href="/atom-log/3f41bc784e7e/a" title="subscribe to atom feed">
302 <a href="/atom-log/3f41bc784e7e/a" title="subscribe to atom feed">
300 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
303 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
301 </a>
304 </a>
302 </div>
305 </div>
303 </div>
306 </div>
304
307
305 <div class="main">
308 <div class="main">
306 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
309 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
307 <h3>log a</h3>
310 <h3>
311 log a @ 4:<a href="/rev/3f41bc784e7e">3f41bc784e7e</a>
312 <span class="branchname">a-branch</span>
313 </h3>
308
314
309 <form class="search" action="/log">
315 <form class="search" action="/log">
310
316
311 <p><input name="rev" id="search1" type="text" size="30" /></p>
317 <p><input name="rev" id="search1" type="text" size="30" /></p>
312 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
318 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
313 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
319 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
314 </form>
320 </form>
315
321
316 <div class="navigate">
322 <div class="navigate">
317 <a href="/log/4/a?revcount=30">less</a>
323 <a href="/log/4/a?revcount=30">less</a>
318 <a href="/log/4/a?revcount=120">more</a>
324 <a href="/log/4/a?revcount=120">more</a>
319 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
325 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
320
326
321 <table class="bigtable">
327 <table class="bigtable">
322 <thead>
328 <thead>
323 <tr>
329 <tr>
324 <th class="age">age</th>
330 <th class="age">age</th>
325 <th class="author">author</th>
331 <th class="author">author</th>
326 <th class="description">description</th>
332 <th class="description">description</th>
327 </tr>
333 </tr>
328 </thead>
334 </thead>
329 <tbody class="stripes2">
335 <tbody class="stripes2">
330 <tr>
336 <tr>
331 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
337 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
332 <td class="author">test</td>
338 <td class="author">test</td>
333 <td class="description">
339 <td class="description">
334 <a href="/rev/3f41bc784e7e">second a</a>
340 <a href="/rev/3f41bc784e7e">second a</a>
335 <span class="branchname">a-branch</span>
341 <span class="branchname">a-branch</span>
336 </td>
342 </td>
337 </tr>
343 </tr>
338 <tr>
344 <tr>
339 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
345 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
340 <td class="author">test</td>
346 <td class="author">test</td>
341 <td class="description">
347 <td class="description">
342 <a href="/rev/5ed941583260">first a</a>
348 <a href="/rev/5ed941583260">first a</a>
343 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
349 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
344 </td>
350 </td>
345 </tr>
351 </tr>
346
352
347 </tbody>
353 </tbody>
348 </table>
354 </table>
349
355
350 <div class="navigate">
356 <div class="navigate">
351 <a href="/log/4/a?revcount=30">less</a>
357 <a href="/log/4/a?revcount=30">less</a>
352 <a href="/log/4/a?revcount=120">more</a>
358 <a href="/log/4/a?revcount=120">more</a>
353 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
359 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
354 </div>
360 </div>
355
361
356 </div>
362 </div>
357 </div>
363 </div>
358
364
359 <script type="text/javascript">process_dates()</script>
365 <script type="text/javascript">process_dates()</script>
360
366
361
367
362 </body>
368 </body>
363 </html>
369 </html>
364
370
365
371
366 first deleted - one revision
372 first deleted - one revision
367
373
368 $ (get-with-headers.py localhost:$HGPORT 'log/3/a')
374 $ (get-with-headers.py localhost:$HGPORT 'log/3/a')
369 200 Script output follows
375 200 Script output follows
370
376
371 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
377 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
372 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
378 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
373 <head>
379 <head>
374 <link rel="icon" href="/static/hgicon.png" type="image/png" />
380 <link rel="icon" href="/static/hgicon.png" type="image/png" />
375 <meta name="robots" content="index, nofollow" />
381 <meta name="robots" content="index, nofollow" />
376 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
382 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
377 <script type="text/javascript" src="/static/mercurial.js"></script>
383 <script type="text/javascript" src="/static/mercurial.js"></script>
378
384
379 <title>test: a history</title>
385 <title>test: a history</title>
380 <link rel="alternate" type="application/atom+xml"
386 <link rel="alternate" type="application/atom+xml"
381 href="/atom-log/tip/a" title="Atom feed for test:a" />
387 href="/atom-log/tip/a" title="Atom feed for test:a" />
382 <link rel="alternate" type="application/rss+xml"
388 <link rel="alternate" type="application/rss+xml"
383 href="/rss-log/tip/a" title="RSS feed for test:a" />
389 href="/rss-log/tip/a" title="RSS feed for test:a" />
384 </head>
390 </head>
385 <body>
391 <body>
386
392
387 <div class="container">
393 <div class="container">
388 <div class="menu">
394 <div class="menu">
389 <div class="logo">
395 <div class="logo">
390 <a href="https://mercurial-scm.org/">
396 <a href="https://mercurial-scm.org/">
391 <img src="/static/hglogo.png" alt="mercurial" /></a>
397 <img src="/static/hglogo.png" alt="mercurial" /></a>
392 </div>
398 </div>
393 <ul>
399 <ul>
394 <li><a href="/shortlog/3">log</a></li>
400 <li><a href="/shortlog/3">log</a></li>
395 <li><a href="/graph/3">graph</a></li>
401 <li><a href="/graph/3">graph</a></li>
396 <li><a href="/tags">tags</a></li>
402 <li><a href="/tags">tags</a></li>
397 <li><a href="/bookmarks">bookmarks</a></li>
403 <li><a href="/bookmarks">bookmarks</a></li>
398 <li><a href="/branches">branches</a></li>
404 <li><a href="/branches">branches</a></li>
399 </ul>
405 </ul>
400 <ul>
406 <ul>
401 <li><a href="/rev/3">changeset</a></li>
407 <li><a href="/rev/3">changeset</a></li>
402 <li><a href="/file/3">browse</a></li>
408 <li><a href="/file/3">browse</a></li>
403 </ul>
409 </ul>
404 <ul>
410 <ul>
405 <li><a href="/file/3/a">file</a></li>
411 <li><a href="/file/3/a">file</a></li>
406 <li><a href="/diff/3/a">diff</a></li>
412 <li><a href="/diff/3/a">diff</a></li>
407 <li><a href="/comparison/3/a">comparison</a></li>
413 <li><a href="/comparison/3/a">comparison</a></li>
408 <li><a href="/annotate/3/a">annotate</a></li>
414 <li><a href="/annotate/3/a">annotate</a></li>
409 <li class="active">file log</li>
415 <li class="active">file log</li>
410 <li><a href="/raw-file/3/a">raw</a></li>
416 <li><a href="/raw-file/3/a">raw</a></li>
411 </ul>
417 </ul>
412 <ul>
418 <ul>
413 <li><a href="/help">help</a></li>
419 <li><a href="/help">help</a></li>
414 </ul>
420 </ul>
415 <div class="atom-logo">
421 <div class="atom-logo">
416 <a href="/atom-log/5ed941583260/a" title="subscribe to atom feed">
422 <a href="/atom-log/5ed941583260/a" title="subscribe to atom feed">
417 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
423 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
418 </a>
424 </a>
419 </div>
425 </div>
420 </div>
426 </div>
421
427
422 <div class="main">
428 <div class="main">
423 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
429 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
424 <h3>log a</h3>
430 <h3>
431 log a @ 1:<a href="/rev/5ed941583260">5ed941583260</a>
432 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
433 </h3>
425
434
426 <form class="search" action="/log">
435 <form class="search" action="/log">
427
436
428 <p><input name="rev" id="search1" type="text" size="30" /></p>
437 <p><input name="rev" id="search1" type="text" size="30" /></p>
429 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
438 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
430 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
439 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
431 </form>
440 </form>
432
441
433 <div class="navigate">
442 <div class="navigate">
434 <a href="/log/3/a?revcount=30">less</a>
443 <a href="/log/3/a?revcount=30">less</a>
435 <a href="/log/3/a?revcount=120">more</a>
444 <a href="/log/3/a?revcount=120">more</a>
436 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
445 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
437
446
438 <table class="bigtable">
447 <table class="bigtable">
439 <thead>
448 <thead>
440 <tr>
449 <tr>
441 <th class="age">age</th>
450 <th class="age">age</th>
442 <th class="author">author</th>
451 <th class="author">author</th>
443 <th class="description">description</th>
452 <th class="description">description</th>
444 </tr>
453 </tr>
445 </thead>
454 </thead>
446 <tbody class="stripes2">
455 <tbody class="stripes2">
447 <tr>
456 <tr>
448 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
457 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
449 <td class="author">test</td>
458 <td class="author">test</td>
450 <td class="description">
459 <td class="description">
451 <a href="/rev/5ed941583260">first a</a>
460 <a href="/rev/5ed941583260">first a</a>
452 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
461 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
453 </td>
462 </td>
454 </tr>
463 </tr>
455
464
456 </tbody>
465 </tbody>
457 </table>
466 </table>
458
467
459 <div class="navigate">
468 <div class="navigate">
460 <a href="/log/3/a?revcount=30">less</a>
469 <a href="/log/3/a?revcount=30">less</a>
461 <a href="/log/3/a?revcount=120">more</a>
470 <a href="/log/3/a?revcount=120">more</a>
462 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
471 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
463 </div>
472 </div>
464
473
465 </div>
474 </div>
466 </div>
475 </div>
467
476
468 <script type="text/javascript">process_dates()</script>
477 <script type="text/javascript">process_dates()</script>
469
478
470
479
471 </body>
480 </body>
472 </html>
481 </html>
473
482
474
483
475 first version - one revision
484 first version - one revision
476
485
477 $ (get-with-headers.py localhost:$HGPORT 'log/1/a')
486 $ (get-with-headers.py localhost:$HGPORT 'log/1/a')
478 200 Script output follows
487 200 Script output follows
479
488
480 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
489 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
481 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
490 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
482 <head>
491 <head>
483 <link rel="icon" href="/static/hgicon.png" type="image/png" />
492 <link rel="icon" href="/static/hgicon.png" type="image/png" />
484 <meta name="robots" content="index, nofollow" />
493 <meta name="robots" content="index, nofollow" />
485 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
494 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
486 <script type="text/javascript" src="/static/mercurial.js"></script>
495 <script type="text/javascript" src="/static/mercurial.js"></script>
487
496
488 <title>test: a history</title>
497 <title>test: a history</title>
489 <link rel="alternate" type="application/atom+xml"
498 <link rel="alternate" type="application/atom+xml"
490 href="/atom-log/tip/a" title="Atom feed for test:a" />
499 href="/atom-log/tip/a" title="Atom feed for test:a" />
491 <link rel="alternate" type="application/rss+xml"
500 <link rel="alternate" type="application/rss+xml"
492 href="/rss-log/tip/a" title="RSS feed for test:a" />
501 href="/rss-log/tip/a" title="RSS feed for test:a" />
493 </head>
502 </head>
494 <body>
503 <body>
495
504
496 <div class="container">
505 <div class="container">
497 <div class="menu">
506 <div class="menu">
498 <div class="logo">
507 <div class="logo">
499 <a href="https://mercurial-scm.org/">
508 <a href="https://mercurial-scm.org/">
500 <img src="/static/hglogo.png" alt="mercurial" /></a>
509 <img src="/static/hglogo.png" alt="mercurial" /></a>
501 </div>
510 </div>
502 <ul>
511 <ul>
503 <li><a href="/shortlog/1">log</a></li>
512 <li><a href="/shortlog/1">log</a></li>
504 <li><a href="/graph/1">graph</a></li>
513 <li><a href="/graph/1">graph</a></li>
505 <li><a href="/tags">tags</a></li>
514 <li><a href="/tags">tags</a></li>
506 <li><a href="/bookmarks">bookmarks</a></li>
515 <li><a href="/bookmarks">bookmarks</a></li>
507 <li><a href="/branches">branches</a></li>
516 <li><a href="/branches">branches</a></li>
508 </ul>
517 </ul>
509 <ul>
518 <ul>
510 <li><a href="/rev/1">changeset</a></li>
519 <li><a href="/rev/1">changeset</a></li>
511 <li><a href="/file/1">browse</a></li>
520 <li><a href="/file/1">browse</a></li>
512 </ul>
521 </ul>
513 <ul>
522 <ul>
514 <li><a href="/file/1/a">file</a></li>
523 <li><a href="/file/1/a">file</a></li>
515 <li><a href="/diff/1/a">diff</a></li>
524 <li><a href="/diff/1/a">diff</a></li>
516 <li><a href="/comparison/1/a">comparison</a></li>
525 <li><a href="/comparison/1/a">comparison</a></li>
517 <li><a href="/annotate/1/a">annotate</a></li>
526 <li><a href="/annotate/1/a">annotate</a></li>
518 <li class="active">file log</li>
527 <li class="active">file log</li>
519 <li><a href="/raw-file/1/a">raw</a></li>
528 <li><a href="/raw-file/1/a">raw</a></li>
520 </ul>
529 </ul>
521 <ul>
530 <ul>
522 <li><a href="/help">help</a></li>
531 <li><a href="/help">help</a></li>
523 </ul>
532 </ul>
524 <div class="atom-logo">
533 <div class="atom-logo">
525 <a href="/atom-log/5ed941583260/a" title="subscribe to atom feed">
534 <a href="/atom-log/5ed941583260/a" title="subscribe to atom feed">
526 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
535 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
527 </a>
536 </a>
528 </div>
537 </div>
529 </div>
538 </div>
530
539
531 <div class="main">
540 <div class="main">
532 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
541 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
533 <h3>log a</h3>
542 <h3>
543 log a @ 1:<a href="/rev/5ed941583260">5ed941583260</a>
544 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
545 </h3>
534
546
535 <form class="search" action="/log">
547 <form class="search" action="/log">
536
548
537 <p><input name="rev" id="search1" type="text" size="30" /></p>
549 <p><input name="rev" id="search1" type="text" size="30" /></p>
538 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
550 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
539 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
551 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
540 </form>
552 </form>
541
553
542 <div class="navigate">
554 <div class="navigate">
543 <a href="/log/1/a?revcount=30">less</a>
555 <a href="/log/1/a?revcount=30">less</a>
544 <a href="/log/1/a?revcount=120">more</a>
556 <a href="/log/1/a?revcount=120">more</a>
545 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
557 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
546
558
547 <table class="bigtable">
559 <table class="bigtable">
548 <thead>
560 <thead>
549 <tr>
561 <tr>
550 <th class="age">age</th>
562 <th class="age">age</th>
551 <th class="author">author</th>
563 <th class="author">author</th>
552 <th class="description">description</th>
564 <th class="description">description</th>
553 </tr>
565 </tr>
554 </thead>
566 </thead>
555 <tbody class="stripes2">
567 <tbody class="stripes2">
556 <tr>
568 <tr>
557 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
569 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
558 <td class="author">test</td>
570 <td class="author">test</td>
559 <td class="description">
571 <td class="description">
560 <a href="/rev/5ed941583260">first a</a>
572 <a href="/rev/5ed941583260">first a</a>
561 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
573 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
562 </td>
574 </td>
563 </tr>
575 </tr>
564
576
565 </tbody>
577 </tbody>
566 </table>
578 </table>
567
579
568 <div class="navigate">
580 <div class="navigate">
569 <a href="/log/1/a?revcount=30">less</a>
581 <a href="/log/1/a?revcount=30">less</a>
570 <a href="/log/1/a?revcount=120">more</a>
582 <a href="/log/1/a?revcount=120">more</a>
571 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
583 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
572 </div>
584 </div>
573
585
574 </div>
586 </div>
575 </div>
587 </div>
576
588
577 <script type="text/javascript">process_dates()</script>
589 <script type="text/javascript">process_dates()</script>
578
590
579
591
580 </body>
592 </body>
581 </html>
593 </html>
582
594
583
595
584 before addition - error
596 before addition - error
585
597
586 $ (get-with-headers.py localhost:$HGPORT 'log/0/a')
598 $ (get-with-headers.py localhost:$HGPORT 'log/0/a')
587 404 Not Found
599 404 Not Found
588
600
589 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
601 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
590 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
602 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
591 <head>
603 <head>
592 <link rel="icon" href="/static/hgicon.png" type="image/png" />
604 <link rel="icon" href="/static/hgicon.png" type="image/png" />
593 <meta name="robots" content="index, nofollow" />
605 <meta name="robots" content="index, nofollow" />
594 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
606 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
595 <script type="text/javascript" src="/static/mercurial.js"></script>
607 <script type="text/javascript" src="/static/mercurial.js"></script>
596
608
597 <title>test: error</title>
609 <title>test: error</title>
598 </head>
610 </head>
599 <body>
611 <body>
600
612
601 <div class="container">
613 <div class="container">
602 <div class="menu">
614 <div class="menu">
603 <div class="logo">
615 <div class="logo">
604 <a href="https://mercurial-scm.org/">
616 <a href="https://mercurial-scm.org/">
605 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
617 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
606 </div>
618 </div>
607 <ul>
619 <ul>
608 <li><a href="/shortlog">log</a></li>
620 <li><a href="/shortlog">log</a></li>
609 <li><a href="/graph">graph</a></li>
621 <li><a href="/graph">graph</a></li>
610 <li><a href="/tags">tags</a></li>
622 <li><a href="/tags">tags</a></li>
611 <li><a href="/bookmarks">bookmarks</a></li>
623 <li><a href="/bookmarks">bookmarks</a></li>
612 <li><a href="/branches">branches</a></li>
624 <li><a href="/branches">branches</a></li>
613 </ul>
625 </ul>
614 <ul>
626 <ul>
615 <li><a href="/help">help</a></li>
627 <li><a href="/help">help</a></li>
616 </ul>
628 </ul>
617 </div>
629 </div>
618
630
619 <div class="main">
631 <div class="main">
620
632
621 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
633 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
622 <h3>error</h3>
634 <h3>error</h3>
623
635
624 <form class="search" action="/log">
636 <form class="search" action="/log">
625
637
626 <p><input name="rev" id="search1" type="text" size="30"></p>
638 <p><input name="rev" id="search1" type="text" size="30"></p>
627 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
639 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
628 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
640 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
629 </form>
641 </form>
630
642
631 <div class="description">
643 <div class="description">
632 <p>
644 <p>
633 An error occurred while processing your request:
645 An error occurred while processing your request:
634 </p>
646 </p>
635 <p>
647 <p>
636 a@6563da9dcf87: not found in manifest
648 a@6563da9dcf87: not found in manifest
637 </p>
649 </p>
638 </div>
650 </div>
639 </div>
651 </div>
640 </div>
652 </div>
641
653
642 <script type="text/javascript">process_dates()</script>
654 <script type="text/javascript">process_dates()</script>
643
655
644
656
645 </body>
657 </body>
646 </html>
658 </html>
647
659
648 [1]
660 [1]
649
661
650 should show base link, use spartan because it shows it
662 should show base link, use spartan because it shows it
651
663
652 $ (get-with-headers.py localhost:$HGPORT 'log/tip/c?style=spartan')
664 $ (get-with-headers.py localhost:$HGPORT 'log/tip/c?style=spartan')
653 200 Script output follows
665 200 Script output follows
654
666
655 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
667 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
656 <html>
668 <html>
657 <head>
669 <head>
658 <link rel="icon" href="/static/hgicon.png" type="image/png">
670 <link rel="icon" href="/static/hgicon.png" type="image/png">
659 <meta name="robots" content="index, nofollow" />
671 <meta name="robots" content="index, nofollow" />
660 <link rel="stylesheet" href="/static/style.css" type="text/css" />
672 <link rel="stylesheet" href="/static/style.css" type="text/css" />
661 <script type="text/javascript" src="/static/mercurial.js"></script>
673 <script type="text/javascript" src="/static/mercurial.js"></script>
662
674
663 <title>test: c history</title>
675 <title>test: c history</title>
664 <link rel="alternate" type="application/atom+xml"
676 <link rel="alternate" type="application/atom+xml"
665 href="/atom-log/tip/c" title="Atom feed for test:c">
677 href="/atom-log/tip/c" title="Atom feed for test:c">
666 <link rel="alternate" type="application/rss+xml"
678 <link rel="alternate" type="application/rss+xml"
667 href="/rss-log/tip/c" title="RSS feed for test:c">
679 href="/rss-log/tip/c" title="RSS feed for test:c">
668 </head>
680 </head>
669 <body>
681 <body>
670
682
671 <div class="buttons">
683 <div class="buttons">
672 <a href="/log?style=spartan">changelog</a>
684 <a href="/log?style=spartan">changelog</a>
673 <a href="/shortlog?style=spartan">shortlog</a>
685 <a href="/shortlog?style=spartan">shortlog</a>
674 <a href="/graph?style=spartan">graph</a>
686 <a href="/graph?style=spartan">graph</a>
675 <a href="/tags?style=spartan">tags</a>
687 <a href="/tags?style=spartan">tags</a>
676 <a href="/branches?style=spartan">branches</a>
688 <a href="/branches?style=spartan">branches</a>
677 <a href="/file/tip/c?style=spartan">file</a>
689 <a href="/file/tip/c?style=spartan">file</a>
678 <a href="/annotate/tip/c?style=spartan">annotate</a>
690 <a href="/annotate/tip/c?style=spartan">annotate</a>
679 <a href="/help?style=spartan">help</a>
691 <a href="/help?style=spartan">help</a>
680 <a type="application/rss+xml" href="/rss-log/tip/c">rss</a>
692 <a type="application/rss+xml" href="/rss-log/tip/c">rss</a>
681 <a type="application/atom+xml" href="/atom-log/tip/c" title="Atom feed for test:c">atom</a>
693 <a type="application/atom+xml" href="/atom-log/tip/c" title="Atom feed for test:c">atom</a>
682 </div>
694 </div>
683
695
684 <h2><a href="/">Mercurial</a> / c revision history</h2>
696 <h2><a href="/">Mercurial</a> / c revision history</h2>
685
697
686 <p>navigate: <small class="navigate"><a href="/log/c9637d3cc8ef/c?style=spartan">(0)</a> <a href="/log/tip/c?style=spartan">tip</a> </small></p>
698 <p>navigate: <small class="navigate"><a href="/log/c9637d3cc8ef/c?style=spartan">(0)</a> <a href="/log/tip/c?style=spartan">tip</a> </small></p>
687
699
688 <table class="logEntry parity0">
700 <table class="logEntry parity0">
689 <tr>
701 <tr>
690 <th class="label"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
702 <th class="label"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
691 <th class="firstline"><a href="/rev/46c1a66bd8fc?style=spartan">change c</a></th>
703 <th class="firstline"><a href="/rev/46c1a66bd8fc?style=spartan">change c</a></th>
692 </tr>
704 </tr>
693 <tr>
705 <tr>
694 <th class="revision">revision 1:</th>
706 <th class="revision">revision 1:</th>
695 <td class="node">
707 <td class="node">
696 <a href="/file/46c1a66bd8fc/c?style=spartan">46c1a66bd8fc</a>
708 <a href="/file/46c1a66bd8fc/c?style=spartan">46c1a66bd8fc</a>
697 <a href="/diff/46c1a66bd8fc/c?style=spartan">(diff)</a>
709 <a href="/diff/46c1a66bd8fc/c?style=spartan">(diff)</a>
698 <a href="/annotate/46c1a66bd8fc/c?style=spartan">(annotate)</a>
710 <a href="/annotate/46c1a66bd8fc/c?style=spartan">(annotate)</a>
699 </td>
711 </td>
700 </tr>
712 </tr>
701
713
702 <tr>
714 <tr>
703 <th class="author">author:</th>
715 <th class="author">author:</th>
704 <td class="author">&#116;&#101;&#115;&#116;</td>
716 <td class="author">&#116;&#101;&#115;&#116;</td>
705 </tr>
717 </tr>
706 <tr>
718 <tr>
707 <th class="date">date:</th>
719 <th class="date">date:</th>
708 <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
720 <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
709 </tr>
721 </tr>
710 </table>
722 </table>
711
723
712
724
713 <table class="logEntry parity1">
725 <table class="logEntry parity1">
714 <tr>
726 <tr>
715 <th class="label"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
727 <th class="label"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
716 <th class="firstline"><a href="/rev/c9637d3cc8ef?style=spartan">mv b</a></th>
728 <th class="firstline"><a href="/rev/c9637d3cc8ef?style=spartan">mv b</a></th>
717 </tr>
729 </tr>
718 <tr>
730 <tr>
719 <th class="revision">revision 0:</th>
731 <th class="revision">revision 0:</th>
720 <td class="node">
732 <td class="node">
721 <a href="/file/c9637d3cc8ef/c?style=spartan">c9637d3cc8ef</a>
733 <a href="/file/c9637d3cc8ef/c?style=spartan">c9637d3cc8ef</a>
722 <a href="/diff/c9637d3cc8ef/c?style=spartan">(diff)</a>
734 <a href="/diff/c9637d3cc8ef/c?style=spartan">(diff)</a>
723 <a href="/annotate/c9637d3cc8ef/c?style=spartan">(annotate)</a>
735 <a href="/annotate/c9637d3cc8ef/c?style=spartan">(annotate)</a>
724 </td>
736 </td>
725 </tr>
737 </tr>
726
738
727 <tr>
739 <tr>
728 <th>base:</th>
740 <th>base:</th>
729 <td>
741 <td>
730 <a href="/file/1e88685f5dde/b?style=spartan">
742 <a href="/file/1e88685f5dde/b?style=spartan">
731 b@1e88685f5dde
743 b@1e88685f5dde
732 </a>
744 </a>
733 </td>
745 </td>
734 </tr>
746 </tr>
735 <tr>
747 <tr>
736 <th class="author">author:</th>
748 <th class="author">author:</th>
737 <td class="author">&#116;&#101;&#115;&#116;</td>
749 <td class="author">&#116;&#101;&#115;&#116;</td>
738 </tr>
750 </tr>
739 <tr>
751 <tr>
740 <th class="date">date:</th>
752 <th class="date">date:</th>
741 <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
753 <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
742 </tr>
754 </tr>
743 </table>
755 </table>
744
756
745
757
746
758
747
759
748 <script type="text/javascript">process_dates()</script>
760 <script type="text/javascript">process_dates()</script>
749
761
750 <div class="logo">
762 <div class="logo">
751 <a href="https://mercurial-scm.org/">
763 <a href="https://mercurial-scm.org/">
752 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
764 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
753 </div>
765 </div>
754
766
755 </body>
767 </body>
756 </html>
768 </html>
757
769
758
770
759 rss log
771 rss log
760
772
761 $ (get-with-headers.py localhost:$HGPORT 'rss-log/tip/a')
773 $ (get-with-headers.py localhost:$HGPORT 'rss-log/tip/a')
762 200 Script output follows
774 200 Script output follows
763
775
764 <?xml version="1.0" encoding="ascii"?>
776 <?xml version="1.0" encoding="ascii"?>
765 <rss version="2.0">
777 <rss version="2.0">
766 <channel>
778 <channel>
767 <link>http://*:$HGPORT/</link> (glob)
779 <link>http://*:$HGPORT/</link> (glob)
768 <language>en-us</language>
780 <language>en-us</language>
769
781
770 <title>test: a history</title>
782 <title>test: a history</title>
771 <description>a revision history</description>
783 <description>a revision history</description>
772 <item>
784 <item>
773 <title>second a</title>
785 <title>second a</title>
774 <link>http://*:$HGPORT/log3f41bc784e7e/a</link> (glob)
786 <link>http://*:$HGPORT/log3f41bc784e7e/a</link> (glob)
775 <description><![CDATA[second a]]></description>
787 <description><![CDATA[second a]]></description>
776 <author>&#116;&#101;&#115;&#116;</author>
788 <author>&#116;&#101;&#115;&#116;</author>
777 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
789 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
778 </item>
790 </item>
779 <item>
791 <item>
780 <title>first a</title>
792 <title>first a</title>
781 <link>http://*:$HGPORT/log5ed941583260/a</link> (glob)
793 <link>http://*:$HGPORT/log5ed941583260/a</link> (glob)
782 <description><![CDATA[first a]]></description>
794 <description><![CDATA[first a]]></description>
783 <author>&#116;&#101;&#115;&#116;</author>
795 <author>&#116;&#101;&#115;&#116;</author>
784 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
796 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
785 </item>
797 </item>
786
798
787 </channel>
799 </channel>
788 </rss>
800 </rss>
789
801
790 atom log
802 atom log
791
803
792 $ (get-with-headers.py localhost:$HGPORT 'atom-log/tip/a')
804 $ (get-with-headers.py localhost:$HGPORT 'atom-log/tip/a')
793 200 Script output follows
805 200 Script output follows
794
806
795 <?xml version="1.0" encoding="ascii"?>
807 <?xml version="1.0" encoding="ascii"?>
796 <feed xmlns="http://www.w3.org/2005/Atom">
808 <feed xmlns="http://www.w3.org/2005/Atom">
797 <id>http://*:$HGPORT/atom-log/tip/a</id> (glob)
809 <id>http://*:$HGPORT/atom-log/tip/a</id> (glob)
798 <link rel="self" href="http://*:$HGPORT/atom-log/tip/a"/> (glob)
810 <link rel="self" href="http://*:$HGPORT/atom-log/tip/a"/> (glob)
799 <title>test: a history</title>
811 <title>test: a history</title>
800 <updated>1970-01-01T00:00:00+00:00</updated>
812 <updated>1970-01-01T00:00:00+00:00</updated>
801
813
802 <entry>
814 <entry>
803 <title>[a-branch] second a</title>
815 <title>[a-branch] second a</title>
804 <id>http://*:$HGPORT/#changeset-3f41bc784e7e73035c6d47112c6cc7efb673adf8</id> (glob)
816 <id>http://*:$HGPORT/#changeset-3f41bc784e7e73035c6d47112c6cc7efb673adf8</id> (glob)
805 <link href="http://*:$HGPORT/rev/3f41bc784e7e"/> (glob)
817 <link href="http://*:$HGPORT/rev/3f41bc784e7e"/> (glob)
806 <author>
818 <author>
807 <name>test</name>
819 <name>test</name>
808 <email>&#116;&#101;&#115;&#116;</email>
820 <email>&#116;&#101;&#115;&#116;</email>
809 </author>
821 </author>
810 <updated>1970-01-01T00:00:00+00:00</updated>
822 <updated>1970-01-01T00:00:00+00:00</updated>
811 <published>1970-01-01T00:00:00+00:00</published>
823 <published>1970-01-01T00:00:00+00:00</published>
812 <content type="xhtml">
824 <content type="xhtml">
813 <table xmlns="http://www.w3.org/1999/xhtml">
825 <table xmlns="http://www.w3.org/1999/xhtml">
814 <tr>
826 <tr>
815 <th style="text-align:left;">changeset</th>
827 <th style="text-align:left;">changeset</th>
816 <td>3f41bc784e7e</td>
828 <td>3f41bc784e7e</td>
817 </tr>
829 </tr>
818 <tr>
830 <tr>
819 <th style="text-align:left;">branch</th>
831 <th style="text-align:left;">branch</th>
820 <td>a-branch</td>
832 <td>a-branch</td>
821 </tr>
833 </tr>
822 <tr>
834 <tr>
823 <th style="text-align:left;">bookmark</th>
835 <th style="text-align:left;">bookmark</th>
824 <td></td>
836 <td></td>
825 </tr>
837 </tr>
826 <tr>
838 <tr>
827 <th style="text-align:left;">tag</th>
839 <th style="text-align:left;">tag</th>
828 <td></td>
840 <td></td>
829 </tr>
841 </tr>
830 <tr>
842 <tr>
831 <th style="text-align:left;">user</th>
843 <th style="text-align:left;">user</th>
832 <td>&#116;&#101;&#115;&#116;</td>
844 <td>&#116;&#101;&#115;&#116;</td>
833 </tr>
845 </tr>
834 <tr>
846 <tr>
835 <th style="text-align:left;vertical-align:top;">description</th>
847 <th style="text-align:left;vertical-align:top;">description</th>
836 <td>second a</td>
848 <td>second a</td>
837 </tr>
849 </tr>
838 <tr>
850 <tr>
839 <th style="text-align:left;vertical-align:top;">files</th>
851 <th style="text-align:left;vertical-align:top;">files</th>
840 <td></td>
852 <td></td>
841 </tr>
853 </tr>
842 </table>
854 </table>
843 </content>
855 </content>
844 </entry>
856 </entry>
845 <entry>
857 <entry>
846 <title>first a</title>
858 <title>first a</title>
847 <id>http://*:$HGPORT/#changeset-5ed941583260248620985524192fdc382ef57c36</id> (glob)
859 <id>http://*:$HGPORT/#changeset-5ed941583260248620985524192fdc382ef57c36</id> (glob)
848 <link href="http://*:$HGPORT/rev/5ed941583260"/> (glob)
860 <link href="http://*:$HGPORT/rev/5ed941583260"/> (glob)
849 <author>
861 <author>
850 <name>test</name>
862 <name>test</name>
851 <email>&#116;&#101;&#115;&#116;</email>
863 <email>&#116;&#101;&#115;&#116;</email>
852 </author>
864 </author>
853 <updated>1970-01-01T00:00:00+00:00</updated>
865 <updated>1970-01-01T00:00:00+00:00</updated>
854 <published>1970-01-01T00:00:00+00:00</published>
866 <published>1970-01-01T00:00:00+00:00</published>
855 <content type="xhtml">
867 <content type="xhtml">
856 <table xmlns="http://www.w3.org/1999/xhtml">
868 <table xmlns="http://www.w3.org/1999/xhtml">
857 <tr>
869 <tr>
858 <th style="text-align:left;">changeset</th>
870 <th style="text-align:left;">changeset</th>
859 <td>5ed941583260</td>
871 <td>5ed941583260</td>
860 </tr>
872 </tr>
861 <tr>
873 <tr>
862 <th style="text-align:left;">branch</th>
874 <th style="text-align:left;">branch</th>
863 <td></td>
875 <td></td>
864 </tr>
876 </tr>
865 <tr>
877 <tr>
866 <th style="text-align:left;">bookmark</th>
878 <th style="text-align:left;">bookmark</th>
867 <td>a-bookmark</td>
879 <td>a-bookmark</td>
868 </tr>
880 </tr>
869 <tr>
881 <tr>
870 <th style="text-align:left;">tag</th>
882 <th style="text-align:left;">tag</th>
871 <td>a-tag</td>
883 <td>a-tag</td>
872 </tr>
884 </tr>
873 <tr>
885 <tr>
874 <th style="text-align:left;">user</th>
886 <th style="text-align:left;">user</th>
875 <td>&#116;&#101;&#115;&#116;</td>
887 <td>&#116;&#101;&#115;&#116;</td>
876 </tr>
888 </tr>
877 <tr>
889 <tr>
878 <th style="text-align:left;vertical-align:top;">description</th>
890 <th style="text-align:left;vertical-align:top;">description</th>
879 <td>first a</td>
891 <td>first a</td>
880 </tr>
892 </tr>
881 <tr>
893 <tr>
882 <th style="text-align:left;vertical-align:top;">files</th>
894 <th style="text-align:left;vertical-align:top;">files</th>
883 <td></td>
895 <td></td>
884 </tr>
896 </tr>
885 </table>
897 </table>
886 </content>
898 </content>
887 </entry>
899 </entry>
888
900
889 </feed>
901 </feed>
890
902
891 errors
903 errors
892
904
893 $ cat errors.log
905 $ cat errors.log
894
906
895 $ cd ..
907 $ cd ..
@@ -1,1050 +1,1052 b''
1 #require serve
1 #require serve
2
2
3 Test symbolic revision usage in links produced by hgweb pages. There are
3 Test symbolic revision usage in links produced by hgweb pages. There are
4 multiple issues related to this:
4 multiple issues related to this:
5 - issue2296
5 - issue2296
6 - issue2826
6 - issue2826
7 - issue3594
7 - issue3594
8 - issue3634
8 - issue3634
9
9
10 Set up the repo
10 Set up the repo
11
11
12 $ hg init test
12 $ hg init test
13 $ cd test
13 $ cd test
14 $ echo 0 > foo
14 $ echo 0 > foo
15 $ mkdir dir
15 $ mkdir dir
16 $ echo 0 > dir/bar
16 $ echo 0 > dir/bar
17 $ hg ci -Am 'first'
17 $ hg ci -Am 'first'
18 adding dir/bar
18 adding dir/bar
19 adding foo
19 adding foo
20 $ echo 1 >> foo
20 $ echo 1 >> foo
21 $ hg ci -m 'second'
21 $ hg ci -m 'second'
22 $ echo 2 >> foo
22 $ echo 2 >> foo
23 $ hg ci -m 'third'
23 $ hg ci -m 'third'
24 $ hg bookmark -r1 xyzzy
24 $ hg bookmark -r1 xyzzy
25
25
26 $ hg log -G --template '{rev}:{node|short} {tags} {bookmarks}\n'
26 $ hg log -G --template '{rev}:{node|short} {tags} {bookmarks}\n'
27 @ 2:9d8c40cba617 tip
27 @ 2:9d8c40cba617 tip
28 |
28 |
29 o 1:a7c1559b7bba xyzzy
29 o 1:a7c1559b7bba xyzzy
30 |
30 |
31 o 0:43c799df6e75
31 o 0:43c799df6e75
32
32
33 $ hg serve --config web.allow_archive=zip -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
33 $ hg serve --config web.allow_archive=zip -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
34 $ cat hg.pid >> $DAEMON_PIDS
34 $ cat hg.pid >> $DAEMON_PIDS
35
35
36 $ REVLINKS='href=[^>]+(rev=|/)(43c799df6e75|0|a7c1559b7bba|1|xyzzy|9d8c40cba617|2|tip|default)'
36 $ REVLINKS='href=[^>]+(rev=|/)(43c799df6e75|0|a7c1559b7bba|1|xyzzy|9d8c40cba617|2|tip|default)'
37
37
38 (De)referencing symbolic revisions (paper)
38 (De)referencing symbolic revisions (paper)
39
39
40 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=paper' | egrep $REVLINKS
40 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=paper' | egrep $REVLINKS
41 <li><a href="/graph/tip?style=paper">graph</a></li>
41 <li><a href="/graph/tip?style=paper">graph</a></li>
42 <li><a href="/rev/tip?style=paper">changeset</a></li>
42 <li><a href="/rev/tip?style=paper">changeset</a></li>
43 <li><a href="/file/tip?style=paper">browse</a></li>
43 <li><a href="/file/tip?style=paper">browse</a></li>
44 <a href="/archive/tip.zip">zip</a>
44 <a href="/archive/tip.zip">zip</a>
45 <a href="/shortlog/tip?revcount=30&style=paper">less</a>
45 <a href="/shortlog/tip?revcount=30&style=paper">less</a>
46 <a href="/shortlog/tip?revcount=120&style=paper">more</a>
46 <a href="/shortlog/tip?revcount=120&style=paper">more</a>
47 | rev 2: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
47 | rev 2: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
48 <a href="/rev/9d8c40cba617?style=paper">third</a>
48 <a href="/rev/9d8c40cba617?style=paper">third</a>
49 <a href="/rev/a7c1559b7bba?style=paper">second</a>
49 <a href="/rev/a7c1559b7bba?style=paper">second</a>
50 <a href="/rev/43c799df6e75?style=paper">first</a>
50 <a href="/rev/43c799df6e75?style=paper">first</a>
51 <a href="/shortlog/tip?revcount=30&style=paper">less</a>
51 <a href="/shortlog/tip?revcount=30&style=paper">less</a>
52 <a href="/shortlog/tip?revcount=120&style=paper">more</a>
52 <a href="/shortlog/tip?revcount=120&style=paper">more</a>
53 | rev 2: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
53 | rev 2: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
54
54
55 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=paper' | egrep $REVLINKS
55 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=paper' | egrep $REVLINKS
56 <li><a href="/shortlog/tip?style=paper">log</a></li>
56 <li><a href="/shortlog/tip?style=paper">log</a></li>
57 <li><a href="/rev/tip?style=paper">changeset</a></li>
57 <li><a href="/rev/tip?style=paper">changeset</a></li>
58 <li><a href="/file/tip?style=paper">browse</a></li>
58 <li><a href="/file/tip?style=paper">browse</a></li>
59 <a href="/graph/tip?revcount=30&style=paper">less</a>
59 <a href="/graph/tip?revcount=30&style=paper">less</a>
60 <a href="/graph/tip?revcount=120&style=paper">more</a>
60 <a href="/graph/tip?revcount=120&style=paper">more</a>
61 | rev 2: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
61 | rev 2: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
62 <a href="/graph/tip?revcount=30&style=paper">less</a>
62 <a href="/graph/tip?revcount=30&style=paper">less</a>
63 <a href="/graph/tip?revcount=120&style=paper">more</a>
63 <a href="/graph/tip?revcount=120&style=paper">more</a>
64 | rev 2: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
64 | rev 2: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
65
65
66 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=paper' | egrep $REVLINKS
66 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=paper' | egrep $REVLINKS
67 <li><a href="/shortlog/tip?style=paper">log</a></li>
67 <li><a href="/shortlog/tip?style=paper">log</a></li>
68 <li><a href="/graph/tip?style=paper">graph</a></li>
68 <li><a href="/graph/tip?style=paper">graph</a></li>
69 <li><a href="/rev/tip?style=paper">changeset</a></li>
69 <li><a href="/rev/tip?style=paper">changeset</a></li>
70 <a href="/archive/tip.zip">zip</a>
70 <a href="/archive/tip.zip">zip</a>
71 directory / @ 2:<a href="/rev/9d8c40cba617?style=paper">9d8c40cba617</a>
71 directory / @ 2:<a href="/rev/9d8c40cba617?style=paper">9d8c40cba617</a>
72 <td class="name"><a href="/file/tip/?style=paper">[up]</a></td>
72 <td class="name"><a href="/file/tip/?style=paper">[up]</a></td>
73 <a href="/file/tip/dir?style=paper">
73 <a href="/file/tip/dir?style=paper">
74 <a href="/file/tip/dir/?style=paper">
74 <a href="/file/tip/dir/?style=paper">
75 <a href="/file/tip/foo?style=paper">
75 <a href="/file/tip/foo?style=paper">
76
76
77 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=paper' | egrep $REVLINKS
77 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=paper' | egrep $REVLINKS
78 <a href="/shortlog/default?style=paper" class="open">
78 <a href="/shortlog/default?style=paper" class="open">
79 <a href="/shortlog/9d8c40cba617?style=paper" class="open">
79 <a href="/shortlog/9d8c40cba617?style=paper" class="open">
80
80
81 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=paper' | egrep $REVLINKS
81 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=paper' | egrep $REVLINKS
82 <a href="/rev/tip?style=paper">
82 <a href="/rev/tip?style=paper">
83 <a href="/rev/9d8c40cba617?style=paper">
83 <a href="/rev/9d8c40cba617?style=paper">
84
84
85 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=paper' | egrep $REVLINKS
85 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=paper' | egrep $REVLINKS
86 <a href="/rev/xyzzy?style=paper">
86 <a href="/rev/xyzzy?style=paper">
87 <a href="/rev/a7c1559b7bba?style=paper">
87 <a href="/rev/a7c1559b7bba?style=paper">
88
88
89 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=paper&rev=all()' | egrep $REVLINKS
89 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=paper&rev=all()' | egrep $REVLINKS
90 <a href="/rev/9d8c40cba617?style=paper">third</a>
90 <a href="/rev/9d8c40cba617?style=paper">third</a>
91 <a href="/rev/a7c1559b7bba?style=paper">second</a>
91 <a href="/rev/a7c1559b7bba?style=paper">second</a>
92 <a href="/rev/43c799df6e75?style=paper">first</a>
92 <a href="/rev/43c799df6e75?style=paper">first</a>
93
93
94 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=paper' | egrep $REVLINKS
94 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=paper' | egrep $REVLINKS
95 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
95 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
96 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
96 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
97 <li><a href="/raw-rev/xyzzy?style=paper">raw</a></li>
97 <li><a href="/raw-rev/xyzzy?style=paper">raw</a></li>
98 <li><a href="/file/xyzzy?style=paper">browse</a></li>
98 <li><a href="/file/xyzzy?style=paper">browse</a></li>
99 <a href="/archive/xyzzy.zip">zip</a>
99 <a href="/archive/xyzzy.zip">zip</a>
100 changeset 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
100 changeset 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
101 <td class="author"><a href="/rev/43c799df6e75?style=paper">43c799df6e75</a> </td>
101 <td class="author"><a href="/rev/43c799df6e75?style=paper">43c799df6e75</a> </td>
102 <td class="author"> <a href="/rev/9d8c40cba617?style=paper">9d8c40cba617</a></td>
102 <td class="author"> <a href="/rev/9d8c40cba617?style=paper">9d8c40cba617</a></td>
103 <td class="files"><a href="/file/a7c1559b7bba/foo?style=paper">foo</a> </td>
103 <td class="files"><a href="/file/a7c1559b7bba/foo?style=paper">foo</a> </td>
104
104
105 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=paper' | egrep $REVLINKS
105 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=paper' | egrep $REVLINKS
106 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
106 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
107 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
107 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
108 <li><a href="/file/xyzzy?style=paper">browse</a></li>
108 <li><a href="/file/xyzzy?style=paper">browse</a></li>
109 <a href="/archive/xyzzy.zip">zip</a>
109 <a href="/archive/xyzzy.zip">zip</a>
110 <a href="/shortlog/xyzzy?revcount=30&style=paper">less</a>
110 <a href="/shortlog/xyzzy?revcount=30&style=paper">less</a>
111 <a href="/shortlog/xyzzy?revcount=120&style=paper">more</a>
111 <a href="/shortlog/xyzzy?revcount=120&style=paper">more</a>
112 | rev 1: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
112 | rev 1: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
113 <a href="/rev/a7c1559b7bba?style=paper">second</a>
113 <a href="/rev/a7c1559b7bba?style=paper">second</a>
114 <a href="/rev/43c799df6e75?style=paper">first</a>
114 <a href="/rev/43c799df6e75?style=paper">first</a>
115 <a href="/shortlog/xyzzy?revcount=30&style=paper">less</a>
115 <a href="/shortlog/xyzzy?revcount=30&style=paper">less</a>
116 <a href="/shortlog/xyzzy?revcount=120&style=paper">more</a>
116 <a href="/shortlog/xyzzy?revcount=120&style=paper">more</a>
117 | rev 1: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
117 | rev 1: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
118
118
119 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=paper' | egrep $REVLINKS
119 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=paper' | egrep $REVLINKS
120 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
120 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
121 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
121 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
122 <li><a href="/file/xyzzy?style=paper">browse</a></li>
122 <li><a href="/file/xyzzy?style=paper">browse</a></li>
123 <a href="/graph/xyzzy?revcount=30&style=paper">less</a>
123 <a href="/graph/xyzzy?revcount=30&style=paper">less</a>
124 <a href="/graph/xyzzy?revcount=120&style=paper">more</a>
124 <a href="/graph/xyzzy?revcount=120&style=paper">more</a>
125 | rev 1: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
125 | rev 1: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
126 <a href="/graph/xyzzy?revcount=30&style=paper">less</a>
126 <a href="/graph/xyzzy?revcount=30&style=paper">less</a>
127 <a href="/graph/xyzzy?revcount=120&style=paper">more</a>
127 <a href="/graph/xyzzy?revcount=120&style=paper">more</a>
128 | rev 1: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
128 | rev 1: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
129
129
130 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=paper' | egrep $REVLINKS
130 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=paper' | egrep $REVLINKS
131 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
131 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
132 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
132 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
133 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
133 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
134 <a href="/archive/xyzzy.zip">zip</a>
134 <a href="/archive/xyzzy.zip">zip</a>
135 directory / @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
135 directory / @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
136 <td class="name"><a href="/file/xyzzy/?style=paper">[up]</a></td>
136 <td class="name"><a href="/file/xyzzy/?style=paper">[up]</a></td>
137 <a href="/file/xyzzy/dir?style=paper">
137 <a href="/file/xyzzy/dir?style=paper">
138 <a href="/file/xyzzy/dir/?style=paper">
138 <a href="/file/xyzzy/dir/?style=paper">
139 <a href="/file/xyzzy/foo?style=paper">
139 <a href="/file/xyzzy/foo?style=paper">
140
140
141 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=paper' | egrep $REVLINKS
141 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=paper' | egrep $REVLINKS
142 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
142 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
143 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
143 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
144 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
144 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
145 <li><a href="/file/xyzzy/?style=paper">browse</a></li>
145 <li><a href="/file/xyzzy/?style=paper">browse</a></li>
146 <li><a href="/file/tip/foo?style=paper">latest</a></li>
146 <li><a href="/file/tip/foo?style=paper">latest</a></li>
147 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
147 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
148 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
148 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
149 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
149 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
150 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
150 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
151 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
151 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
152 view foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
152 view foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
153 <td class="author"><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
153 <td class="author"><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
154 <td class="author"><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
154 <td class="author"><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
155
155
156 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=paper' | egrep $REVLINKS
156 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=paper' | egrep $REVLINKS
157 href="/atom-log/tip/foo" title="Atom feed for test:foo" />
157 href="/atom-log/tip/foo" title="Atom feed for test:foo" />
158 href="/rss-log/tip/foo" title="RSS feed for test:foo" />
158 href="/rss-log/tip/foo" title="RSS feed for test:foo" />
159 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
159 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
160 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
160 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
161 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
161 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
162 <li><a href="/file/xyzzy?style=paper">browse</a></li>
162 <li><a href="/file/xyzzy?style=paper">browse</a></li>
163 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
163 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
164 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
164 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
165 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
165 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
166 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
166 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
167 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
167 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
168 <a href="/atom-log/a7c1559b7bba/foo" title="subscribe to atom feed">
168 <a href="/atom-log/a7c1559b7bba/foo" title="subscribe to atom feed">
169 log foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
169 <a href="/log/xyzzy/foo?revcount=30&style=paper">less</a>
170 <a href="/log/xyzzy/foo?revcount=30&style=paper">less</a>
170 <a href="/log/xyzzy/foo?revcount=120&style=paper">more</a>
171 <a href="/log/xyzzy/foo?revcount=120&style=paper">more</a>
171 | <a href="/log/43c799df6e75/foo?style=paper">(0)</a> <a href="/log/tip/foo?style=paper">tip</a> </div>
172 | <a href="/log/43c799df6e75/foo?style=paper">(0)</a> <a href="/log/tip/foo?style=paper">tip</a> </div>
172 <a href="/rev/a7c1559b7bba?style=paper">second</a>
173 <a href="/rev/a7c1559b7bba?style=paper">second</a>
173 <a href="/rev/43c799df6e75?style=paper">first</a>
174 <a href="/rev/43c799df6e75?style=paper">first</a>
174 <a href="/log/xyzzy/foo?revcount=30&style=paper">less</a>
175 <a href="/log/xyzzy/foo?revcount=30&style=paper">less</a>
175 <a href="/log/xyzzy/foo?revcount=120&style=paper">more</a>
176 <a href="/log/xyzzy/foo?revcount=120&style=paper">more</a>
176 | <a href="/log/43c799df6e75/foo?style=paper">(0)</a> <a href="/log/tip/foo?style=paper">tip</a>
177 | <a href="/log/43c799df6e75/foo?style=paper">(0)</a> <a href="/log/tip/foo?style=paper">tip</a>
177
178
178 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=paper' | egrep $REVLINKS
179 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=paper' | egrep $REVLINKS
179 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
180 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
180 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
181 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
181 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
182 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
182 <li><a href="/file/xyzzy/?style=paper">browse</a></li>
183 <li><a href="/file/xyzzy/?style=paper">browse</a></li>
183 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
184 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
184 <li><a href="/file/tip/foo?style=paper">latest</a></li>
185 <li><a href="/file/tip/foo?style=paper">latest</a></li>
185 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
186 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
186 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
187 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
187 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
188 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
188 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
189 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
189 annotate foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
190 annotate foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
190 <td class="author"><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
191 <td class="author"><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
191 <td class="author"><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
192 <td class="author"><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
192 <a href="/annotate/43c799df6e75/foo?style=paper#l1"
193 <a href="/annotate/43c799df6e75/foo?style=paper#l1"
193 <a href="/annotate/a7c1559b7bba/foo?style=paper#l2"
194 <a href="/annotate/a7c1559b7bba/foo?style=paper#l2"
194
195
195 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=paper' | egrep $REVLINKS
196 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=paper' | egrep $REVLINKS
196 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
197 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
197 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
198 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
198 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
199 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
199 <li><a href="/file/xyzzy?style=paper">browse</a></li>
200 <li><a href="/file/xyzzy?style=paper">browse</a></li>
200 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
201 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
201 <li><a href="/file/tip/foo?style=paper">latest</a></li>
202 <li><a href="/file/tip/foo?style=paper">latest</a></li>
202 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
203 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
203 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
204 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
204 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
205 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
205 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
206 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
206 diff foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
207 diff foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
207 <td><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
208 <td><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
208 <td><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
209 <td><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
209
210
210 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=paper' | egrep $REVLINKS
211 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=paper' | egrep $REVLINKS
211 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
212 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
212 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
213 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
213 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
214 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
214 <li><a href="/file/xyzzy?style=paper">browse</a></li>
215 <li><a href="/file/xyzzy?style=paper">browse</a></li>
215 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
216 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
216 <li><a href="/file/tip/foo?style=paper">latest</a></li>
217 <li><a href="/file/tip/foo?style=paper">latest</a></li>
217 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
218 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
218 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
219 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
219 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
220 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
220 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
221 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
221 comparison foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
222 comparison foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
222 <td><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
223 <td><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
223 <td><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
224 <td><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
224
225
225 (De)referencing symbolic revisions (coal)
226 (De)referencing symbolic revisions (coal)
226
227
227 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=coal' | egrep $REVLINKS
228 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=coal' | egrep $REVLINKS
228 <li><a href="/graph/tip?style=coal">graph</a></li>
229 <li><a href="/graph/tip?style=coal">graph</a></li>
229 <li><a href="/rev/tip?style=coal">changeset</a></li>
230 <li><a href="/rev/tip?style=coal">changeset</a></li>
230 <li><a href="/file/tip?style=coal">browse</a></li>
231 <li><a href="/file/tip?style=coal">browse</a></li>
231 <a href="/archive/tip.zip">zip</a>
232 <a href="/archive/tip.zip">zip</a>
232 <a href="/shortlog/tip?revcount=30&style=coal">less</a>
233 <a href="/shortlog/tip?revcount=30&style=coal">less</a>
233 <a href="/shortlog/tip?revcount=120&style=coal">more</a>
234 <a href="/shortlog/tip?revcount=120&style=coal">more</a>
234 | rev 2: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
235 | rev 2: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
235 <a href="/rev/9d8c40cba617?style=coal">third</a>
236 <a href="/rev/9d8c40cba617?style=coal">third</a>
236 <a href="/rev/a7c1559b7bba?style=coal">second</a>
237 <a href="/rev/a7c1559b7bba?style=coal">second</a>
237 <a href="/rev/43c799df6e75?style=coal">first</a>
238 <a href="/rev/43c799df6e75?style=coal">first</a>
238 <a href="/shortlog/tip?revcount=30&style=coal">less</a>
239 <a href="/shortlog/tip?revcount=30&style=coal">less</a>
239 <a href="/shortlog/tip?revcount=120&style=coal">more</a>
240 <a href="/shortlog/tip?revcount=120&style=coal">more</a>
240 | rev 2: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
241 | rev 2: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
241
242
242 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=coal' | egrep $REVLINKS
243 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=coal' | egrep $REVLINKS
243 <li><a href="/shortlog/tip?style=coal">log</a></li>
244 <li><a href="/shortlog/tip?style=coal">log</a></li>
244 <li><a href="/rev/tip?style=coal">changeset</a></li>
245 <li><a href="/rev/tip?style=coal">changeset</a></li>
245 <li><a href="/file/tip?style=coal">browse</a></li>
246 <li><a href="/file/tip?style=coal">browse</a></li>
246 <a href="/graph/tip?revcount=30&style=coal">less</a>
247 <a href="/graph/tip?revcount=30&style=coal">less</a>
247 <a href="/graph/tip?revcount=120&style=coal">more</a>
248 <a href="/graph/tip?revcount=120&style=coal">more</a>
248 | rev 2: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
249 | rev 2: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
249 <a href="/graph/tip?revcount=30&style=coal">less</a>
250 <a href="/graph/tip?revcount=30&style=coal">less</a>
250 <a href="/graph/tip?revcount=120&style=coal">more</a>
251 <a href="/graph/tip?revcount=120&style=coal">more</a>
251 | rev 2: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
252 | rev 2: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
252
253
253 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=coal' | egrep $REVLINKS
254 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=coal' | egrep $REVLINKS
254 <li><a href="/shortlog/tip?style=coal">log</a></li>
255 <li><a href="/shortlog/tip?style=coal">log</a></li>
255 <li><a href="/graph/tip?style=coal">graph</a></li>
256 <li><a href="/graph/tip?style=coal">graph</a></li>
256 <li><a href="/rev/tip?style=coal">changeset</a></li>
257 <li><a href="/rev/tip?style=coal">changeset</a></li>
257 <a href="/archive/tip.zip">zip</a>
258 <a href="/archive/tip.zip">zip</a>
258 directory / @ 2:<a href="/rev/9d8c40cba617?style=coal">9d8c40cba617</a>
259 directory / @ 2:<a href="/rev/9d8c40cba617?style=coal">9d8c40cba617</a>
259 <td class="name"><a href="/file/tip/?style=coal">[up]</a></td>
260 <td class="name"><a href="/file/tip/?style=coal">[up]</a></td>
260 <a href="/file/tip/dir?style=coal">
261 <a href="/file/tip/dir?style=coal">
261 <a href="/file/tip/dir/?style=coal">
262 <a href="/file/tip/dir/?style=coal">
262 <a href="/file/tip/foo?style=coal">
263 <a href="/file/tip/foo?style=coal">
263
264
264 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=coal' | egrep $REVLINKS
265 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=coal' | egrep $REVLINKS
265 <a href="/shortlog/default?style=coal" class="open">
266 <a href="/shortlog/default?style=coal" class="open">
266 <a href="/shortlog/9d8c40cba617?style=coal" class="open">
267 <a href="/shortlog/9d8c40cba617?style=coal" class="open">
267
268
268 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=coal' | egrep $REVLINKS
269 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=coal' | egrep $REVLINKS
269 <a href="/rev/tip?style=coal">
270 <a href="/rev/tip?style=coal">
270 <a href="/rev/9d8c40cba617?style=coal">
271 <a href="/rev/9d8c40cba617?style=coal">
271
272
272 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=coal' | egrep $REVLINKS
273 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=coal' | egrep $REVLINKS
273 <a href="/rev/xyzzy?style=coal">
274 <a href="/rev/xyzzy?style=coal">
274 <a href="/rev/a7c1559b7bba?style=coal">
275 <a href="/rev/a7c1559b7bba?style=coal">
275
276
276 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=coal&rev=all()' | egrep $REVLINKS
277 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=coal&rev=all()' | egrep $REVLINKS
277 <a href="/rev/9d8c40cba617?style=coal">third</a>
278 <a href="/rev/9d8c40cba617?style=coal">third</a>
278 <a href="/rev/a7c1559b7bba?style=coal">second</a>
279 <a href="/rev/a7c1559b7bba?style=coal">second</a>
279 <a href="/rev/43c799df6e75?style=coal">first</a>
280 <a href="/rev/43c799df6e75?style=coal">first</a>
280
281
281 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=coal' | egrep $REVLINKS
282 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=coal' | egrep $REVLINKS
282 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
283 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
283 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
284 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
284 <li><a href="/raw-rev/xyzzy?style=coal">raw</a></li>
285 <li><a href="/raw-rev/xyzzy?style=coal">raw</a></li>
285 <li><a href="/file/xyzzy?style=coal">browse</a></li>
286 <li><a href="/file/xyzzy?style=coal">browse</a></li>
286 <a href="/archive/xyzzy.zip">zip</a>
287 <a href="/archive/xyzzy.zip">zip</a>
287 changeset 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
288 changeset 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
288 <td class="author"><a href="/rev/43c799df6e75?style=coal">43c799df6e75</a> </td>
289 <td class="author"><a href="/rev/43c799df6e75?style=coal">43c799df6e75</a> </td>
289 <td class="author"> <a href="/rev/9d8c40cba617?style=coal">9d8c40cba617</a></td>
290 <td class="author"> <a href="/rev/9d8c40cba617?style=coal">9d8c40cba617</a></td>
290 <td class="files"><a href="/file/a7c1559b7bba/foo?style=coal">foo</a> </td>
291 <td class="files"><a href="/file/a7c1559b7bba/foo?style=coal">foo</a> </td>
291
292
292 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=coal' | egrep $REVLINKS
293 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=coal' | egrep $REVLINKS
293 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
294 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
294 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
295 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
295 <li><a href="/file/xyzzy?style=coal">browse</a></li>
296 <li><a href="/file/xyzzy?style=coal">browse</a></li>
296 <a href="/archive/xyzzy.zip">zip</a>
297 <a href="/archive/xyzzy.zip">zip</a>
297 <a href="/shortlog/xyzzy?revcount=30&style=coal">less</a>
298 <a href="/shortlog/xyzzy?revcount=30&style=coal">less</a>
298 <a href="/shortlog/xyzzy?revcount=120&style=coal">more</a>
299 <a href="/shortlog/xyzzy?revcount=120&style=coal">more</a>
299 | rev 1: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
300 | rev 1: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
300 <a href="/rev/a7c1559b7bba?style=coal">second</a>
301 <a href="/rev/a7c1559b7bba?style=coal">second</a>
301 <a href="/rev/43c799df6e75?style=coal">first</a>
302 <a href="/rev/43c799df6e75?style=coal">first</a>
302 <a href="/shortlog/xyzzy?revcount=30&style=coal">less</a>
303 <a href="/shortlog/xyzzy?revcount=30&style=coal">less</a>
303 <a href="/shortlog/xyzzy?revcount=120&style=coal">more</a>
304 <a href="/shortlog/xyzzy?revcount=120&style=coal">more</a>
304 | rev 1: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
305 | rev 1: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
305
306
306 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=coal' | egrep $REVLINKS
307 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=coal' | egrep $REVLINKS
307 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
308 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
308 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
309 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
309 <li><a href="/file/xyzzy?style=coal">browse</a></li>
310 <li><a href="/file/xyzzy?style=coal">browse</a></li>
310 <a href="/graph/xyzzy?revcount=30&style=coal">less</a>
311 <a href="/graph/xyzzy?revcount=30&style=coal">less</a>
311 <a href="/graph/xyzzy?revcount=120&style=coal">more</a>
312 <a href="/graph/xyzzy?revcount=120&style=coal">more</a>
312 | rev 1: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
313 | rev 1: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
313 <a href="/graph/xyzzy?revcount=30&style=coal">less</a>
314 <a href="/graph/xyzzy?revcount=30&style=coal">less</a>
314 <a href="/graph/xyzzy?revcount=120&style=coal">more</a>
315 <a href="/graph/xyzzy?revcount=120&style=coal">more</a>
315 | rev 1: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
316 | rev 1: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
316
317
317 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=coal' | egrep $REVLINKS
318 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=coal' | egrep $REVLINKS
318 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
319 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
319 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
320 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
320 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
321 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
321 <a href="/archive/xyzzy.zip">zip</a>
322 <a href="/archive/xyzzy.zip">zip</a>
322 directory / @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
323 directory / @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
323 <td class="name"><a href="/file/xyzzy/?style=coal">[up]</a></td>
324 <td class="name"><a href="/file/xyzzy/?style=coal">[up]</a></td>
324 <a href="/file/xyzzy/dir?style=coal">
325 <a href="/file/xyzzy/dir?style=coal">
325 <a href="/file/xyzzy/dir/?style=coal">
326 <a href="/file/xyzzy/dir/?style=coal">
326 <a href="/file/xyzzy/foo?style=coal">
327 <a href="/file/xyzzy/foo?style=coal">
327
328
328 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=coal' | egrep $REVLINKS
329 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=coal' | egrep $REVLINKS
329 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
330 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
330 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
331 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
331 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
332 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
332 <li><a href="/file/xyzzy/?style=coal">browse</a></li>
333 <li><a href="/file/xyzzy/?style=coal">browse</a></li>
333 <li><a href="/file/tip/foo?style=coal">latest</a></li>
334 <li><a href="/file/tip/foo?style=coal">latest</a></li>
334 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
335 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
335 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
336 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
336 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
337 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
337 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
338 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
338 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
339 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
339 view foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
340 view foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
340 <td class="author"><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
341 <td class="author"><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
341 <td class="author"><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
342 <td class="author"><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
342
343
343 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=coal' | egrep $REVLINKS
344 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=coal' | egrep $REVLINKS
344 href="/atom-log/tip/foo" title="Atom feed for test:foo" />
345 href="/atom-log/tip/foo" title="Atom feed for test:foo" />
345 href="/rss-log/tip/foo" title="RSS feed for test:foo" />
346 href="/rss-log/tip/foo" title="RSS feed for test:foo" />
346 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
347 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
347 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
348 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
348 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
349 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
349 <li><a href="/file/xyzzy?style=coal">browse</a></li>
350 <li><a href="/file/xyzzy?style=coal">browse</a></li>
350 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
351 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
351 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
352 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
352 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
353 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
353 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
354 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
354 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
355 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
355 <a href="/atom-log/a7c1559b7bba/foo" title="subscribe to atom feed">
356 <a href="/atom-log/a7c1559b7bba/foo" title="subscribe to atom feed">
357 log foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
356 <a href="/log/xyzzy/foo?revcount=30&style=coal">less</a>
358 <a href="/log/xyzzy/foo?revcount=30&style=coal">less</a>
357 <a href="/log/xyzzy/foo?revcount=120&style=coal">more</a>
359 <a href="/log/xyzzy/foo?revcount=120&style=coal">more</a>
358 | <a href="/log/43c799df6e75/foo?style=coal">(0)</a> <a href="/log/tip/foo?style=coal">tip</a> </div>
360 | <a href="/log/43c799df6e75/foo?style=coal">(0)</a> <a href="/log/tip/foo?style=coal">tip</a> </div>
359 <a href="/rev/a7c1559b7bba?style=coal">second</a>
361 <a href="/rev/a7c1559b7bba?style=coal">second</a>
360 <a href="/rev/43c799df6e75?style=coal">first</a>
362 <a href="/rev/43c799df6e75?style=coal">first</a>
361 <a href="/log/xyzzy/foo?revcount=30&style=coal">less</a>
363 <a href="/log/xyzzy/foo?revcount=30&style=coal">less</a>
362 <a href="/log/xyzzy/foo?revcount=120&style=coal">more</a>
364 <a href="/log/xyzzy/foo?revcount=120&style=coal">more</a>
363 | <a href="/log/43c799df6e75/foo?style=coal">(0)</a> <a href="/log/tip/foo?style=coal">tip</a>
365 | <a href="/log/43c799df6e75/foo?style=coal">(0)</a> <a href="/log/tip/foo?style=coal">tip</a>
364
366
365 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=coal' | egrep $REVLINKS
367 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=coal' | egrep $REVLINKS
366 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
368 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
367 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
369 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
368 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
370 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
369 <li><a href="/file/xyzzy/?style=coal">browse</a></li>
371 <li><a href="/file/xyzzy/?style=coal">browse</a></li>
370 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
372 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
371 <li><a href="/file/tip/foo?style=coal">latest</a></li>
373 <li><a href="/file/tip/foo?style=coal">latest</a></li>
372 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
374 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
373 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
375 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
374 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
376 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
375 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
377 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
376 annotate foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
378 annotate foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
377 <td class="author"><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
379 <td class="author"><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
378 <td class="author"><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
380 <td class="author"><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
379 <a href="/annotate/43c799df6e75/foo?style=coal#l1"
381 <a href="/annotate/43c799df6e75/foo?style=coal#l1"
380 <a href="/annotate/a7c1559b7bba/foo?style=coal#l2"
382 <a href="/annotate/a7c1559b7bba/foo?style=coal#l2"
381
383
382 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=coal' | egrep $REVLINKS
384 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=coal' | egrep $REVLINKS
383 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
385 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
384 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
386 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
385 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
387 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
386 <li><a href="/file/xyzzy?style=coal">browse</a></li>
388 <li><a href="/file/xyzzy?style=coal">browse</a></li>
387 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
389 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
388 <li><a href="/file/tip/foo?style=coal">latest</a></li>
390 <li><a href="/file/tip/foo?style=coal">latest</a></li>
389 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
391 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
390 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
392 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
391 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
393 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
392 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
394 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
393 diff foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
395 diff foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
394 <td><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
396 <td><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
395 <td><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
397 <td><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
396
398
397 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=coal' | egrep $REVLINKS
399 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=coal' | egrep $REVLINKS
398 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
400 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
399 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
401 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
400 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
402 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
401 <li><a href="/file/xyzzy?style=coal">browse</a></li>
403 <li><a href="/file/xyzzy?style=coal">browse</a></li>
402 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
404 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
403 <li><a href="/file/tip/foo?style=coal">latest</a></li>
405 <li><a href="/file/tip/foo?style=coal">latest</a></li>
404 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
406 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
405 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
407 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
406 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
408 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
407 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
409 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
408 comparison foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
410 comparison foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
409 <td><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
411 <td><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
410 <td><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
412 <td><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
411
413
412 (De)referencing symbolic revisions (gitweb)
414 (De)referencing symbolic revisions (gitweb)
413
415
414 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'summary?style=gitweb' | egrep $REVLINKS
416 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'summary?style=gitweb' | egrep $REVLINKS
415 <a href="/file?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
417 <a href="/file?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
416 <a class="list" href="/rev/9d8c40cba617?style=gitweb">
418 <a class="list" href="/rev/9d8c40cba617?style=gitweb">
417 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
419 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
418 <a href="/file/9d8c40cba617?style=gitweb">files</a>
420 <a href="/file/9d8c40cba617?style=gitweb">files</a>
419 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
421 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
420 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
422 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
421 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
423 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
422 <a class="list" href="/rev/43c799df6e75?style=gitweb">
424 <a class="list" href="/rev/43c799df6e75?style=gitweb">
423 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
425 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
424 <a href="/file/43c799df6e75?style=gitweb">files</a>
426 <a href="/file/43c799df6e75?style=gitweb">files</a>
425 <td><a class="list" href="/rev/xyzzy?style=gitweb"><b>xyzzy</b></a></td>
427 <td><a class="list" href="/rev/xyzzy?style=gitweb"><b>xyzzy</b></a></td>
426 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
428 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
427 <a href="/log/a7c1559b7bba?style=gitweb">changelog</a> |
429 <a href="/log/a7c1559b7bba?style=gitweb">changelog</a> |
428 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
430 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
429 <td class="open"><a class="list" href="/shortlog/default?style=gitweb"><b>default</b></a></td>
431 <td class="open"><a class="list" href="/shortlog/default?style=gitweb"><b>default</b></a></td>
430 <a href="/changeset/9d8c40cba617?style=gitweb">changeset</a> |
432 <a href="/changeset/9d8c40cba617?style=gitweb">changeset</a> |
431 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
433 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
432 <a href="/file/9d8c40cba617?style=gitweb">files</a>
434 <a href="/file/9d8c40cba617?style=gitweb">files</a>
433
435
434 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=gitweb' | egrep $REVLINKS
436 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=gitweb' | egrep $REVLINKS
435 <a href="/log/tip?style=gitweb">changelog</a> |
437 <a href="/log/tip?style=gitweb">changelog</a> |
436 <a href="/graph/tip?style=gitweb">graph</a> |
438 <a href="/graph/tip?style=gitweb">graph</a> |
437 <a href="/file/tip?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
439 <a href="/file/tip?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
438 <br/><a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a> <br/>
440 <br/><a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a> <br/>
439 <a class="list" href="/rev/9d8c40cba617?style=gitweb">
441 <a class="list" href="/rev/9d8c40cba617?style=gitweb">
440 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
442 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
441 <a href="/file/9d8c40cba617?style=gitweb">files</a>
443 <a href="/file/9d8c40cba617?style=gitweb">files</a>
442 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
444 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
443 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
445 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
444 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
446 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
445 <a class="list" href="/rev/43c799df6e75?style=gitweb">
447 <a class="list" href="/rev/43c799df6e75?style=gitweb">
446 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
448 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
447 <a href="/file/43c799df6e75?style=gitweb">files</a>
449 <a href="/file/43c799df6e75?style=gitweb">files</a>
448 <a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a>
450 <a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a>
449
451
450 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=gitweb' | egrep $REVLINKS
452 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=gitweb' | egrep $REVLINKS
451 <a href="/shortlog/tip?style=gitweb">shortlog</a> |
453 <a href="/shortlog/tip?style=gitweb">shortlog</a> |
452 <a href="/graph/tip?style=gitweb">graph</a> |
454 <a href="/graph/tip?style=gitweb">graph</a> |
453 <a href="/file/tip?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
455 <a href="/file/tip?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
454 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
456 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
455 <a class="title" href="/rev/9d8c40cba617?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a>
457 <a class="title" href="/rev/9d8c40cba617?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a>
456 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a><br/>
458 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a><br/>
457 <a class="title" href="/rev/a7c1559b7bba?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
459 <a class="title" href="/rev/a7c1559b7bba?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
458 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
460 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
459 <a class="title" href="/rev/43c799df6e75?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>first<span class="logtags"> </span></a>
461 <a class="title" href="/rev/43c799df6e75?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>first<span class="logtags"> </span></a>
460 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
462 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
461 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
463 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
462
464
463 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=gitweb' | egrep $REVLINKS
465 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=gitweb' | egrep $REVLINKS
464 <a href="/shortlog/tip?style=gitweb">shortlog</a> |
466 <a href="/shortlog/tip?style=gitweb">shortlog</a> |
465 <a href="/log/tip?style=gitweb">changelog</a> |
467 <a href="/log/tip?style=gitweb">changelog</a> |
466 <a href="/file/tip?style=gitweb">files</a> |
468 <a href="/file/tip?style=gitweb">files</a> |
467 <a href="/graph/tip?revcount=30&style=gitweb">less</a>
469 <a href="/graph/tip?revcount=30&style=gitweb">less</a>
468 <a href="/graph/tip?revcount=120&style=gitweb">more</a>
470 <a href="/graph/tip?revcount=120&style=gitweb">more</a>
469 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
471 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
470 <a href="/graph/tip?revcount=30&style=gitweb">less</a>
472 <a href="/graph/tip?revcount=30&style=gitweb">less</a>
471 <a href="/graph/tip?revcount=120&style=gitweb">more</a>
473 <a href="/graph/tip?revcount=120&style=gitweb">more</a>
472 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a>
474 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a>
473
475
474 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=gitweb' | egrep $REVLINKS
476 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=gitweb' | egrep $REVLINKS
475 <td><a class="list" href="/rev/tip?style=gitweb"><b>tip</b></a></td>
477 <td><a class="list" href="/rev/tip?style=gitweb"><b>tip</b></a></td>
476 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
478 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
477 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
479 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
478 <a href="/file/9d8c40cba617?style=gitweb">files</a>
480 <a href="/file/9d8c40cba617?style=gitweb">files</a>
479
481
480 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=gitweb' | egrep $REVLINKS
482 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=gitweb' | egrep $REVLINKS
481 <td><a class="list" href="/rev/xyzzy?style=gitweb"><b>xyzzy</b></a></td>
483 <td><a class="list" href="/rev/xyzzy?style=gitweb"><b>xyzzy</b></a></td>
482 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
484 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
483 <a href="/log/a7c1559b7bba?style=gitweb">changelog</a> |
485 <a href="/log/a7c1559b7bba?style=gitweb">changelog</a> |
484 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
486 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
485
487
486 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=gitweb' | egrep $REVLINKS
488 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=gitweb' | egrep $REVLINKS
487 <td class="open"><a class="list" href="/shortlog/default?style=gitweb"><b>default</b></a></td>
489 <td class="open"><a class="list" href="/shortlog/default?style=gitweb"><b>default</b></a></td>
488 <a href="/changeset/9d8c40cba617?style=gitweb">changeset</a> |
490 <a href="/changeset/9d8c40cba617?style=gitweb">changeset</a> |
489 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
491 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
490 <a href="/file/9d8c40cba617?style=gitweb">files</a>
492 <a href="/file/9d8c40cba617?style=gitweb">files</a>
491
493
492 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=gitweb' | egrep $REVLINKS
494 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=gitweb' | egrep $REVLINKS
493 <a href="/rev/tip?style=gitweb">changeset</a> | <a href="/archive/tip.zip">zip</a> |
495 <a href="/rev/tip?style=gitweb">changeset</a> | <a href="/archive/tip.zip">zip</a> |
494 <td><a href="/file/tip/?style=gitweb">[up]</a></td>
496 <td><a href="/file/tip/?style=gitweb">[up]</a></td>
495 <a href="/file/tip/dir?style=gitweb">dir</a>
497 <a href="/file/tip/dir?style=gitweb">dir</a>
496 <a href="/file/tip/dir/?style=gitweb"></a>
498 <a href="/file/tip/dir/?style=gitweb"></a>
497 <a href="/file/tip/dir?style=gitweb">files</a>
499 <a href="/file/tip/dir?style=gitweb">files</a>
498 <a class="list" href="/file/tip/foo?style=gitweb">foo</a>
500 <a class="list" href="/file/tip/foo?style=gitweb">foo</a>
499 <a href="/file/tip/foo?style=gitweb">file</a> |
501 <a href="/file/tip/foo?style=gitweb">file</a> |
500 <a href="/log/tip/foo?style=gitweb">revisions</a> |
502 <a href="/log/tip/foo?style=gitweb">revisions</a> |
501 <a href="/annotate/tip/foo?style=gitweb">annotate</a>
503 <a href="/annotate/tip/foo?style=gitweb">annotate</a>
502
504
503 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=gitweb&rev=all()' | egrep $REVLINKS
505 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=gitweb&rev=all()' | egrep $REVLINKS
504 <a href="/file?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a>
506 <a href="/file?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a>
505 <a class="title" href="/rev/9d8c40cba617?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a>
507 <a class="title" href="/rev/9d8c40cba617?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a>
506 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a><br/>
508 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a><br/>
507 <a class="title" href="/rev/a7c1559b7bba?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
509 <a class="title" href="/rev/a7c1559b7bba?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
508 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
510 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
509 <a class="title" href="/rev/43c799df6e75?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>first<span class="logtags"> </span></a>
511 <a class="title" href="/rev/43c799df6e75?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>first<span class="logtags"> </span></a>
510 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
512 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
511
513
512 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=gitweb' | egrep $REVLINKS
514 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=gitweb' | egrep $REVLINKS
513 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
515 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
514 <a href="/log/xyzzy?style=gitweb">changelog</a> |
516 <a href="/log/xyzzy?style=gitweb">changelog</a> |
515 <a href="/graph/xyzzy?style=gitweb">graph</a> |
517 <a href="/graph/xyzzy?style=gitweb">graph</a> |
516 <a href="/file/xyzzy?style=gitweb">files</a> |
518 <a href="/file/xyzzy?style=gitweb">files</a> |
517 <a href="/raw-rev/xyzzy">raw</a> | <a href="/archive/xyzzy.zip">zip</a> |
519 <a href="/raw-rev/xyzzy">raw</a> | <a href="/archive/xyzzy.zip">zip</a> |
518 <a class="title" href="/raw-rev/a7c1559b7bba">second <span class="logtags"><span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
520 <a class="title" href="/raw-rev/a7c1559b7bba">second <span class="logtags"><span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
519 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
521 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
520 <a class="list" href="/rev/43c799df6e75?style=gitweb">43c799df6e75</a>
522 <a class="list" href="/rev/43c799df6e75?style=gitweb">43c799df6e75</a>
521 <a class="list" href="/rev/9d8c40cba617?style=gitweb">9d8c40cba617</a>
523 <a class="list" href="/rev/9d8c40cba617?style=gitweb">9d8c40cba617</a>
522 <td><a class="list" href="/diff/a7c1559b7bba/foo?style=gitweb">foo</a></td>
524 <td><a class="list" href="/diff/a7c1559b7bba/foo?style=gitweb">foo</a></td>
523 <a href="/file/a7c1559b7bba/foo?style=gitweb">file</a> |
525 <a href="/file/a7c1559b7bba/foo?style=gitweb">file</a> |
524 <a href="/annotate/a7c1559b7bba/foo?style=gitweb">annotate</a> |
526 <a href="/annotate/a7c1559b7bba/foo?style=gitweb">annotate</a> |
525 <a href="/diff/a7c1559b7bba/foo?style=gitweb">diff</a> |
527 <a href="/diff/a7c1559b7bba/foo?style=gitweb">diff</a> |
526 <a href="/comparison/a7c1559b7bba/foo?style=gitweb">comparison</a> |
528 <a href="/comparison/a7c1559b7bba/foo?style=gitweb">comparison</a> |
527 <a href="/log/a7c1559b7bba/foo?style=gitweb">revisions</a>
529 <a href="/log/a7c1559b7bba/foo?style=gitweb">revisions</a>
528
530
529 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=gitweb' | egrep $REVLINKS
531 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=gitweb' | egrep $REVLINKS
530 <a href="/log/xyzzy?style=gitweb">changelog</a> |
532 <a href="/log/xyzzy?style=gitweb">changelog</a> |
531 <a href="/graph/xyzzy?style=gitweb">graph</a> |
533 <a href="/graph/xyzzy?style=gitweb">graph</a> |
532 <a href="/file/xyzzy?style=gitweb">files</a> | <a href="/archive/xyzzy.zip">zip</a> |
534 <a href="/file/xyzzy?style=gitweb">files</a> | <a href="/archive/xyzzy.zip">zip</a> |
533 <br/><a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a> <br/>
535 <br/><a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a> <br/>
534 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
536 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
535 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
537 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
536 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
538 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
537 <a class="list" href="/rev/43c799df6e75?style=gitweb">
539 <a class="list" href="/rev/43c799df6e75?style=gitweb">
538 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
540 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
539 <a href="/file/43c799df6e75?style=gitweb">files</a>
541 <a href="/file/43c799df6e75?style=gitweb">files</a>
540 <a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a>
542 <a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a>
541
543
542 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=gitweb' | egrep $REVLINKS
544 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=gitweb' | egrep $REVLINKS
543 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
545 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
544 <a href="/graph/xyzzy?style=gitweb">graph</a> |
546 <a href="/graph/xyzzy?style=gitweb">graph</a> |
545 <a href="/file/xyzzy?style=gitweb">files</a> | <a href="/archive/xyzzy.zip">zip</a> |
547 <a href="/file/xyzzy?style=gitweb">files</a> | <a href="/archive/xyzzy.zip">zip</a> |
546 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
548 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
547 <a class="title" href="/rev/a7c1559b7bba?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
549 <a class="title" href="/rev/a7c1559b7bba?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
548 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
550 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
549 <a class="title" href="/rev/43c799df6e75?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>first<span class="logtags"> </span></a>
551 <a class="title" href="/rev/43c799df6e75?style=gitweb"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>first<span class="logtags"> </span></a>
550 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
552 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
551 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
553 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
552
554
553 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=gitweb' | egrep $REVLINKS
555 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=gitweb' | egrep $REVLINKS
554 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
556 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
555 <a href="/log/xyzzy?style=gitweb">changelog</a> |
557 <a href="/log/xyzzy?style=gitweb">changelog</a> |
556 <a href="/file/xyzzy?style=gitweb">files</a> |
558 <a href="/file/xyzzy?style=gitweb">files</a> |
557 <a href="/graph/xyzzy?revcount=30&style=gitweb">less</a>
559 <a href="/graph/xyzzy?revcount=30&style=gitweb">less</a>
558 <a href="/graph/xyzzy?revcount=120&style=gitweb">more</a>
560 <a href="/graph/xyzzy?revcount=120&style=gitweb">more</a>
559 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
561 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
560 <a href="/graph/xyzzy?revcount=30&style=gitweb">less</a>
562 <a href="/graph/xyzzy?revcount=30&style=gitweb">less</a>
561 <a href="/graph/xyzzy?revcount=120&style=gitweb">more</a>
563 <a href="/graph/xyzzy?revcount=120&style=gitweb">more</a>
562 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a>
564 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a>
563
565
564 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=gitweb' | egrep $REVLINKS
566 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=gitweb' | egrep $REVLINKS
565 <a href="/rev/xyzzy?style=gitweb">changeset</a> | <a href="/archive/xyzzy.zip">zip</a> |
567 <a href="/rev/xyzzy?style=gitweb">changeset</a> | <a href="/archive/xyzzy.zip">zip</a> |
566 <td><a href="/file/xyzzy/?style=gitweb">[up]</a></td>
568 <td><a href="/file/xyzzy/?style=gitweb">[up]</a></td>
567 <a href="/file/xyzzy/dir?style=gitweb">dir</a>
569 <a href="/file/xyzzy/dir?style=gitweb">dir</a>
568 <a href="/file/xyzzy/dir/?style=gitweb"></a>
570 <a href="/file/xyzzy/dir/?style=gitweb"></a>
569 <a href="/file/xyzzy/dir?style=gitweb">files</a>
571 <a href="/file/xyzzy/dir?style=gitweb">files</a>
570 <a class="list" href="/file/xyzzy/foo?style=gitweb">foo</a>
572 <a class="list" href="/file/xyzzy/foo?style=gitweb">foo</a>
571 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
573 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
572 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
574 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
573 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a>
575 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a>
574
576
575 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=gitweb' | egrep $REVLINKS
577 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=gitweb' | egrep $REVLINKS
576 <a href="/file/xyzzy/?style=gitweb">files</a> |
578 <a href="/file/xyzzy/?style=gitweb">files</a> |
577 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
579 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
578 <a href="/file/tip/foo?style=gitweb">latest</a> |
580 <a href="/file/tip/foo?style=gitweb">latest</a> |
579 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
581 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
580 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
582 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
581 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
583 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
582 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
584 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
583 <a href="/raw-file/xyzzy/foo">raw</a> |
585 <a href="/raw-file/xyzzy/foo">raw</a> |
584 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
586 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
585 <a class="list" href="/file/43c799df6e75/foo?style=gitweb">
587 <a class="list" href="/file/43c799df6e75/foo?style=gitweb">
586 <a class="list" href="/file/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a></td>
588 <a class="list" href="/file/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a></td>
587
589
588 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=gitweb' | egrep $REVLINKS
590 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=gitweb' | egrep $REVLINKS
589 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
591 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
590 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
592 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
591 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
593 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
592 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
594 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
593 <a href="/rss-log/tip/foo">rss</a> |
595 <a href="/rss-log/tip/foo">rss</a> |
594 <a href="/log/43c799df6e75/foo?style=gitweb">(0)</a> <a href="/log/tip/foo?style=gitweb">tip</a>
596 <a href="/log/43c799df6e75/foo?style=gitweb">(0)</a> <a href="/log/tip/foo?style=gitweb">tip</a>
595 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
597 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
596 <a href="/file/a7c1559b7bba/foo?style=gitweb">file</a> |
598 <a href="/file/a7c1559b7bba/foo?style=gitweb">file</a> |
597 <a href="/diff/a7c1559b7bba/foo?style=gitweb">diff</a> |
599 <a href="/diff/a7c1559b7bba/foo?style=gitweb">diff</a> |
598 <a href="/annotate/a7c1559b7bba/foo?style=gitweb">annotate</a>
600 <a href="/annotate/a7c1559b7bba/foo?style=gitweb">annotate</a>
599 <a class="list" href="/rev/43c799df6e75?style=gitweb">
601 <a class="list" href="/rev/43c799df6e75?style=gitweb">
600 <a href="/file/43c799df6e75/foo?style=gitweb">file</a> |
602 <a href="/file/43c799df6e75/foo?style=gitweb">file</a> |
601 <a href="/diff/43c799df6e75/foo?style=gitweb">diff</a> |
603 <a href="/diff/43c799df6e75/foo?style=gitweb">diff</a> |
602 <a href="/annotate/43c799df6e75/foo?style=gitweb">annotate</a>
604 <a href="/annotate/43c799df6e75/foo?style=gitweb">annotate</a>
603 <a href="/log/43c799df6e75/foo?style=gitweb">(0)</a> <a href="/log/tip/foo?style=gitweb">tip</a>
605 <a href="/log/43c799df6e75/foo?style=gitweb">(0)</a> <a href="/log/tip/foo?style=gitweb">tip</a>
604
606
605 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=gitweb' | egrep $REVLINKS
607 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=gitweb' | egrep $REVLINKS
606 <a href="/file/xyzzy/?style=gitweb">files</a> |
608 <a href="/file/xyzzy/?style=gitweb">files</a> |
607 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
609 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
608 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
610 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
609 <a href="/file/tip/foo?style=gitweb">latest</a> |
611 <a href="/file/tip/foo?style=gitweb">latest</a> |
610 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
612 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
611 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
613 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
612 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
614 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
613 <a href="/raw-annotate/xyzzy/foo">raw</a> |
615 <a href="/raw-annotate/xyzzy/foo">raw</a> |
614 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
616 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
615 <a class="list" href="/annotate/43c799df6e75/foo?style=gitweb">
617 <a class="list" href="/annotate/43c799df6e75/foo?style=gitweb">
616 <a class="list" href="/annotate/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a></td>
618 <a class="list" href="/annotate/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a></td>
617 <a href="/annotate/43c799df6e75/foo?style=gitweb#l1"
619 <a href="/annotate/43c799df6e75/foo?style=gitweb#l1"
618 <a href="/annotate/a7c1559b7bba/foo?style=gitweb#l2"
620 <a href="/annotate/a7c1559b7bba/foo?style=gitweb#l2"
619
621
620 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=gitweb' | egrep $REVLINKS
622 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=gitweb' | egrep $REVLINKS
621 <a href="/file/xyzzy?style=gitweb">files</a> |
623 <a href="/file/xyzzy?style=gitweb">files</a> |
622 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
624 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
623 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
625 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
624 <a href="/file/tip/foo?style=gitweb">latest</a> |
626 <a href="/file/tip/foo?style=gitweb">latest</a> |
625 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
627 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
626 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
628 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
627 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
629 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
628 <a href="/raw-diff/xyzzy/foo">raw</a> |
630 <a href="/raw-diff/xyzzy/foo">raw</a> |
629 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
631 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
630 <a class="list" href="/diff/43c799df6e75/foo?style=gitweb">
632 <a class="list" href="/diff/43c799df6e75/foo?style=gitweb">
631 <a class="list" href="/diff/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a>
633 <a class="list" href="/diff/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a>
632
634
633 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=gitweb' | egrep $REVLINKS
635 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=gitweb' | egrep $REVLINKS
634 <a href="/file/xyzzy?style=gitweb">files</a> |
636 <a href="/file/xyzzy?style=gitweb">files</a> |
635 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
637 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
636 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
638 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
637 <a href="/file/tip/foo?style=gitweb">latest</a> |
639 <a href="/file/tip/foo?style=gitweb">latest</a> |
638 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
640 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
639 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
641 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
640 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
642 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
641 <a href="/raw-diff/xyzzy/foo">raw</a> |
643 <a href="/raw-diff/xyzzy/foo">raw</a> |
642 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
644 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
643 <a class="list" href="/comparison/43c799df6e75/foo?style=gitweb">
645 <a class="list" href="/comparison/43c799df6e75/foo?style=gitweb">
644 <a class="list" href="/comparison/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a>
646 <a class="list" href="/comparison/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a>
645
647
646 (De)referencing symbolic revisions (monoblue)
648 (De)referencing symbolic revisions (monoblue)
647
649
648 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'summary?style=monoblue' | egrep $REVLINKS
650 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'summary?style=monoblue' | egrep $REVLINKS
649 <li><a href="/archive/tip.zip">zip</a></li>
651 <li><a href="/archive/tip.zip">zip</a></li>
650 <a href="/rev/9d8c40cba617?style=monoblue">
652 <a href="/rev/9d8c40cba617?style=monoblue">
651 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
653 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
652 <a href="/file/9d8c40cba617?style=monoblue">files</a>
654 <a href="/file/9d8c40cba617?style=monoblue">files</a>
653 <a href="/rev/a7c1559b7bba?style=monoblue">
655 <a href="/rev/a7c1559b7bba?style=monoblue">
654 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
656 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
655 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
657 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
656 <a href="/rev/43c799df6e75?style=monoblue">
658 <a href="/rev/43c799df6e75?style=monoblue">
657 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
659 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
658 <a href="/file/43c799df6e75?style=monoblue">files</a>
660 <a href="/file/43c799df6e75?style=monoblue">files</a>
659 <td><a href="/rev/xyzzy?style=monoblue">xyzzy</a></td>
661 <td><a href="/rev/xyzzy?style=monoblue">xyzzy</a></td>
660 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
662 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
661 <a href="/log/a7c1559b7bba?style=monoblue">changelog</a> |
663 <a href="/log/a7c1559b7bba?style=monoblue">changelog</a> |
662 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
664 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
663 <td class="open"><a href="/shortlog/default?style=monoblue">default</a></td>
665 <td class="open"><a href="/shortlog/default?style=monoblue">default</a></td>
664 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
666 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
665 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
667 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
666 <a href="/file/9d8c40cba617?style=monoblue">files</a>
668 <a href="/file/9d8c40cba617?style=monoblue">files</a>
667
669
668 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=monoblue' | egrep $REVLINKS
670 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=monoblue' | egrep $REVLINKS
669 <li><a href="/graph/tip?style=monoblue">graph</a></li>
671 <li><a href="/graph/tip?style=monoblue">graph</a></li>
670 <li><a href="/file/tip?style=monoblue">files</a></li>
672 <li><a href="/file/tip?style=monoblue">files</a></li>
671 <li><a href="/archive/tip.zip">zip</a></li>
673 <li><a href="/archive/tip.zip">zip</a></li>
672 <a href="/rev/9d8c40cba617?style=monoblue">
674 <a href="/rev/9d8c40cba617?style=monoblue">
673 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
675 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
674 <a href="/file/9d8c40cba617?style=monoblue">files</a>
676 <a href="/file/9d8c40cba617?style=monoblue">files</a>
675 <a href="/rev/a7c1559b7bba?style=monoblue">
677 <a href="/rev/a7c1559b7bba?style=monoblue">
676 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
678 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
677 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
679 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
678 <a href="/rev/43c799df6e75?style=monoblue">
680 <a href="/rev/43c799df6e75?style=monoblue">
679 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
681 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
680 <a href="/file/43c799df6e75?style=monoblue">files</a>
682 <a href="/file/43c799df6e75?style=monoblue">files</a>
681 <a href="/shortlog/43c799df6e75?style=monoblue">(0)</a> <a href="/shortlog/tip?style=monoblue">tip</a>
683 <a href="/shortlog/43c799df6e75?style=monoblue">(0)</a> <a href="/shortlog/tip?style=monoblue">tip</a>
682
684
683 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=monoblue' | egrep $REVLINKS
685 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=monoblue' | egrep $REVLINKS
684 <li><a href="/graph/tip?style=monoblue">graph</a></li>
686 <li><a href="/graph/tip?style=monoblue">graph</a></li>
685 <li><a href="/file/tip?style=monoblue">files</a></li>
687 <li><a href="/file/tip?style=monoblue">files</a></li>
686 <li><a href="/archive/tip.zip">zip</a></li>
688 <li><a href="/archive/tip.zip">zip</a></li>
687 <h3 class="changelog"><a class="title" href="/rev/9d8c40cba617?style=monoblue">third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a></h3>
689 <h3 class="changelog"><a class="title" href="/rev/9d8c40cba617?style=monoblue">third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a></h3>
688 <h3 class="changelog"><a class="title" href="/rev/a7c1559b7bba?style=monoblue">second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
690 <h3 class="changelog"><a class="title" href="/rev/a7c1559b7bba?style=monoblue">second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
689 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
691 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
690 <a href="/log/43c799df6e75?style=monoblue">(0)</a> <a href="/log/tip?style=monoblue">tip</a>
692 <a href="/log/43c799df6e75?style=monoblue">(0)</a> <a href="/log/tip?style=monoblue">tip</a>
691
693
692 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=monoblue' | egrep $REVLINKS
694 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=monoblue' | egrep $REVLINKS
693 <li><a href="/file/tip?style=monoblue">files</a></li>
695 <li><a href="/file/tip?style=monoblue">files</a></li>
694 <a href="/graph/tip?revcount=30&style=monoblue">less</a>
696 <a href="/graph/tip?revcount=30&style=monoblue">less</a>
695 <a href="/graph/tip?revcount=120&style=monoblue">more</a>
697 <a href="/graph/tip?revcount=120&style=monoblue">more</a>
696 | <a href="/graph/43c799df6e75?style=monoblue">(0)</a> <a href="/graph/tip?style=monoblue">tip</a>
698 | <a href="/graph/43c799df6e75?style=monoblue">(0)</a> <a href="/graph/tip?style=monoblue">tip</a>
697
699
698 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=monoblue' | egrep $REVLINKS
700 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=monoblue' | egrep $REVLINKS
699 <td><a href="/rev/tip?style=monoblue">tip</a></td>
701 <td><a href="/rev/tip?style=monoblue">tip</a></td>
700 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
702 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
701 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
703 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
702 <a href="/file/9d8c40cba617?style=monoblue">files</a>
704 <a href="/file/9d8c40cba617?style=monoblue">files</a>
703
705
704 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=monoblue' | egrep $REVLINKS
706 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=monoblue' | egrep $REVLINKS
705 <td><a href="/rev/xyzzy?style=monoblue">xyzzy</a></td>
707 <td><a href="/rev/xyzzy?style=monoblue">xyzzy</a></td>
706 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
708 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
707 <a href="/log/a7c1559b7bba?style=monoblue">changelog</a> |
709 <a href="/log/a7c1559b7bba?style=monoblue">changelog</a> |
708 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
710 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
709
711
710 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=monoblue' | egrep $REVLINKS
712 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=monoblue' | egrep $REVLINKS
711 <td class="open"><a href="/shortlog/default?style=monoblue">default</a></td>
713 <td class="open"><a href="/shortlog/default?style=monoblue">default</a></td>
712 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
714 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
713 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
715 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
714 <a href="/file/9d8c40cba617?style=monoblue">files</a>
716 <a href="/file/9d8c40cba617?style=monoblue">files</a>
715
717
716 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=monoblue' | egrep $REVLINKS
718 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=monoblue' | egrep $REVLINKS
717 <li><a href="/graph/tip?style=monoblue">graph</a></li>
719 <li><a href="/graph/tip?style=monoblue">graph</a></li>
718 <li><a href="/rev/tip?style=monoblue">changeset</a></li>
720 <li><a href="/rev/tip?style=monoblue">changeset</a></li>
719 <li><a href="/archive/tip.zip">zip</a></li>
721 <li><a href="/archive/tip.zip">zip</a></li>
720 <td><a href="/file/tip/?style=monoblue">[up]</a></td>
722 <td><a href="/file/tip/?style=monoblue">[up]</a></td>
721 <a href="/file/tip/dir?style=monoblue">dir</a>
723 <a href="/file/tip/dir?style=monoblue">dir</a>
722 <a href="/file/tip/dir/?style=monoblue"></a>
724 <a href="/file/tip/dir/?style=monoblue"></a>
723 <td><a href="/file/tip/dir?style=monoblue">files</a></td>
725 <td><a href="/file/tip/dir?style=monoblue">files</a></td>
724 <td><a href="/file/tip/foo?style=monoblue">foo</a></td>
726 <td><a href="/file/tip/foo?style=monoblue">foo</a></td>
725 <a href="/file/tip/foo?style=monoblue">file</a> |
727 <a href="/file/tip/foo?style=monoblue">file</a> |
726 <a href="/log/tip/foo?style=monoblue">revisions</a> |
728 <a href="/log/tip/foo?style=monoblue">revisions</a> |
727 <a href="/annotate/tip/foo?style=monoblue">annotate</a>
729 <a href="/annotate/tip/foo?style=monoblue">annotate</a>
728
730
729 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=monoblue&rev=all()' | egrep $REVLINKS
731 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=monoblue&rev=all()' | egrep $REVLINKS
730 <li><a href="/archive/tip.zip">zip</a></li>
732 <li><a href="/archive/tip.zip">zip</a></li>
731 <h3 class="changelog"><a class="title" href="/rev/9d8c40cba617?style=monoblue">third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a></h3>
733 <h3 class="changelog"><a class="title" href="/rev/9d8c40cba617?style=monoblue">third<span class="logtags"> <span class="branchtag" title="default">default</span> <span class="tagtag" title="tip">tip</span> </span></a></h3>
732 <h3 class="changelog"><a class="title" href="/rev/a7c1559b7bba?style=monoblue">second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
734 <h3 class="changelog"><a class="title" href="/rev/a7c1559b7bba?style=monoblue">second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
733 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
735 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
734
736
735 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=monoblue' | egrep $REVLINKS
737 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=monoblue' | egrep $REVLINKS
736 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
738 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
737 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
739 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
738 <li><a href="/raw-rev/xyzzy">raw</a></li>
740 <li><a href="/raw-rev/xyzzy">raw</a></li>
739 <li><a href="/archive/xyzzy.zip">zip</a></li>
741 <li><a href="/archive/xyzzy.zip">zip</a></li>
740 <h3 class="changeset"><a href="/raw-rev/a7c1559b7bba">second <span class="logtags"><span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
742 <h3 class="changeset"><a href="/raw-rev/a7c1559b7bba">second <span class="logtags"><span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
741 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
743 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
742 <dd><a href="/rev/43c799df6e75?style=monoblue">43c799df6e75</a></dd>
744 <dd><a href="/rev/43c799df6e75?style=monoblue">43c799df6e75</a></dd>
743 <dd><a href="/rev/9d8c40cba617?style=monoblue">9d8c40cba617</a></dd>
745 <dd><a href="/rev/9d8c40cba617?style=monoblue">9d8c40cba617</a></dd>
744 <td><a href="/diff/a7c1559b7bba/foo?style=monoblue">foo</a></td>
746 <td><a href="/diff/a7c1559b7bba/foo?style=monoblue">foo</a></td>
745 <a href="/file/a7c1559b7bba/foo?style=monoblue">file</a> |
747 <a href="/file/a7c1559b7bba/foo?style=monoblue">file</a> |
746 <a href="/annotate/a7c1559b7bba/foo?style=monoblue">annotate</a> |
748 <a href="/annotate/a7c1559b7bba/foo?style=monoblue">annotate</a> |
747 <a href="/diff/a7c1559b7bba/foo?style=monoblue">diff</a> |
749 <a href="/diff/a7c1559b7bba/foo?style=monoblue">diff</a> |
748 <a href="/comparison/a7c1559b7bba/foo?style=monoblue">comparison</a> |
750 <a href="/comparison/a7c1559b7bba/foo?style=monoblue">comparison</a> |
749 <a href="/log/a7c1559b7bba/foo?style=monoblue">revisions</a>
751 <a href="/log/a7c1559b7bba/foo?style=monoblue">revisions</a>
750
752
751 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=monoblue' | egrep $REVLINKS
753 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=monoblue' | egrep $REVLINKS
752 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
754 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
753 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
755 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
754 <li><a href="/archive/xyzzy.zip">zip</a></li>
756 <li><a href="/archive/xyzzy.zip">zip</a></li>
755 <a href="/rev/a7c1559b7bba?style=monoblue">
757 <a href="/rev/a7c1559b7bba?style=monoblue">
756 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
758 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
757 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
759 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
758 <a href="/rev/43c799df6e75?style=monoblue">
760 <a href="/rev/43c799df6e75?style=monoblue">
759 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
761 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
760 <a href="/file/43c799df6e75?style=monoblue">files</a>
762 <a href="/file/43c799df6e75?style=monoblue">files</a>
761 <a href="/shortlog/43c799df6e75?style=monoblue">(0)</a> <a href="/shortlog/tip?style=monoblue">tip</a>
763 <a href="/shortlog/43c799df6e75?style=monoblue">(0)</a> <a href="/shortlog/tip?style=monoblue">tip</a>
762
764
763 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=monoblue' | egrep $REVLINKS
765 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=monoblue' | egrep $REVLINKS
764 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
766 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
765 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
767 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
766 <li><a href="/archive/xyzzy.zip">zip</a></li>
768 <li><a href="/archive/xyzzy.zip">zip</a></li>
767 <h3 class="changelog"><a class="title" href="/rev/a7c1559b7bba?style=monoblue">second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
769 <h3 class="changelog"><a class="title" href="/rev/a7c1559b7bba?style=monoblue">second<span class="logtags"> <span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
768 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
770 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
769 <a href="/log/43c799df6e75?style=monoblue">(0)</a> <a href="/log/tip?style=monoblue">tip</a>
771 <a href="/log/43c799df6e75?style=monoblue">(0)</a> <a href="/log/tip?style=monoblue">tip</a>
770
772
771 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=monoblue' | egrep $REVLINKS
773 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=monoblue' | egrep $REVLINKS
772 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
774 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
773 <a href="/graph/xyzzy?revcount=30&style=monoblue">less</a>
775 <a href="/graph/xyzzy?revcount=30&style=monoblue">less</a>
774 <a href="/graph/xyzzy?revcount=120&style=monoblue">more</a>
776 <a href="/graph/xyzzy?revcount=120&style=monoblue">more</a>
775 | <a href="/graph/43c799df6e75?style=monoblue">(0)</a> <a href="/graph/tip?style=monoblue">tip</a>
777 | <a href="/graph/43c799df6e75?style=monoblue">(0)</a> <a href="/graph/tip?style=monoblue">tip</a>
776
778
777 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=monoblue' | egrep $REVLINKS
779 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=monoblue' | egrep $REVLINKS
778 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
780 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
779 <li><a href="/rev/xyzzy?style=monoblue">changeset</a></li>
781 <li><a href="/rev/xyzzy?style=monoblue">changeset</a></li>
780 <li><a href="/archive/xyzzy.zip">zip</a></li>
782 <li><a href="/archive/xyzzy.zip">zip</a></li>
781 <td><a href="/file/xyzzy/?style=monoblue">[up]</a></td>
783 <td><a href="/file/xyzzy/?style=monoblue">[up]</a></td>
782 <a href="/file/xyzzy/dir?style=monoblue">dir</a>
784 <a href="/file/xyzzy/dir?style=monoblue">dir</a>
783 <a href="/file/xyzzy/dir/?style=monoblue"></a>
785 <a href="/file/xyzzy/dir/?style=monoblue"></a>
784 <td><a href="/file/xyzzy/dir?style=monoblue">files</a></td>
786 <td><a href="/file/xyzzy/dir?style=monoblue">files</a></td>
785 <td><a href="/file/xyzzy/foo?style=monoblue">foo</a></td>
787 <td><a href="/file/xyzzy/foo?style=monoblue">foo</a></td>
786 <a href="/file/xyzzy/foo?style=monoblue">file</a> |
788 <a href="/file/xyzzy/foo?style=monoblue">file</a> |
787 <a href="/log/xyzzy/foo?style=monoblue">revisions</a> |
789 <a href="/log/xyzzy/foo?style=monoblue">revisions</a> |
788 <a href="/annotate/xyzzy/foo?style=monoblue">annotate</a>
790 <a href="/annotate/xyzzy/foo?style=monoblue">annotate</a>
789
791
790 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=monoblue' | egrep $REVLINKS
792 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=monoblue' | egrep $REVLINKS
791 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
793 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
792 <li><a href="/file/xyzzy/?style=monoblue">files</a></li>
794 <li><a href="/file/xyzzy/?style=monoblue">files</a></li>
793 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
795 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
794 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
796 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
795 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
797 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
796 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
798 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
797 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
799 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
798 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
800 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
799 <dd><a class="list" href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
801 <dd><a class="list" href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
800 <a href="/file/43c799df6e75/foo?style=monoblue">
802 <a href="/file/43c799df6e75/foo?style=monoblue">
801 <a href="/file/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a>
803 <a href="/file/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a>
802
804
803 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=monoblue' | egrep $REVLINKS
805 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=monoblue' | egrep $REVLINKS
804 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
806 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
805 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
807 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
806 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
808 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
807 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
809 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
808 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
810 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
809 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
811 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
810 <li><a href="/rss-log/tip/foo">rss</a></li>
812 <li><a href="/rss-log/tip/foo">rss</a></li>
811 <a href="/rev/a7c1559b7bba?style=monoblue">
813 <a href="/rev/a7c1559b7bba?style=monoblue">
812 <a href="/file/a7c1559b7bba/foo?style=monoblue">file</a> |
814 <a href="/file/a7c1559b7bba/foo?style=monoblue">file</a> |
813 <a href="/diff/a7c1559b7bba/foo?style=monoblue">diff</a> |
815 <a href="/diff/a7c1559b7bba/foo?style=monoblue">diff</a> |
814 <a href="/annotate/a7c1559b7bba/foo?style=monoblue">annotate</a>
816 <a href="/annotate/a7c1559b7bba/foo?style=monoblue">annotate</a>
815 <a href="/rev/43c799df6e75?style=monoblue">
817 <a href="/rev/43c799df6e75?style=monoblue">
816 <a href="/file/43c799df6e75/foo?style=monoblue">file</a> |
818 <a href="/file/43c799df6e75/foo?style=monoblue">file</a> |
817 <a href="/diff/43c799df6e75/foo?style=monoblue">diff</a> |
819 <a href="/diff/43c799df6e75/foo?style=monoblue">diff</a> |
818 <a href="/annotate/43c799df6e75/foo?style=monoblue">annotate</a>
820 <a href="/annotate/43c799df6e75/foo?style=monoblue">annotate</a>
819 <a href="/log/43c799df6e75/foo?style=monoblue">(0)</a> <a href="/log/tip/foo?style=monoblue">tip</a>
821 <a href="/log/43c799df6e75/foo?style=monoblue">(0)</a> <a href="/log/tip/foo?style=monoblue">tip</a>
820
822
821 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=monoblue' | egrep $REVLINKS
823 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=monoblue' | egrep $REVLINKS
822 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
824 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
823 <li><a href="/file/xyzzy/?style=monoblue">files</a></li>
825 <li><a href="/file/xyzzy/?style=monoblue">files</a></li>
824 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
826 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
825 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
827 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
826 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
828 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
827 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
829 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
828 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
830 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
829 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
831 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
830 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
832 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
831 <a href="/annotate/43c799df6e75/foo?style=monoblue">
833 <a href="/annotate/43c799df6e75/foo?style=monoblue">
832 <a href="/annotate/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a>
834 <a href="/annotate/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a>
833 <a href="/annotate/43c799df6e75/foo?style=monoblue#l1"
835 <a href="/annotate/43c799df6e75/foo?style=monoblue#l1"
834 <a href="/annotate/a7c1559b7bba/foo?style=monoblue#l2"
836 <a href="/annotate/a7c1559b7bba/foo?style=monoblue#l2"
835
837
836 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=monoblue' | egrep $REVLINKS
838 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=monoblue' | egrep $REVLINKS
837 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
839 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
838 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
840 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
839 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
841 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
840 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
842 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
841 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
843 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
842 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
844 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
843 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
845 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
844 <li><a href="/raw-diff/xyzzy/foo">raw</a></li>
846 <li><a href="/raw-diff/xyzzy/foo">raw</a></li>
845 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
847 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
846 <dd><a href="/diff/43c799df6e75/foo?style=monoblue">43c799df6e75</a></dd>
848 <dd><a href="/diff/43c799df6e75/foo?style=monoblue">43c799df6e75</a></dd>
847 <dd><a href="/diff/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a></dd>
849 <dd><a href="/diff/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a></dd>
848
850
849 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=monoblue' | egrep $REVLINKS
851 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=monoblue' | egrep $REVLINKS
850 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
852 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
851 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
853 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
852 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
854 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
853 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
855 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
854 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
856 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
855 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
857 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
856 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
858 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
857 <li><a href="/raw-diff/xyzzy/foo">raw</a></li>
859 <li><a href="/raw-diff/xyzzy/foo">raw</a></li>
858 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
860 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
859 <dd><a href="/comparison/43c799df6e75/foo?style=monoblue">43c799df6e75</a></dd>
861 <dd><a href="/comparison/43c799df6e75/foo?style=monoblue">43c799df6e75</a></dd>
860 <dd><a href="/comparison/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a></dd>
862 <dd><a href="/comparison/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a></dd>
861
863
862 (De)referencing symbolic revisions (spartan)
864 (De)referencing symbolic revisions (spartan)
863
865
864 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=spartan' | egrep $REVLINKS
866 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=spartan' | egrep $REVLINKS
865 <a href="/log/tip?style=spartan">changelog</a>
867 <a href="/log/tip?style=spartan">changelog</a>
866 <a href="/graph/tip?style=spartan">graph</a>
868 <a href="/graph/tip?style=spartan">graph</a>
867 <a href="/file/tip/?style=spartan">files</a>
869 <a href="/file/tip/?style=spartan">files</a>
868 <a href="/archive/tip.zip">zip</a>
870 <a href="/archive/tip.zip">zip</a>
869 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
871 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
870 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">third</a></td>
872 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">third</a></td>
871 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">second</a></td>
873 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">second</a></td>
872 <td class="node"><a href="/rev/43c799df6e75?style=spartan">first</a></td>
874 <td class="node"><a href="/rev/43c799df6e75?style=spartan">first</a></td>
873 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
875 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
874
876
875 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=spartan' | egrep $REVLINKS
877 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=spartan' | egrep $REVLINKS
876 <a href="/shortlog/tip?style=spartan">shortlog</a>
878 <a href="/shortlog/tip?style=spartan">shortlog</a>
877 <a href="/graph/tip?style=spartan">graph</a>
879 <a href="/graph/tip?style=spartan">graph</a>
878 <a href="/file/tip?style=spartan">files</a>
880 <a href="/file/tip?style=spartan">files</a>
879 <a href="/archive/tip.zip">zip</a>
881 <a href="/archive/tip.zip">zip</a>
880 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
882 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
881 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
883 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
882 <th class="files"><a href="/file/9d8c40cba617?style=spartan">files</a>:</th>
884 <th class="files"><a href="/file/9d8c40cba617?style=spartan">files</a>:</th>
883 <td class="files"><a href="/diff/9d8c40cba617/foo?style=spartan">foo</a> </td>
885 <td class="files"><a href="/diff/9d8c40cba617/foo?style=spartan">foo</a> </td>
884 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
886 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
885 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
887 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
886 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
888 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
887 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
889 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
888 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
890 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
889 <td class="files"><a href="/diff/43c799df6e75/dir/bar?style=spartan">dir/bar</a> <a href="/diff/43c799df6e75/foo?style=spartan">foo</a> </td>
891 <td class="files"><a href="/diff/43c799df6e75/dir/bar?style=spartan">dir/bar</a> <a href="/diff/43c799df6e75/foo?style=spartan">foo</a> </td>
890 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
892 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
891
893
892 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=spartan' | egrep $REVLINKS
894 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=spartan' | egrep $REVLINKS
893 <a href="/log/tip?style=spartan">changelog</a>
895 <a href="/log/tip?style=spartan">changelog</a>
894 <a href="/shortlog/tip?style=spartan">shortlog</a>
896 <a href="/shortlog/tip?style=spartan">shortlog</a>
895 <a href="/file/tip/?style=spartan">files</a>
897 <a href="/file/tip/?style=spartan">files</a>
896 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
898 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
897 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
899 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
898
900
899 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=spartan' | egrep $REVLINKS
901 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=spartan' | egrep $REVLINKS
900 <a href="/rev/9d8c40cba617?style=spartan">tip</a>
902 <a href="/rev/9d8c40cba617?style=spartan">tip</a>
901
903
902 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=spartan' | egrep $REVLINKS
904 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=spartan' | egrep $REVLINKS
903 <a href="/shortlog/9d8c40cba617?style=spartan" class="open">default</a>
905 <a href="/shortlog/9d8c40cba617?style=spartan" class="open">default</a>
904
906
905 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=spartan' | egrep $REVLINKS
907 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=spartan' | egrep $REVLINKS
906 <a href="/log/tip?style=spartan">changelog</a>
908 <a href="/log/tip?style=spartan">changelog</a>
907 <a href="/shortlog/tip?style=spartan">shortlog</a>
909 <a href="/shortlog/tip?style=spartan">shortlog</a>
908 <a href="/graph/tip?style=spartan">graph</a>
910 <a href="/graph/tip?style=spartan">graph</a>
909 <a href="/rev/tip?style=spartan">changeset</a>
911 <a href="/rev/tip?style=spartan">changeset</a>
910 <a href="/archive/tip.zip">zip</a>
912 <a href="/archive/tip.zip">zip</a>
911 <h2><a href="/">Mercurial</a> / files for changeset <a href="/rev/9d8c40cba617">9d8c40cba617</a>: /</h2>
913 <h2><a href="/">Mercurial</a> / files for changeset <a href="/rev/9d8c40cba617">9d8c40cba617</a>: /</h2>
912 <td><a href="/file/tip/?style=spartan">[up]</a>
914 <td><a href="/file/tip/?style=spartan">[up]</a>
913 <a href="/file/tip/dir?style=spartan">dir/</a>
915 <a href="/file/tip/dir?style=spartan">dir/</a>
914 <a href="/file/tip/dir/?style=spartan">
916 <a href="/file/tip/dir/?style=spartan">
915 <td><a href="/file/tip/foo?style=spartan">foo</a>
917 <td><a href="/file/tip/foo?style=spartan">foo</a>
916
918
917 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=spartan&rev=all()' | egrep $REVLINKS
919 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=spartan&rev=all()' | egrep $REVLINKS
918 <a href="/archive/tip.zip">zip</a>
920 <a href="/archive/tip.zip">zip</a>
919 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
921 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
920 <a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a>
922 <a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a>
921 <th class="files"><a href="/file/9d8c40cba617?style=spartan">files</a>:</th>
923 <th class="files"><a href="/file/9d8c40cba617?style=spartan">files</a>:</th>
922 <td class="files"><a href="/diff/9d8c40cba617/foo?style=spartan">foo</a> </td>
924 <td class="files"><a href="/diff/9d8c40cba617/foo?style=spartan">foo</a> </td>
923 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
925 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
924 <a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a>
926 <a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a>
925 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
927 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
926 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
928 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
927 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
929 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
928 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
930 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
929 <td class="child"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
931 <td class="child"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
930 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
932 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
931 <td class="files"><a href="/diff/43c799df6e75/dir/bar?style=spartan">dir/bar</a> <a href="/diff/43c799df6e75/foo?style=spartan">foo</a> </td>
933 <td class="files"><a href="/diff/43c799df6e75/dir/bar?style=spartan">dir/bar</a> <a href="/diff/43c799df6e75/foo?style=spartan">foo</a> </td>
932
934
933 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=spartan' | egrep $REVLINKS
935 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=spartan' | egrep $REVLINKS
934 <a href="/log/xyzzy?style=spartan">changelog</a>
936 <a href="/log/xyzzy?style=spartan">changelog</a>
935 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
937 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
936 <a href="/graph/xyzzy?style=spartan">graph</a>
938 <a href="/graph/xyzzy?style=spartan">graph</a>
937 <a href="/file/xyzzy?style=spartan">files</a>
939 <a href="/file/xyzzy?style=spartan">files</a>
938 <a href="/raw-rev/xyzzy">raw</a>
940 <a href="/raw-rev/xyzzy">raw</a>
939 <a href="/archive/xyzzy.zip">zip</a>
941 <a href="/archive/xyzzy.zip">zip</a>
940 <td class="changeset"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
942 <td class="changeset"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
941 <td class="parent"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
943 <td class="parent"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
942 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
944 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
943 <td class="files"><a href="/file/a7c1559b7bba/foo?style=spartan">foo</a> </td>
945 <td class="files"><a href="/file/a7c1559b7bba/foo?style=spartan">foo</a> </td>
944
946
945 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=spartan' | egrep $REVLINKS
947 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=spartan' | egrep $REVLINKS
946 <a href="/log/xyzzy?style=spartan">changelog</a>
948 <a href="/log/xyzzy?style=spartan">changelog</a>
947 <a href="/graph/xyzzy?style=spartan">graph</a>
949 <a href="/graph/xyzzy?style=spartan">graph</a>
948 <a href="/file/xyzzy/?style=spartan">files</a>
950 <a href="/file/xyzzy/?style=spartan">files</a>
949 <a href="/archive/xyzzy.zip">zip</a>
951 <a href="/archive/xyzzy.zip">zip</a>
950 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
952 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
951 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">second</a></td>
953 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">second</a></td>
952 <td class="node"><a href="/rev/43c799df6e75?style=spartan">first</a></td>
954 <td class="node"><a href="/rev/43c799df6e75?style=spartan">first</a></td>
953 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
955 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
954
956
955 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=spartan' | egrep $REVLINKS
957 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=spartan' | egrep $REVLINKS
956 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
958 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
957 <a href="/graph/xyzzy?style=spartan">graph</a>
959 <a href="/graph/xyzzy?style=spartan">graph</a>
958 <a href="/file/xyzzy?style=spartan">files</a>
960 <a href="/file/xyzzy?style=spartan">files</a>
959 <a href="/archive/xyzzy.zip">zip</a>
961 <a href="/archive/xyzzy.zip">zip</a>
960 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
962 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
961 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
963 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
962 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
964 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
963 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
965 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
964 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
966 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
965 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
967 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
966 <td class="files"><a href="/diff/43c799df6e75/dir/bar?style=spartan">dir/bar</a> <a href="/diff/43c799df6e75/foo?style=spartan">foo</a> </td>
968 <td class="files"><a href="/diff/43c799df6e75/dir/bar?style=spartan">dir/bar</a> <a href="/diff/43c799df6e75/foo?style=spartan">foo</a> </td>
967 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
969 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
968
970
969 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=spartan' | egrep $REVLINKS
971 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=spartan' | egrep $REVLINKS
970 <a href="/log/xyzzy?style=spartan">changelog</a>
972 <a href="/log/xyzzy?style=spartan">changelog</a>
971 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
973 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
972 <a href="/file/xyzzy/?style=spartan">files</a>
974 <a href="/file/xyzzy/?style=spartan">files</a>
973 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
975 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
974 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
976 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
975
977
976 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=spartan' | egrep $REVLINKS
978 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=spartan' | egrep $REVLINKS
977 <a href="/log/xyzzy?style=spartan">changelog</a>
979 <a href="/log/xyzzy?style=spartan">changelog</a>
978 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
980 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
979 <a href="/graph/xyzzy?style=spartan">graph</a>
981 <a href="/graph/xyzzy?style=spartan">graph</a>
980 <a href="/rev/xyzzy?style=spartan">changeset</a>
982 <a href="/rev/xyzzy?style=spartan">changeset</a>
981 <a href="/archive/xyzzy.zip">zip</a>
983 <a href="/archive/xyzzy.zip">zip</a>
982 <h2><a href="/">Mercurial</a> / files for changeset <a href="/rev/a7c1559b7bba">a7c1559b7bba</a>: /</h2>
984 <h2><a href="/">Mercurial</a> / files for changeset <a href="/rev/a7c1559b7bba">a7c1559b7bba</a>: /</h2>
983 <td><a href="/file/xyzzy/?style=spartan">[up]</a>
985 <td><a href="/file/xyzzy/?style=spartan">[up]</a>
984 <a href="/file/xyzzy/dir?style=spartan">dir/</a>
986 <a href="/file/xyzzy/dir?style=spartan">dir/</a>
985 <a href="/file/xyzzy/dir/?style=spartan">
987 <a href="/file/xyzzy/dir/?style=spartan">
986 <td><a href="/file/xyzzy/foo?style=spartan">foo</a>
988 <td><a href="/file/xyzzy/foo?style=spartan">foo</a>
987
989
988 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=spartan' | egrep $REVLINKS
990 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=spartan' | egrep $REVLINKS
989 <a href="/log/xyzzy?style=spartan">changelog</a>
991 <a href="/log/xyzzy?style=spartan">changelog</a>
990 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
992 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
991 <a href="/graph/xyzzy?style=spartan">graph</a>
993 <a href="/graph/xyzzy?style=spartan">graph</a>
992 <a href="/rev/xyzzy?style=spartan">changeset</a>
994 <a href="/rev/xyzzy?style=spartan">changeset</a>
993 <a href="/file/xyzzy/?style=spartan">files</a>
995 <a href="/file/xyzzy/?style=spartan">files</a>
994 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
996 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
995 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
997 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
996 <a href="/raw-file/xyzzy/foo">raw</a>
998 <a href="/raw-file/xyzzy/foo">raw</a>
997 <td><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
999 <td><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
998 <a href="/file/43c799df6e75/foo?style=spartan">
1000 <a href="/file/43c799df6e75/foo?style=spartan">
999 <td><a href="/file/9d8c40cba617/foo?style=spartan">9d8c40cba617</a></td>
1001 <td><a href="/file/9d8c40cba617/foo?style=spartan">9d8c40cba617</a></td>
1000
1002
1001 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=spartan' | egrep $REVLINKS
1003 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=spartan' | egrep $REVLINKS
1002 href="/atom-log/tip/foo" title="Atom feed for test:foo">
1004 href="/atom-log/tip/foo" title="Atom feed for test:foo">
1003 href="/rss-log/tip/foo" title="RSS feed for test:foo">
1005 href="/rss-log/tip/foo" title="RSS feed for test:foo">
1004 <a href="/file/xyzzy/foo?style=spartan">file</a>
1006 <a href="/file/xyzzy/foo?style=spartan">file</a>
1005 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
1007 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
1006 <a type="application/rss+xml" href="/rss-log/tip/foo">rss</a>
1008 <a type="application/rss+xml" href="/rss-log/tip/foo">rss</a>
1007 <a type="application/atom+xml" href="/atom-log/tip/foo" title="Atom feed for test:foo">atom</a>
1009 <a type="application/atom+xml" href="/atom-log/tip/foo" title="Atom feed for test:foo">atom</a>
1008 <p>navigate: <small class="navigate"><a href="/log/43c799df6e75/foo?style=spartan">(0)</a> <a href="/log/tip/foo?style=spartan">tip</a> </small></p>
1010 <p>navigate: <small class="navigate"><a href="/log/43c799df6e75/foo?style=spartan">(0)</a> <a href="/log/tip/foo?style=spartan">tip</a> </small></p>
1009 <th class="firstline"><a href="/rev/a7c1559b7bba?style=spartan">second</a></th>
1011 <th class="firstline"><a href="/rev/a7c1559b7bba?style=spartan">second</a></th>
1010 <a href="/file/a7c1559b7bba/foo?style=spartan">a7c1559b7bba</a>
1012 <a href="/file/a7c1559b7bba/foo?style=spartan">a7c1559b7bba</a>
1011 <a href="/diff/a7c1559b7bba/foo?style=spartan">(diff)</a>
1013 <a href="/diff/a7c1559b7bba/foo?style=spartan">(diff)</a>
1012 <a href="/annotate/a7c1559b7bba/foo?style=spartan">(annotate)</a>
1014 <a href="/annotate/a7c1559b7bba/foo?style=spartan">(annotate)</a>
1013 <th class="firstline"><a href="/rev/43c799df6e75?style=spartan">first</a></th>
1015 <th class="firstline"><a href="/rev/43c799df6e75?style=spartan">first</a></th>
1014 <a href="/file/43c799df6e75/foo?style=spartan">43c799df6e75</a>
1016 <a href="/file/43c799df6e75/foo?style=spartan">43c799df6e75</a>
1015 <a href="/diff/43c799df6e75/foo?style=spartan">(diff)</a>
1017 <a href="/diff/43c799df6e75/foo?style=spartan">(diff)</a>
1016 <a href="/annotate/43c799df6e75/foo?style=spartan">(annotate)</a>
1018 <a href="/annotate/43c799df6e75/foo?style=spartan">(annotate)</a>
1017
1019
1018 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=spartan' | egrep $REVLINKS
1020 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=spartan' | egrep $REVLINKS
1019 <a href="/log/xyzzy?style=spartan">changelog</a>
1021 <a href="/log/xyzzy?style=spartan">changelog</a>
1020 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
1022 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
1021 <a href="/graph/xyzzy?style=spartan">graph</a>
1023 <a href="/graph/xyzzy?style=spartan">graph</a>
1022 <a href="/rev/xyzzy?style=spartan">changeset</a>
1024 <a href="/rev/xyzzy?style=spartan">changeset</a>
1023 <a href="/file/xyzzy/?style=spartan">files</a>
1025 <a href="/file/xyzzy/?style=spartan">files</a>
1024 <a href="/file/xyzzy/foo?style=spartan">file</a>
1026 <a href="/file/xyzzy/foo?style=spartan">file</a>
1025 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
1027 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
1026 <a href="/raw-annotate/xyzzy/foo">raw</a>
1028 <a href="/raw-annotate/xyzzy/foo">raw</a>
1027 <td><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
1029 <td><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
1028 <a href="/annotate/43c799df6e75/foo?style=spartan">
1030 <a href="/annotate/43c799df6e75/foo?style=spartan">
1029 <td><a href="/annotate/9d8c40cba617/foo?style=spartan">9d8c40cba617</a></td>
1031 <td><a href="/annotate/9d8c40cba617/foo?style=spartan">9d8c40cba617</a></td>
1030 <a href="/annotate/43c799df6e75/foo?style=spartan#l1"
1032 <a href="/annotate/43c799df6e75/foo?style=spartan#l1"
1031 <a href="/annotate/a7c1559b7bba/foo?style=spartan#l2"
1033 <a href="/annotate/a7c1559b7bba/foo?style=spartan#l2"
1032
1034
1033 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=spartan' | egrep $REVLINKS
1035 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=spartan' | egrep $REVLINKS
1034 <a href="/log/xyzzy?style=spartan">changelog</a>
1036 <a href="/log/xyzzy?style=spartan">changelog</a>
1035 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
1037 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
1036 <a href="/graph/xyzzy?style=spartan">graph</a>
1038 <a href="/graph/xyzzy?style=spartan">graph</a>
1037 <a href="/rev/xyzzy?style=spartan">changeset</a>
1039 <a href="/rev/xyzzy?style=spartan">changeset</a>
1038 <a href="/file/xyzzy/foo?style=spartan">file</a>
1040 <a href="/file/xyzzy/foo?style=spartan">file</a>
1039 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
1041 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
1040 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
1042 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
1041 <a href="/raw-diff/xyzzy/foo">raw</a>
1043 <a href="/raw-diff/xyzzy/foo">raw</a>
1042 <td class="revision"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
1044 <td class="revision"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
1043 <td class="parent"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
1045 <td class="parent"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
1044 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
1046 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
1045
1047
1046 Done
1048 Done
1047
1049
1048 $ cat errors.log
1050 $ cat errors.log
1049 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1051 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1050 $ cd ..
1052 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now