##// 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 2 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 import cgi
11 11 import copy
12 12 import mimetypes
13 13 import os
14 14 import re
15 15
16 16 from ..i18n import _
17 17 from ..node import hex, short
18 18
19 19 from .common import (
20 20 ErrorResponse,
21 21 HTTP_FORBIDDEN,
22 22 HTTP_NOT_FOUND,
23 23 HTTP_OK,
24 24 get_contact,
25 25 paritygen,
26 26 staticfile,
27 27 )
28 28
29 29 from .. import (
30 30 archival,
31 31 encoding,
32 32 error,
33 33 graphmod,
34 34 patch,
35 35 revset,
36 36 scmutil,
37 37 templatefilters,
38 38 templater,
39 39 util,
40 40 )
41 41
42 42 from . import (
43 43 webutil,
44 44 )
45 45
46 46 __all__ = []
47 47 commands = {}
48 48
49 49 class webcommand(object):
50 50 """Decorator used to register a web command handler.
51 51
52 52 The decorator takes as its positional arguments the name/path the
53 53 command should be accessible under.
54 54
55 55 Usage:
56 56
57 57 @webcommand('mycommand')
58 58 def mycommand(web, req, tmpl):
59 59 pass
60 60 """
61 61
62 62 def __init__(self, name):
63 63 self.name = name
64 64
65 65 def __call__(self, func):
66 66 __all__.append(self.name)
67 67 commands[self.name] = func
68 68 return func
69 69
70 70 @webcommand('log')
71 71 def log(web, req, tmpl):
72 72 """
73 73 /log[/{revision}[/{path}]]
74 74 --------------------------
75 75
76 76 Show repository or file history.
77 77
78 78 For URLs of the form ``/log/{revision}``, a list of changesets starting at
79 79 the specified changeset identifier is shown. If ``{revision}`` is not
80 80 defined, the default is ``tip``. This form is equivalent to the
81 81 ``changelog`` handler.
82 82
83 83 For URLs of the form ``/log/{revision}/{file}``, the history for a specific
84 84 file will be shown. This form is equivalent to the ``filelog`` handler.
85 85 """
86 86
87 87 if 'file' in req.form and req.form['file'][0]:
88 88 return filelog(web, req, tmpl)
89 89 else:
90 90 return changelog(web, req, tmpl)
91 91
92 92 @webcommand('rawfile')
93 93 def rawfile(web, req, tmpl):
94 94 guessmime = web.configbool('web', 'guessmime', False)
95 95
96 96 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
97 97 if not path:
98 98 content = manifest(web, req, tmpl)
99 99 req.respond(HTTP_OK, web.ctype)
100 100 return content
101 101
102 102 try:
103 103 fctx = webutil.filectx(web.repo, req)
104 104 except error.LookupError as inst:
105 105 try:
106 106 content = manifest(web, req, tmpl)
107 107 req.respond(HTTP_OK, web.ctype)
108 108 return content
109 109 except ErrorResponse:
110 110 raise inst
111 111
112 112 path = fctx.path()
113 113 text = fctx.data()
114 114 mt = 'application/binary'
115 115 if guessmime:
116 116 mt = mimetypes.guess_type(path)[0]
117 117 if mt is None:
118 118 if util.binary(text):
119 119 mt = 'application/binary'
120 120 else:
121 121 mt = 'text/plain'
122 122 if mt.startswith('text/'):
123 123 mt += '; charset="%s"' % encoding.encoding
124 124
125 125 req.respond(HTTP_OK, mt, path, body=text)
126 126 return []
127 127
128 128 def _filerevision(web, req, tmpl, fctx):
129 129 f = fctx.path()
130 130 text = fctx.data()
131 131 parity = paritygen(web.stripecount)
132 132
133 133 if util.binary(text):
134 134 mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
135 135 text = '(binary:%s)' % mt
136 136
137 137 def lines():
138 138 for lineno, t in enumerate(text.splitlines(True)):
139 139 yield {"line": t,
140 140 "lineid": "l%d" % (lineno + 1),
141 141 "linenumber": "% 6d" % (lineno + 1),
142 142 "parity": parity.next()}
143 143
144 144 return tmpl("filerevision",
145 145 file=f,
146 146 path=webutil.up(f),
147 147 text=lines(),
148 148 rev=fctx.rev(),
149 149 symrev=webutil.symrevorshortnode(req, fctx),
150 150 node=fctx.hex(),
151 151 author=fctx.user(),
152 152 date=fctx.date(),
153 153 desc=fctx.description(),
154 154 extra=fctx.extra(),
155 155 branch=webutil.nodebranchnodefault(fctx),
156 156 parent=webutil.parents(fctx),
157 157 child=webutil.children(fctx),
158 158 rename=webutil.renamelink(fctx),
159 159 tags=webutil.nodetagsdict(web.repo, fctx.node()),
160 160 bookmarks=webutil.nodebookmarksdict(web.repo, fctx.node()),
161 161 permissions=fctx.manifest().flags(f))
162 162
163 163 @webcommand('file')
164 164 def file(web, req, tmpl):
165 165 """
166 166 /file/{revision}[/{path}]
167 167 -------------------------
168 168
169 169 Show information about a directory or file in the repository.
170 170
171 171 Info about the ``path`` given as a URL parameter will be rendered.
172 172
173 173 If ``path`` is a directory, information about the entries in that
174 174 directory will be rendered. This form is equivalent to the ``manifest``
175 175 handler.
176 176
177 177 If ``path`` is a file, information about that file will be shown via
178 178 the ``filerevision`` template.
179 179
180 180 If ``path`` is not defined, information about the root directory will
181 181 be rendered.
182 182 """
183 183 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
184 184 if not path:
185 185 return manifest(web, req, tmpl)
186 186 try:
187 187 return _filerevision(web, req, tmpl, webutil.filectx(web.repo, req))
188 188 except error.LookupError as inst:
189 189 try:
190 190 return manifest(web, req, tmpl)
191 191 except ErrorResponse:
192 192 raise inst
193 193
194 194 def _search(web, req, tmpl):
195 195 MODE_REVISION = 'rev'
196 196 MODE_KEYWORD = 'keyword'
197 197 MODE_REVSET = 'revset'
198 198
199 199 def revsearch(ctx):
200 200 yield ctx
201 201
202 202 def keywordsearch(query):
203 203 lower = encoding.lower
204 204 qw = lower(query).split()
205 205
206 206 def revgen():
207 207 cl = web.repo.changelog
208 208 for i in xrange(len(web.repo) - 1, 0, -100):
209 209 l = []
210 210 for j in cl.revs(max(0, i - 99), i):
211 211 ctx = web.repo[j]
212 212 l.append(ctx)
213 213 l.reverse()
214 214 for e in l:
215 215 yield e
216 216
217 217 for ctx in revgen():
218 218 miss = 0
219 219 for q in qw:
220 220 if not (q in lower(ctx.user()) or
221 221 q in lower(ctx.description()) or
222 222 q in lower(" ".join(ctx.files()))):
223 223 miss = 1
224 224 break
225 225 if miss:
226 226 continue
227 227
228 228 yield ctx
229 229
230 230 def revsetsearch(revs):
231 231 for r in revs:
232 232 yield web.repo[r]
233 233
234 234 searchfuncs = {
235 235 MODE_REVISION: (revsearch, 'exact revision search'),
236 236 MODE_KEYWORD: (keywordsearch, 'literal keyword search'),
237 237 MODE_REVSET: (revsetsearch, 'revset expression search'),
238 238 }
239 239
240 240 def getsearchmode(query):
241 241 try:
242 242 ctx = web.repo[query]
243 243 except (error.RepoError, error.LookupError):
244 244 # query is not an exact revision pointer, need to
245 245 # decide if it's a revset expression or keywords
246 246 pass
247 247 else:
248 248 return MODE_REVISION, ctx
249 249
250 250 revdef = 'reverse(%s)' % query
251 251 try:
252 252 tree = revset.parse(revdef)
253 253 except error.ParseError:
254 254 # can't parse to a revset tree
255 255 return MODE_KEYWORD, query
256 256
257 257 if revset.depth(tree) <= 2:
258 258 # no revset syntax used
259 259 return MODE_KEYWORD, query
260 260
261 261 if any((token, (value or '')[:3]) == ('string', 're:')
262 262 for token, value, pos in revset.tokenize(revdef)):
263 263 return MODE_KEYWORD, query
264 264
265 265 funcsused = revset.funcsused(tree)
266 266 if not funcsused.issubset(revset.safesymbols):
267 267 return MODE_KEYWORD, query
268 268
269 269 mfunc = revset.match(web.repo.ui, revdef)
270 270 try:
271 271 revs = mfunc(web.repo)
272 272 return MODE_REVSET, revs
273 273 # ParseError: wrongly placed tokens, wrongs arguments, etc
274 274 # RepoLookupError: no such revision, e.g. in 'revision:'
275 275 # Abort: bookmark/tag not exists
276 276 # LookupError: ambiguous identifier, e.g. in '(bc)' on a large repo
277 277 except (error.ParseError, error.RepoLookupError, error.Abort,
278 278 LookupError):
279 279 return MODE_KEYWORD, query
280 280
281 281 def changelist(**map):
282 282 count = 0
283 283
284 284 for ctx in searchfunc[0](funcarg):
285 285 count += 1
286 286 n = ctx.node()
287 287 showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
288 288 files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
289 289
290 290 yield tmpl('searchentry',
291 291 parity=parity.next(),
292 292 author=ctx.user(),
293 293 parent=lambda **x: webutil.parents(ctx),
294 294 child=lambda **x: webutil.children(ctx),
295 295 changelogtag=showtags,
296 296 desc=ctx.description(),
297 297 extra=ctx.extra(),
298 298 date=ctx.date(),
299 299 files=files,
300 300 rev=ctx.rev(),
301 301 node=hex(n),
302 302 tags=webutil.nodetagsdict(web.repo, n),
303 303 bookmarks=webutil.nodebookmarksdict(web.repo, n),
304 304 inbranch=webutil.nodeinbranch(web.repo, ctx),
305 305 branches=webutil.nodebranchdict(web.repo, ctx))
306 306
307 307 if count >= revcount:
308 308 break
309 309
310 310 query = req.form['rev'][0]
311 311 revcount = web.maxchanges
312 312 if 'revcount' in req.form:
313 313 try:
314 314 revcount = int(req.form.get('revcount', [revcount])[0])
315 315 revcount = max(revcount, 1)
316 316 tmpl.defaults['sessionvars']['revcount'] = revcount
317 317 except ValueError:
318 318 pass
319 319
320 320 lessvars = copy.copy(tmpl.defaults['sessionvars'])
321 321 lessvars['revcount'] = max(revcount / 2, 1)
322 322 lessvars['rev'] = query
323 323 morevars = copy.copy(tmpl.defaults['sessionvars'])
324 324 morevars['revcount'] = revcount * 2
325 325 morevars['rev'] = query
326 326
327 327 mode, funcarg = getsearchmode(query)
328 328
329 329 if 'forcekw' in req.form:
330 330 showforcekw = ''
331 331 showunforcekw = searchfuncs[mode][1]
332 332 mode = MODE_KEYWORD
333 333 funcarg = query
334 334 else:
335 335 if mode != MODE_KEYWORD:
336 336 showforcekw = searchfuncs[MODE_KEYWORD][1]
337 337 else:
338 338 showforcekw = ''
339 339 showunforcekw = ''
340 340
341 341 searchfunc = searchfuncs[mode]
342 342
343 343 tip = web.repo['tip']
344 344 parity = paritygen(web.stripecount)
345 345
346 346 return tmpl('search', query=query, node=tip.hex(), symrev='tip',
347 347 entries=changelist, archives=web.archivelist("tip"),
348 348 morevars=morevars, lessvars=lessvars,
349 349 modedesc=searchfunc[1],
350 350 showforcekw=showforcekw, showunforcekw=showunforcekw)
351 351
352 352 @webcommand('changelog')
353 353 def changelog(web, req, tmpl, shortlog=False):
354 354 """
355 355 /changelog[/{revision}]
356 356 -----------------------
357 357
358 358 Show information about multiple changesets.
359 359
360 360 If the optional ``revision`` URL argument is absent, information about
361 361 all changesets starting at ``tip`` will be rendered. If the ``revision``
362 362 argument is present, changesets will be shown starting from the specified
363 363 revision.
364 364
365 365 If ``revision`` is absent, the ``rev`` query string argument may be
366 366 defined. This will perform a search for changesets.
367 367
368 368 The argument for ``rev`` can be a single revision, a revision set,
369 369 or a literal keyword to search for in changeset data (equivalent to
370 370 :hg:`log -k`).
371 371
372 372 The ``revcount`` query string argument defines the maximum numbers of
373 373 changesets to render.
374 374
375 375 For non-searches, the ``changelog`` template will be rendered.
376 376 """
377 377
378 378 query = ''
379 379 if 'node' in req.form:
380 380 ctx = webutil.changectx(web.repo, req)
381 381 symrev = webutil.symrevorshortnode(req, ctx)
382 382 elif 'rev' in req.form:
383 383 return _search(web, req, tmpl)
384 384 else:
385 385 ctx = web.repo['tip']
386 386 symrev = 'tip'
387 387
388 388 def changelist():
389 389 revs = []
390 390 if pos != -1:
391 391 revs = web.repo.changelog.revs(pos, 0)
392 392 curcount = 0
393 393 for rev in revs:
394 394 curcount += 1
395 395 if curcount > revcount + 1:
396 396 break
397 397
398 398 entry = webutil.changelistentry(web, web.repo[rev], tmpl)
399 399 entry['parity'] = parity.next()
400 400 yield entry
401 401
402 402 if shortlog:
403 403 revcount = web.maxshortchanges
404 404 else:
405 405 revcount = web.maxchanges
406 406
407 407 if 'revcount' in req.form:
408 408 try:
409 409 revcount = int(req.form.get('revcount', [revcount])[0])
410 410 revcount = max(revcount, 1)
411 411 tmpl.defaults['sessionvars']['revcount'] = revcount
412 412 except ValueError:
413 413 pass
414 414
415 415 lessvars = copy.copy(tmpl.defaults['sessionvars'])
416 416 lessvars['revcount'] = max(revcount / 2, 1)
417 417 morevars = copy.copy(tmpl.defaults['sessionvars'])
418 418 morevars['revcount'] = revcount * 2
419 419
420 420 count = len(web.repo)
421 421 pos = ctx.rev()
422 422 parity = paritygen(web.stripecount)
423 423
424 424 changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
425 425
426 426 entries = list(changelist())
427 427 latestentry = entries[:1]
428 428 if len(entries) > revcount:
429 429 nextentry = entries[-1:]
430 430 entries = entries[:-1]
431 431 else:
432 432 nextentry = []
433 433
434 434 return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
435 435 node=ctx.hex(), rev=pos, symrev=symrev, changesets=count,
436 436 entries=entries,
437 437 latestentry=latestentry, nextentry=nextentry,
438 438 archives=web.archivelist("tip"), revcount=revcount,
439 439 morevars=morevars, lessvars=lessvars, query=query)
440 440
441 441 @webcommand('shortlog')
442 442 def shortlog(web, req, tmpl):
443 443 """
444 444 /shortlog
445 445 ---------
446 446
447 447 Show basic information about a set of changesets.
448 448
449 449 This accepts the same parameters as the ``changelog`` handler. The only
450 450 difference is the ``shortlog`` template will be rendered instead of the
451 451 ``changelog`` template.
452 452 """
453 453 return changelog(web, req, tmpl, shortlog=True)
454 454
455 455 @webcommand('changeset')
456 456 def changeset(web, req, tmpl):
457 457 """
458 458 /changeset[/{revision}]
459 459 -----------------------
460 460
461 461 Show information about a single changeset.
462 462
463 463 A URL path argument is the changeset identifier to show. See ``hg help
464 464 revisions`` for possible values. If not defined, the ``tip`` changeset
465 465 will be shown.
466 466
467 467 The ``changeset`` template is rendered. Contents of the ``changesettag``,
468 468 ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many
469 469 templates related to diffs may all be used to produce the output.
470 470 """
471 471 ctx = webutil.changectx(web.repo, req)
472 472
473 473 return tmpl('changeset', **webutil.changesetentry(web, req, tmpl, ctx))
474 474
475 475 rev = webcommand('rev')(changeset)
476 476
477 477 def decodepath(path):
478 478 """Hook for mapping a path in the repository to a path in the
479 479 working copy.
480 480
481 481 Extensions (e.g., largefiles) can override this to remap files in
482 482 the virtual file system presented by the manifest command below."""
483 483 return path
484 484
485 485 @webcommand('manifest')
486 486 def manifest(web, req, tmpl):
487 487 """
488 488 /manifest[/{revision}[/{path}]]
489 489 -------------------------------
490 490
491 491 Show information about a directory.
492 492
493 493 If the URL path arguments are omitted, information about the root
494 494 directory for the ``tip`` changeset will be shown.
495 495
496 496 Because this handler can only show information for directories, it
497 497 is recommended to use the ``file`` handler instead, as it can handle both
498 498 directories and files.
499 499
500 500 The ``manifest`` template will be rendered for this handler.
501 501 """
502 502 if 'node' in req.form:
503 503 ctx = webutil.changectx(web.repo, req)
504 504 symrev = webutil.symrevorshortnode(req, ctx)
505 505 else:
506 506 ctx = web.repo['tip']
507 507 symrev = 'tip'
508 508 path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
509 509 mf = ctx.manifest()
510 510 node = ctx.node()
511 511
512 512 files = {}
513 513 dirs = {}
514 514 parity = paritygen(web.stripecount)
515 515
516 516 if path and path[-1] != "/":
517 517 path += "/"
518 518 l = len(path)
519 519 abspath = "/" + path
520 520
521 521 for full, n in mf.iteritems():
522 522 # the virtual path (working copy path) used for the full
523 523 # (repository) path
524 524 f = decodepath(full)
525 525
526 526 if f[:l] != path:
527 527 continue
528 528 remain = f[l:]
529 529 elements = remain.split('/')
530 530 if len(elements) == 1:
531 531 files[remain] = full
532 532 else:
533 533 h = dirs # need to retain ref to dirs (root)
534 534 for elem in elements[0:-1]:
535 535 if elem not in h:
536 536 h[elem] = {}
537 537 h = h[elem]
538 538 if len(h) > 1:
539 539 break
540 540 h[None] = None # denotes files present
541 541
542 542 if mf and not files and not dirs:
543 543 raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
544 544
545 545 def filelist(**map):
546 546 for f in sorted(files):
547 547 full = files[f]
548 548
549 549 fctx = ctx.filectx(full)
550 550 yield {"file": full,
551 551 "parity": parity.next(),
552 552 "basename": f,
553 553 "date": fctx.date(),
554 554 "size": fctx.size(),
555 555 "permissions": mf.flags(full)}
556 556
557 557 def dirlist(**map):
558 558 for d in sorted(dirs):
559 559
560 560 emptydirs = []
561 561 h = dirs[d]
562 562 while isinstance(h, dict) and len(h) == 1:
563 563 k, v = h.items()[0]
564 564 if v:
565 565 emptydirs.append(k)
566 566 h = v
567 567
568 568 path = "%s%s" % (abspath, d)
569 569 yield {"parity": parity.next(),
570 570 "path": path,
571 571 "emptydirs": "/".join(emptydirs),
572 572 "basename": d}
573 573
574 574 return tmpl("manifest",
575 575 rev=ctx.rev(),
576 576 symrev=symrev,
577 577 node=hex(node),
578 578 path=abspath,
579 579 up=webutil.up(abspath),
580 580 upparity=parity.next(),
581 581 fentries=filelist,
582 582 dentries=dirlist,
583 583 archives=web.archivelist(hex(node)),
584 584 tags=webutil.nodetagsdict(web.repo, node),
585 585 bookmarks=webutil.nodebookmarksdict(web.repo, node),
586 586 branch=webutil.nodebranchnodefault(ctx),
587 587 inbranch=webutil.nodeinbranch(web.repo, ctx),
588 588 branches=webutil.nodebranchdict(web.repo, ctx))
589 589
590 590 @webcommand('tags')
591 591 def tags(web, req, tmpl):
592 592 """
593 593 /tags
594 594 -----
595 595
596 596 Show information about tags.
597 597
598 598 No arguments are accepted.
599 599
600 600 The ``tags`` template is rendered.
601 601 """
602 602 i = list(reversed(web.repo.tagslist()))
603 603 parity = paritygen(web.stripecount)
604 604
605 605 def entries(notip, latestonly, **map):
606 606 t = i
607 607 if notip:
608 608 t = [(k, n) for k, n in i if k != "tip"]
609 609 if latestonly:
610 610 t = t[:1]
611 611 for k, n in t:
612 612 yield {"parity": parity.next(),
613 613 "tag": k,
614 614 "date": web.repo[n].date(),
615 615 "node": hex(n)}
616 616
617 617 return tmpl("tags",
618 618 node=hex(web.repo.changelog.tip()),
619 619 entries=lambda **x: entries(False, False, **x),
620 620 entriesnotip=lambda **x: entries(True, False, **x),
621 621 latestentry=lambda **x: entries(True, True, **x))
622 622
623 623 @webcommand('bookmarks')
624 624 def bookmarks(web, req, tmpl):
625 625 """
626 626 /bookmarks
627 627 ----------
628 628
629 629 Show information about bookmarks.
630 630
631 631 No arguments are accepted.
632 632
633 633 The ``bookmarks`` template is rendered.
634 634 """
635 635 i = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
636 636 parity = paritygen(web.stripecount)
637 637
638 638 def entries(latestonly, **map):
639 639 if latestonly:
640 640 t = [min(i)]
641 641 else:
642 642 t = sorted(i)
643 643 for k, n in t:
644 644 yield {"parity": parity.next(),
645 645 "bookmark": k,
646 646 "date": web.repo[n].date(),
647 647 "node": hex(n)}
648 648
649 649 return tmpl("bookmarks",
650 650 node=hex(web.repo.changelog.tip()),
651 651 entries=lambda **x: entries(latestonly=False, **x),
652 652 latestentry=lambda **x: entries(latestonly=True, **x))
653 653
654 654 @webcommand('branches')
655 655 def branches(web, req, tmpl):
656 656 """
657 657 /branches
658 658 ---------
659 659
660 660 Show information about branches.
661 661
662 662 All known branches are contained in the output, even closed branches.
663 663
664 664 No arguments are accepted.
665 665
666 666 The ``branches`` template is rendered.
667 667 """
668 668 entries = webutil.branchentries(web.repo, web.stripecount)
669 669 latestentry = webutil.branchentries(web.repo, web.stripecount, 1)
670 670 return tmpl('branches', node=hex(web.repo.changelog.tip()),
671 671 entries=entries, latestentry=latestentry)
672 672
673 673 @webcommand('summary')
674 674 def summary(web, req, tmpl):
675 675 """
676 676 /summary
677 677 --------
678 678
679 679 Show a summary of repository state.
680 680
681 681 Information about the latest changesets, bookmarks, tags, and branches
682 682 is captured by this handler.
683 683
684 684 The ``summary`` template is rendered.
685 685 """
686 686 i = reversed(web.repo.tagslist())
687 687
688 688 def tagentries(**map):
689 689 parity = paritygen(web.stripecount)
690 690 count = 0
691 691 for k, n in i:
692 692 if k == "tip": # skip tip
693 693 continue
694 694
695 695 count += 1
696 696 if count > 10: # limit to 10 tags
697 697 break
698 698
699 699 yield tmpl("tagentry",
700 700 parity=parity.next(),
701 701 tag=k,
702 702 node=hex(n),
703 703 date=web.repo[n].date())
704 704
705 705 def bookmarks(**map):
706 706 parity = paritygen(web.stripecount)
707 707 marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
708 708 for k, n in sorted(marks)[:10]: # limit to 10 bookmarks
709 709 yield {'parity': parity.next(),
710 710 'bookmark': k,
711 711 'date': web.repo[n].date(),
712 712 'node': hex(n)}
713 713
714 714 def changelist(**map):
715 715 parity = paritygen(web.stripecount, offset=start - end)
716 716 l = [] # build a list in forward order for efficiency
717 717 revs = []
718 718 if start < end:
719 719 revs = web.repo.changelog.revs(start, end - 1)
720 720 for i in revs:
721 721 ctx = web.repo[i]
722 722 n = ctx.node()
723 723 hn = hex(n)
724 724
725 725 l.append(tmpl(
726 726 'shortlogentry',
727 727 parity=parity.next(),
728 728 author=ctx.user(),
729 729 desc=ctx.description(),
730 730 extra=ctx.extra(),
731 731 date=ctx.date(),
732 732 rev=i,
733 733 node=hn,
734 734 tags=webutil.nodetagsdict(web.repo, n),
735 735 bookmarks=webutil.nodebookmarksdict(web.repo, n),
736 736 inbranch=webutil.nodeinbranch(web.repo, ctx),
737 737 branches=webutil.nodebranchdict(web.repo, ctx)))
738 738
739 739 l.reverse()
740 740 yield l
741 741
742 742 tip = web.repo['tip']
743 743 count = len(web.repo)
744 744 start = max(0, count - web.maxchanges)
745 745 end = min(count, start + web.maxchanges)
746 746
747 747 return tmpl("summary",
748 748 desc=web.config("web", "description", "unknown"),
749 749 owner=get_contact(web.config) or "unknown",
750 750 lastchange=tip.date(),
751 751 tags=tagentries,
752 752 bookmarks=bookmarks,
753 753 branches=webutil.branchentries(web.repo, web.stripecount, 10),
754 754 shortlog=changelist,
755 755 node=tip.hex(),
756 756 symrev='tip',
757 757 archives=web.archivelist("tip"))
758 758
759 759 @webcommand('filediff')
760 760 def filediff(web, req, tmpl):
761 761 """
762 762 /diff/{revision}/{path}
763 763 -----------------------
764 764
765 765 Show how a file changed in a particular commit.
766 766
767 767 The ``filediff`` template is rendered.
768 768
769 769 This handler is registered under both the ``/diff`` and ``/filediff``
770 770 paths. ``/diff`` is used in modern code.
771 771 """
772 772 fctx, ctx = None, None
773 773 try:
774 774 fctx = webutil.filectx(web.repo, req)
775 775 except LookupError:
776 776 ctx = webutil.changectx(web.repo, req)
777 777 path = webutil.cleanpath(web.repo, req.form['file'][0])
778 778 if path not in ctx.files():
779 779 raise
780 780
781 781 if fctx is not None:
782 782 n = fctx.node()
783 783 path = fctx.path()
784 784 ctx = fctx.changectx()
785 785 else:
786 786 n = ctx.node()
787 787 # path already defined in except clause
788 788
789 789 parity = paritygen(web.stripecount)
790 790 style = web.config('web', 'style', 'paper')
791 791 if 'style' in req.form:
792 792 style = req.form['style'][0]
793 793
794 794 diffs = webutil.diffs(web.repo, tmpl, ctx, None, [path], parity, style)
795 795 if fctx:
796 796 rename = webutil.renamelink(fctx)
797 797 ctx = fctx
798 798 else:
799 799 rename = []
800 800 ctx = ctx
801 801 return tmpl("filediff",
802 802 file=path,
803 803 node=hex(n),
804 804 rev=ctx.rev(),
805 805 symrev=webutil.symrevorshortnode(req, ctx),
806 806 date=ctx.date(),
807 807 desc=ctx.description(),
808 808 extra=ctx.extra(),
809 809 author=ctx.user(),
810 810 rename=rename,
811 811 branch=webutil.nodebranchnodefault(ctx),
812 812 parent=webutil.parents(ctx),
813 813 child=webutil.children(ctx),
814 814 tags=webutil.nodetagsdict(web.repo, n),
815 815 bookmarks=webutil.nodebookmarksdict(web.repo, n),
816 816 diff=diffs)
817 817
818 818 diff = webcommand('diff')(filediff)
819 819
820 820 @webcommand('comparison')
821 821 def comparison(web, req, tmpl):
822 822 """
823 823 /comparison/{revision}/{path}
824 824 -----------------------------
825 825
826 826 Show a comparison between the old and new versions of a file from changes
827 827 made on a particular revision.
828 828
829 829 This is similar to the ``diff`` handler. However, this form features
830 830 a split or side-by-side diff rather than a unified diff.
831 831
832 832 The ``context`` query string argument can be used to control the lines of
833 833 context in the diff.
834 834
835 835 The ``filecomparison`` template is rendered.
836 836 """
837 837 ctx = webutil.changectx(web.repo, req)
838 838 if 'file' not in req.form:
839 839 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
840 840 path = webutil.cleanpath(web.repo, req.form['file'][0])
841 841 rename = path in ctx and webutil.renamelink(ctx[path]) or []
842 842
843 843 parsecontext = lambda v: v == 'full' and -1 or int(v)
844 844 if 'context' in req.form:
845 845 context = parsecontext(req.form['context'][0])
846 846 else:
847 847 context = parsecontext(web.config('web', 'comparisoncontext', '5'))
848 848
849 849 def filelines(f):
850 850 if util.binary(f.data()):
851 851 mt = mimetypes.guess_type(f.path())[0]
852 852 if not mt:
853 853 mt = 'application/octet-stream'
854 854 return [_('(binary file %s, hash: %s)') % (mt, hex(f.filenode()))]
855 855 return f.data().splitlines()
856 856
857 857 parent = ctx.p1()
858 858 leftrev = parent.rev()
859 859 leftnode = parent.node()
860 860 rightrev = ctx.rev()
861 861 rightnode = ctx.node()
862 862 if path in ctx:
863 863 fctx = ctx[path]
864 864 rightlines = filelines(fctx)
865 865 if path not in parent:
866 866 leftlines = ()
867 867 else:
868 868 pfctx = parent[path]
869 869 leftlines = filelines(pfctx)
870 870 else:
871 871 rightlines = ()
872 872 fctx = ctx.parents()[0][path]
873 873 leftlines = filelines(fctx)
874 874
875 875 comparison = webutil.compare(tmpl, context, leftlines, rightlines)
876 876 return tmpl('filecomparison',
877 877 file=path,
878 878 node=hex(ctx.node()),
879 879 rev=ctx.rev(),
880 880 symrev=webutil.symrevorshortnode(req, ctx),
881 881 date=ctx.date(),
882 882 desc=ctx.description(),
883 883 extra=ctx.extra(),
884 884 author=ctx.user(),
885 885 rename=rename,
886 886 branch=webutil.nodebranchnodefault(ctx),
887 887 parent=webutil.parents(fctx),
888 888 child=webutil.children(fctx),
889 889 tags=webutil.nodetagsdict(web.repo, ctx.node()),
890 890 bookmarks=webutil.nodebookmarksdict(web.repo, ctx.node()),
891 891 leftrev=leftrev,
892 892 leftnode=hex(leftnode),
893 893 rightrev=rightrev,
894 894 rightnode=hex(rightnode),
895 895 comparison=comparison)
896 896
897 897 @webcommand('annotate')
898 898 def annotate(web, req, tmpl):
899 899 """
900 900 /annotate/{revision}/{path}
901 901 ---------------------------
902 902
903 903 Show changeset information for each line in a file.
904 904
905 905 The ``fileannotate`` template is rendered.
906 906 """
907 907 fctx = webutil.filectx(web.repo, req)
908 908 f = fctx.path()
909 909 parity = paritygen(web.stripecount)
910 910 diffopts = patch.difffeatureopts(web.repo.ui, untrusted=True,
911 911 section='annotate', whitespace=True)
912 912
913 913 def annotate(**map):
914 914 last = None
915 915 if util.binary(fctx.data()):
916 916 mt = (mimetypes.guess_type(fctx.path())[0]
917 917 or 'application/octet-stream')
918 918 lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
919 919 '(binary:%s)' % mt)])
920 920 else:
921 921 lines = enumerate(fctx.annotate(follow=True, linenumber=True,
922 922 diffopts=diffopts))
923 923 for lineno, ((f, targetline), l) in lines:
924 924 fnode = f.filenode()
925 925
926 926 if last != fnode:
927 927 last = fnode
928 928
929 929 yield {"parity": parity.next(),
930 930 "node": f.hex(),
931 931 "rev": f.rev(),
932 932 "author": f.user(),
933 933 "desc": f.description(),
934 934 "extra": f.extra(),
935 935 "file": f.path(),
936 936 "targetline": targetline,
937 937 "line": l,
938 938 "lineno": lineno + 1,
939 939 "lineid": "l%d" % (lineno + 1),
940 940 "linenumber": "% 6d" % (lineno + 1),
941 941 "revdate": f.date()}
942 942
943 943 return tmpl("fileannotate",
944 944 file=f,
945 945 annotate=annotate,
946 946 path=webutil.up(f),
947 947 rev=fctx.rev(),
948 948 symrev=webutil.symrevorshortnode(req, fctx),
949 949 node=fctx.hex(),
950 950 author=fctx.user(),
951 951 date=fctx.date(),
952 952 desc=fctx.description(),
953 953 extra=fctx.extra(),
954 954 rename=webutil.renamelink(fctx),
955 955 branch=webutil.nodebranchnodefault(fctx),
956 956 parent=webutil.parents(fctx),
957 957 child=webutil.children(fctx),
958 958 tags=webutil.nodetagsdict(web.repo, fctx.node()),
959 959 bookmarks=webutil.nodebookmarksdict(web.repo, fctx.node()),
960 960 permissions=fctx.manifest().flags(f))
961 961
962 962 @webcommand('filelog')
963 963 def filelog(web, req, tmpl):
964 964 """
965 965 /filelog/{revision}/{path}
966 966 --------------------------
967 967
968 968 Show information about the history of a file in the repository.
969 969
970 970 The ``revcount`` query string argument can be defined to control the
971 971 maximum number of entries to show.
972 972
973 973 The ``filelog`` template will be rendered.
974 974 """
975 975
976 976 try:
977 977 fctx = webutil.filectx(web.repo, req)
978 978 f = fctx.path()
979 979 fl = fctx.filelog()
980 980 except error.LookupError:
981 981 f = webutil.cleanpath(web.repo, req.form['file'][0])
982 982 fl = web.repo.file(f)
983 983 numrevs = len(fl)
984 984 if not numrevs: # file doesn't exist at all
985 985 raise
986 986 rev = webutil.changectx(web.repo, req).rev()
987 987 first = fl.linkrev(0)
988 988 if rev < first: # current rev is from before file existed
989 989 raise
990 990 frev = numrevs - 1
991 991 while fl.linkrev(frev) > rev:
992 992 frev -= 1
993 993 fctx = web.repo.filectx(f, fl.linkrev(frev))
994 994
995 995 revcount = web.maxshortchanges
996 996 if 'revcount' in req.form:
997 997 try:
998 998 revcount = int(req.form.get('revcount', [revcount])[0])
999 999 revcount = max(revcount, 1)
1000 1000 tmpl.defaults['sessionvars']['revcount'] = revcount
1001 1001 except ValueError:
1002 1002 pass
1003 1003
1004 1004 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1005 1005 lessvars['revcount'] = max(revcount / 2, 1)
1006 1006 morevars = copy.copy(tmpl.defaults['sessionvars'])
1007 1007 morevars['revcount'] = revcount * 2
1008 1008
1009 1009 count = fctx.filerev() + 1
1010 1010 start = max(0, fctx.filerev() - revcount + 1) # first rev on this page
1011 1011 end = min(count, start + revcount) # last rev on this page
1012 1012 parity = paritygen(web.stripecount, offset=start - end)
1013 1013
1014 1014 def entries():
1015 1015 l = []
1016 1016
1017 1017 repo = web.repo
1018 1018 revs = fctx.filelog().revs(start, end - 1)
1019 1019 for i in revs:
1020 1020 iterfctx = fctx.filectx(i)
1021 1021
1022 1022 l.append({"parity": parity.next(),
1023 1023 "filerev": i,
1024 1024 "file": f,
1025 1025 "node": iterfctx.hex(),
1026 1026 "author": iterfctx.user(),
1027 1027 "date": iterfctx.date(),
1028 1028 "rename": webutil.renamelink(iterfctx),
1029 1029 "parent": lambda **x: webutil.parents(iterfctx),
1030 1030 "child": lambda **x: webutil.children(iterfctx),
1031 1031 "desc": iterfctx.description(),
1032 1032 "extra": iterfctx.extra(),
1033 1033 "tags": webutil.nodetagsdict(repo, iterfctx.node()),
1034 1034 "bookmarks": webutil.nodebookmarksdict(
1035 1035 repo, iterfctx.node()),
1036 1036 "branch": webutil.nodebranchnodefault(iterfctx),
1037 1037 "inbranch": webutil.nodeinbranch(repo, iterfctx),
1038 1038 "branches": webutil.nodebranchdict(repo, iterfctx)})
1039 1039 for e in reversed(l):
1040 1040 yield e
1041 1041
1042 1042 entries = list(entries())
1043 1043 latestentry = entries[:1]
1044 1044
1045 1045 revnav = webutil.filerevnav(web.repo, fctx.path())
1046 1046 nav = revnav.gen(end - 1, revcount, count)
1047 1047 return tmpl("filelog", file=f, node=fctx.hex(), nav=nav,
1048 rev=fctx.rev(),
1048 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 1053 entries=entries,
1050 1054 latestentry=latestentry,
1051 1055 revcount=revcount, morevars=morevars, lessvars=lessvars)
1052 1056
1053 1057 @webcommand('archive')
1054 1058 def archive(web, req, tmpl):
1055 1059 """
1056 1060 /archive/{revision}.{format}[/{path}]
1057 1061 -------------------------------------
1058 1062
1059 1063 Obtain an archive of repository content.
1060 1064
1061 1065 The content and type of the archive is defined by a URL path parameter.
1062 1066 ``format`` is the file extension of the archive type to be generated. e.g.
1063 1067 ``zip`` or ``tar.bz2``. Not all archive types may be allowed by your
1064 1068 server configuration.
1065 1069
1066 1070 The optional ``path`` URL parameter controls content to include in the
1067 1071 archive. If omitted, every file in the specified revision is present in the
1068 1072 archive. If included, only the specified file or contents of the specified
1069 1073 directory will be included in the archive.
1070 1074
1071 1075 No template is used for this handler. Raw, binary content is generated.
1072 1076 """
1073 1077
1074 1078 type_ = req.form.get('type', [None])[0]
1075 1079 allowed = web.configlist("web", "allow_archive")
1076 1080 key = req.form['node'][0]
1077 1081
1078 1082 if type_ not in web.archives:
1079 1083 msg = 'Unsupported archive type: %s' % type_
1080 1084 raise ErrorResponse(HTTP_NOT_FOUND, msg)
1081 1085
1082 1086 if not ((type_ in allowed or
1083 1087 web.configbool("web", "allow" + type_, False))):
1084 1088 msg = 'Archive type not allowed: %s' % type_
1085 1089 raise ErrorResponse(HTTP_FORBIDDEN, msg)
1086 1090
1087 1091 reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
1088 1092 cnode = web.repo.lookup(key)
1089 1093 arch_version = key
1090 1094 if cnode == key or key == 'tip':
1091 1095 arch_version = short(cnode)
1092 1096 name = "%s-%s" % (reponame, arch_version)
1093 1097
1094 1098 ctx = webutil.changectx(web.repo, req)
1095 1099 pats = []
1096 1100 matchfn = scmutil.match(ctx, [])
1097 1101 file = req.form.get('file', None)
1098 1102 if file:
1099 1103 pats = ['path:' + file[0]]
1100 1104 matchfn = scmutil.match(ctx, pats, default='path')
1101 1105 if pats:
1102 1106 files = [f for f in ctx.manifest().keys() if matchfn(f)]
1103 1107 if not files:
1104 1108 raise ErrorResponse(HTTP_NOT_FOUND,
1105 1109 'file(s) not found: %s' % file[0])
1106 1110
1107 1111 mimetype, artype, extension, encoding = web.archivespecs[type_]
1108 1112 headers = [
1109 1113 ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
1110 1114 ]
1111 1115 if encoding:
1112 1116 headers.append(('Content-Encoding', encoding))
1113 1117 req.headers.extend(headers)
1114 1118 req.respond(HTTP_OK, mimetype)
1115 1119
1116 1120 archival.archive(web.repo, req, cnode, artype, prefix=name,
1117 1121 matchfn=matchfn,
1118 1122 subrepos=web.configbool("web", "archivesubrepos"))
1119 1123 return []
1120 1124
1121 1125
1122 1126 @webcommand('static')
1123 1127 def static(web, req, tmpl):
1124 1128 fname = req.form['file'][0]
1125 1129 # a repo owner may set web.static in .hg/hgrc to get any file
1126 1130 # readable by the user running the CGI script
1127 1131 static = web.config("web", "static", None, untrusted=False)
1128 1132 if not static:
1129 1133 tp = web.templatepath or templater.templatepaths()
1130 1134 if isinstance(tp, str):
1131 1135 tp = [tp]
1132 1136 static = [os.path.join(p, 'static') for p in tp]
1133 1137 staticfile(static, fname, req)
1134 1138 return []
1135 1139
1136 1140 @webcommand('graph')
1137 1141 def graph(web, req, tmpl):
1138 1142 """
1139 1143 /graph[/{revision}]
1140 1144 -------------------
1141 1145
1142 1146 Show information about the graphical topology of the repository.
1143 1147
1144 1148 Information rendered by this handler can be used to create visual
1145 1149 representations of repository topology.
1146 1150
1147 1151 The ``revision`` URL parameter controls the starting changeset.
1148 1152
1149 1153 The ``revcount`` query string argument can define the number of changesets
1150 1154 to show information for.
1151 1155
1152 1156 This handler will render the ``graph`` template.
1153 1157 """
1154 1158
1155 1159 if 'node' in req.form:
1156 1160 ctx = webutil.changectx(web.repo, req)
1157 1161 symrev = webutil.symrevorshortnode(req, ctx)
1158 1162 else:
1159 1163 ctx = web.repo['tip']
1160 1164 symrev = 'tip'
1161 1165 rev = ctx.rev()
1162 1166
1163 1167 bg_height = 39
1164 1168 revcount = web.maxshortchanges
1165 1169 if 'revcount' in req.form:
1166 1170 try:
1167 1171 revcount = int(req.form.get('revcount', [revcount])[0])
1168 1172 revcount = max(revcount, 1)
1169 1173 tmpl.defaults['sessionvars']['revcount'] = revcount
1170 1174 except ValueError:
1171 1175 pass
1172 1176
1173 1177 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1174 1178 lessvars['revcount'] = max(revcount / 2, 1)
1175 1179 morevars = copy.copy(tmpl.defaults['sessionvars'])
1176 1180 morevars['revcount'] = revcount * 2
1177 1181
1178 1182 count = len(web.repo)
1179 1183 pos = rev
1180 1184
1181 1185 uprev = min(max(0, count - 1), rev + revcount)
1182 1186 downrev = max(0, rev - revcount)
1183 1187 changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
1184 1188
1185 1189 tree = []
1186 1190 if pos != -1:
1187 1191 allrevs = web.repo.changelog.revs(pos, 0)
1188 1192 revs = []
1189 1193 for i in allrevs:
1190 1194 revs.append(i)
1191 1195 if len(revs) >= revcount:
1192 1196 break
1193 1197
1194 1198 # We have to feed a baseset to dagwalker as it is expecting smartset
1195 1199 # object. This does not have a big impact on hgweb performance itself
1196 1200 # since hgweb graphing code is not itself lazy yet.
1197 1201 dag = graphmod.dagwalker(web.repo, revset.baseset(revs))
1198 1202 # As we said one line above... not lazy.
1199 1203 tree = list(graphmod.colored(dag, web.repo))
1200 1204
1201 1205 def getcolumns(tree):
1202 1206 cols = 0
1203 1207 for (id, type, ctx, vtx, edges) in tree:
1204 1208 if type != graphmod.CHANGESET:
1205 1209 continue
1206 1210 cols = max(cols, max([edge[0] for edge in edges] or [0]),
1207 1211 max([edge[1] for edge in edges] or [0]))
1208 1212 return cols
1209 1213
1210 1214 def graphdata(usetuples, **map):
1211 1215 data = []
1212 1216
1213 1217 row = 0
1214 1218 for (id, type, ctx, vtx, edges) in tree:
1215 1219 if type != graphmod.CHANGESET:
1216 1220 continue
1217 1221 node = str(ctx)
1218 1222 age = templatefilters.age(ctx.date())
1219 1223 desc = templatefilters.firstline(ctx.description())
1220 1224 desc = cgi.escape(templatefilters.nonempty(desc))
1221 1225 user = cgi.escape(templatefilters.person(ctx.user()))
1222 1226 branch = cgi.escape(ctx.branch())
1223 1227 try:
1224 1228 branchnode = web.repo.branchtip(branch)
1225 1229 except error.RepoLookupError:
1226 1230 branchnode = None
1227 1231 branch = branch, branchnode == ctx.node()
1228 1232
1229 1233 if usetuples:
1230 1234 data.append((node, vtx, edges, desc, user, age, branch,
1231 1235 [cgi.escape(x) for x in ctx.tags()],
1232 1236 [cgi.escape(x) for x in ctx.bookmarks()]))
1233 1237 else:
1234 1238 edgedata = [{'col': edge[0], 'nextcol': edge[1],
1235 1239 'color': (edge[2] - 1) % 6 + 1,
1236 1240 'width': edge[3], 'bcolor': edge[4]}
1237 1241 for edge in edges]
1238 1242
1239 1243 data.append(
1240 1244 {'node': node,
1241 1245 'col': vtx[0],
1242 1246 'color': (vtx[1] - 1) % 6 + 1,
1243 1247 'edges': edgedata,
1244 1248 'row': row,
1245 1249 'nextrow': row + 1,
1246 1250 'desc': desc,
1247 1251 'user': user,
1248 1252 'age': age,
1249 1253 'bookmarks': webutil.nodebookmarksdict(
1250 1254 web.repo, ctx.node()),
1251 1255 'branches': webutil.nodebranchdict(web.repo, ctx),
1252 1256 'inbranch': webutil.nodeinbranch(web.repo, ctx),
1253 1257 'tags': webutil.nodetagsdict(web.repo, ctx.node())})
1254 1258
1255 1259 row += 1
1256 1260
1257 1261 return data
1258 1262
1259 1263 cols = getcolumns(tree)
1260 1264 rows = len(tree)
1261 1265 canvasheight = (rows + 1) * bg_height - 27
1262 1266
1263 1267 return tmpl('graph', rev=rev, symrev=symrev, revcount=revcount,
1264 1268 uprev=uprev,
1265 1269 lessvars=lessvars, morevars=morevars, downrev=downrev,
1266 1270 cols=cols, rows=rows,
1267 1271 canvaswidth=(cols + 1) * bg_height,
1268 1272 truecanvasheight=rows * bg_height,
1269 1273 canvasheight=canvasheight, bg_height=bg_height,
1270 1274 jsdata=lambda **x: graphdata(True, **x),
1271 1275 nodes=lambda **x: graphdata(False, **x),
1272 1276 node=ctx.hex(), changenav=changenav)
1273 1277
1274 1278 def _getdoc(e):
1275 1279 doc = e[0].__doc__
1276 1280 if doc:
1277 1281 doc = _(doc).partition('\n')[0]
1278 1282 else:
1279 1283 doc = _('(no help text available)')
1280 1284 return doc
1281 1285
1282 1286 @webcommand('help')
1283 1287 def help(web, req, tmpl):
1284 1288 """
1285 1289 /help[/{topic}]
1286 1290 ---------------
1287 1291
1288 1292 Render help documentation.
1289 1293
1290 1294 This web command is roughly equivalent to :hg:`help`. If a ``topic``
1291 1295 is defined, that help topic will be rendered. If not, an index of
1292 1296 available help topics will be rendered.
1293 1297
1294 1298 The ``help`` template will be rendered when requesting help for a topic.
1295 1299 ``helptopics`` will be rendered for the index of help topics.
1296 1300 """
1297 1301 from .. import commands, help as helpmod # avoid cycle
1298 1302
1299 1303 topicname = req.form.get('node', [None])[0]
1300 1304 if not topicname:
1301 1305 def topics(**map):
1302 1306 for entries, summary, _doc in helpmod.helptable:
1303 1307 yield {'topic': entries[0], 'summary': summary}
1304 1308
1305 1309 early, other = [], []
1306 1310 primary = lambda s: s.partition('|')[0]
1307 1311 for c, e in commands.table.iteritems():
1308 1312 doc = _getdoc(e)
1309 1313 if 'DEPRECATED' in doc or c.startswith('debug'):
1310 1314 continue
1311 1315 cmd = primary(c)
1312 1316 if cmd.startswith('^'):
1313 1317 early.append((cmd[1:], doc))
1314 1318 else:
1315 1319 other.append((cmd, doc))
1316 1320
1317 1321 early.sort()
1318 1322 other.sort()
1319 1323
1320 1324 def earlycommands(**map):
1321 1325 for c, doc in early:
1322 1326 yield {'topic': c, 'summary': doc}
1323 1327
1324 1328 def othercommands(**map):
1325 1329 for c, doc in other:
1326 1330 yield {'topic': c, 'summary': doc}
1327 1331
1328 1332 return tmpl('helptopics', topics=topics, earlycommands=earlycommands,
1329 1333 othercommands=othercommands, title='Index')
1330 1334
1331 1335 u = webutil.wsgiui()
1332 1336 u.verbose = True
1333 1337 try:
1334 1338 doc = helpmod.help_(u, topicname)
1335 1339 except error.UnknownCommand:
1336 1340 raise ErrorResponse(HTTP_NOT_FOUND)
1337 1341 return tmpl('help', topic=topicname, doc=doc)
1338 1342
1339 1343 # tell hggettext to extract docstrings from these functions:
1340 1344 i18nfunctions = commands.values()
@@ -1,82 +1,85 b''
1 1 {header}
2 2 <title>{repo|escape}: {file|escape} history</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url|urlescape}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url|urlescape}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 13 <a href="{logourl}">
14 14 <img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
18 18 <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
19 19 <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
20 20 <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 21 <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
25 25 <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
26 26 </ul>
27 27 <ul>
28 28 <li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
29 29 <li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
30 30 <li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
31 31 <li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
32 32 <li class="active">file log</li>
33 33 <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
34 34 </ul>
35 35 <ul>
36 36 <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
37 37 </ul>
38 38 <div class="atom-logo">
39 39 <a href="{url|urlescape}atom-log/{node|short}/{file|urlescape}" title="subscribe to atom feed">
40 40 <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
41 41 </a>
42 42 </div>
43 43 </div>
44 44
45 45 <div class="main">
46 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 52 <form class="search" action="{url|urlescape}log">
50 53 {sessionvars%hiddenformentry}
51 54 <p><input name="rev" id="search1" type="text" size="30" /></p>
52 55 <div id="hint">{searchhint}</div>
53 56 </form>
54 57
55 58 <div class="navigate">
56 59 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
57 60 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
58 61 | {nav%filenav}</div>
59 62
60 63 <table class="bigtable">
61 64 <thead>
62 65 <tr>
63 66 <th class="age">age</th>
64 67 <th class="author">author</th>
65 68 <th class="description">description</th>
66 69 </tr>
67 70 </thead>
68 71 <tbody class="stripes2">
69 72 {entries%filelogentry}
70 73 </tbody>
71 74 </table>
72 75
73 76 <div class="navigate">
74 77 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
75 78 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
76 79 | {nav%filenav}
77 80 </div>
78 81
79 82 </div>
80 83 </div>
81 84
82 85 {footer}
@@ -1,895 +1,907 b''
1 1 #require serve
2 2
3 3 $ hg init test
4 4 $ cd test
5 5 $ echo b > b
6 6 $ hg ci -Am "b"
7 7 adding b
8 8 $ echo a > a
9 9 $ hg ci -Am "first a"
10 10 adding a
11 11 $ hg tag -r 1 a-tag
12 12 $ hg bookmark -r 1 a-bookmark
13 13 $ hg rm a
14 14 $ hg ci -m "del a"
15 15 $ hg branch a-branch
16 16 marked working directory as branch a-branch
17 17 (branches are permanent and global, did you want a bookmark?)
18 18 $ echo b > a
19 19 $ hg ci -Am "second a"
20 20 adding a
21 21 $ hg rm a
22 22 $ hg ci -m "del2 a"
23 23 $ hg mv b c
24 24 $ hg ci -m "mv b"
25 25 $ echo c >> c
26 26 $ hg ci -m "change c"
27 27 $ hg log -p
28 28 changeset: 7:46c1a66bd8fc
29 29 branch: a-branch
30 30 tag: tip
31 31 user: test
32 32 date: Thu Jan 01 00:00:00 1970 +0000
33 33 summary: change c
34 34
35 35 diff -r c9637d3cc8ef -r 46c1a66bd8fc c
36 36 --- a/c Thu Jan 01 00:00:00 1970 +0000
37 37 +++ b/c Thu Jan 01 00:00:00 1970 +0000
38 38 @@ -1,1 +1,2 @@
39 39 b
40 40 +c
41 41
42 42 changeset: 6:c9637d3cc8ef
43 43 branch: a-branch
44 44 user: test
45 45 date: Thu Jan 01 00:00:00 1970 +0000
46 46 summary: mv b
47 47
48 48 diff -r 958bd88be4eb -r c9637d3cc8ef b
49 49 --- a/b Thu Jan 01 00:00:00 1970 +0000
50 50 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
51 51 @@ -1,1 +0,0 @@
52 52 -b
53 53 diff -r 958bd88be4eb -r c9637d3cc8ef c
54 54 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
55 55 +++ b/c Thu Jan 01 00:00:00 1970 +0000
56 56 @@ -0,0 +1,1 @@
57 57 +b
58 58
59 59 changeset: 5:958bd88be4eb
60 60 branch: a-branch
61 61 user: test
62 62 date: Thu Jan 01 00:00:00 1970 +0000
63 63 summary: del2 a
64 64
65 65 diff -r 3f41bc784e7e -r 958bd88be4eb a
66 66 --- a/a Thu Jan 01 00:00:00 1970 +0000
67 67 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
68 68 @@ -1,1 +0,0 @@
69 69 -b
70 70
71 71 changeset: 4:3f41bc784e7e
72 72 branch: a-branch
73 73 user: test
74 74 date: Thu Jan 01 00:00:00 1970 +0000
75 75 summary: second a
76 76
77 77 diff -r 292258f86fdf -r 3f41bc784e7e a
78 78 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
79 79 +++ b/a Thu Jan 01 00:00:00 1970 +0000
80 80 @@ -0,0 +1,1 @@
81 81 +b
82 82
83 83 changeset: 3:292258f86fdf
84 84 user: test
85 85 date: Thu Jan 01 00:00:00 1970 +0000
86 86 summary: del a
87 87
88 88 diff -r 94c9dd5ca9b4 -r 292258f86fdf a
89 89 --- a/a Thu Jan 01 00:00:00 1970 +0000
90 90 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
91 91 @@ -1,1 +0,0 @@
92 92 -a
93 93
94 94 changeset: 2:94c9dd5ca9b4
95 95 user: test
96 96 date: Thu Jan 01 00:00:00 1970 +0000
97 97 summary: Added tag a-tag for changeset 5ed941583260
98 98
99 99 diff -r 5ed941583260 -r 94c9dd5ca9b4 .hgtags
100 100 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
101 101 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
102 102 @@ -0,0 +1,1 @@
103 103 +5ed941583260248620985524192fdc382ef57c36 a-tag
104 104
105 105 changeset: 1:5ed941583260
106 106 bookmark: a-bookmark
107 107 tag: a-tag
108 108 user: test
109 109 date: Thu Jan 01 00:00:00 1970 +0000
110 110 summary: first a
111 111
112 112 diff -r 6563da9dcf87 -r 5ed941583260 a
113 113 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
114 114 +++ b/a Thu Jan 01 00:00:00 1970 +0000
115 115 @@ -0,0 +1,1 @@
116 116 +a
117 117
118 118 changeset: 0:6563da9dcf87
119 119 user: test
120 120 date: Thu Jan 01 00:00:00 1970 +0000
121 121 summary: b
122 122
123 123 diff -r 000000000000 -r 6563da9dcf87 b
124 124 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
125 125 +++ b/b Thu Jan 01 00:00:00 1970 +0000
126 126 @@ -0,0 +1,1 @@
127 127 +b
128 128
129 129 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
130 130 $ cat hg.pid >> $DAEMON_PIDS
131 131
132 132 tip - two revisions
133 133
134 134 $ (get-with-headers.py localhost:$HGPORT 'log/tip/a')
135 135 200 Script output follows
136 136
137 137 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
138 138 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
139 139 <head>
140 140 <link rel="icon" href="/static/hgicon.png" type="image/png" />
141 141 <meta name="robots" content="index, nofollow" />
142 142 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
143 143 <script type="text/javascript" src="/static/mercurial.js"></script>
144 144
145 145 <title>test: a history</title>
146 146 <link rel="alternate" type="application/atom+xml"
147 147 href="/atom-log/tip/a" title="Atom feed for test:a" />
148 148 <link rel="alternate" type="application/rss+xml"
149 149 href="/rss-log/tip/a" title="RSS feed for test:a" />
150 150 </head>
151 151 <body>
152 152
153 153 <div class="container">
154 154 <div class="menu">
155 155 <div class="logo">
156 156 <a href="https://mercurial-scm.org/">
157 157 <img src="/static/hglogo.png" alt="mercurial" /></a>
158 158 </div>
159 159 <ul>
160 160 <li><a href="/shortlog/tip">log</a></li>
161 161 <li><a href="/graph/tip">graph</a></li>
162 162 <li><a href="/tags">tags</a></li>
163 163 <li><a href="/bookmarks">bookmarks</a></li>
164 164 <li><a href="/branches">branches</a></li>
165 165 </ul>
166 166 <ul>
167 167 <li><a href="/rev/tip">changeset</a></li>
168 168 <li><a href="/file/tip">browse</a></li>
169 169 </ul>
170 170 <ul>
171 171 <li><a href="/file/tip/a">file</a></li>
172 172 <li><a href="/diff/tip/a">diff</a></li>
173 173 <li><a href="/comparison/tip/a">comparison</a></li>
174 174 <li><a href="/annotate/tip/a">annotate</a></li>
175 175 <li class="active">file log</li>
176 176 <li><a href="/raw-file/tip/a">raw</a></li>
177 177 </ul>
178 178 <ul>
179 179 <li><a href="/help">help</a></li>
180 180 </ul>
181 181 <div class="atom-logo">
182 182 <a href="/atom-log/3f41bc784e7e/a" title="subscribe to atom feed">
183 183 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
184 184 </a>
185 185 </div>
186 186 </div>
187 187
188 188 <div class="main">
189 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 195 <form class="search" action="/log">
193 196
194 197 <p><input name="rev" id="search1" type="text" size="30" /></p>
195 198 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
196 199 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
197 200 </form>
198 201
199 202 <div class="navigate">
200 203 <a href="/log/tip/a?revcount=30">less</a>
201 204 <a href="/log/tip/a?revcount=120">more</a>
202 205 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
203 206
204 207 <table class="bigtable">
205 208 <thead>
206 209 <tr>
207 210 <th class="age">age</th>
208 211 <th class="author">author</th>
209 212 <th class="description">description</th>
210 213 </tr>
211 214 </thead>
212 215 <tbody class="stripes2">
213 216 <tr>
214 217 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
215 218 <td class="author">test</td>
216 219 <td class="description">
217 220 <a href="/rev/3f41bc784e7e">second a</a>
218 221 <span class="branchname">a-branch</span>
219 222 </td>
220 223 </tr>
221 224 <tr>
222 225 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
223 226 <td class="author">test</td>
224 227 <td class="description">
225 228 <a href="/rev/5ed941583260">first a</a>
226 229 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
227 230 </td>
228 231 </tr>
229 232
230 233 </tbody>
231 234 </table>
232 235
233 236 <div class="navigate">
234 237 <a href="/log/tip/a?revcount=30">less</a>
235 238 <a href="/log/tip/a?revcount=120">more</a>
236 239 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
237 240 </div>
238 241
239 242 </div>
240 243 </div>
241 244
242 245 <script type="text/javascript">process_dates()</script>
243 246
244 247
245 248 </body>
246 249 </html>
247 250
248 251
249 252 second version - two revisions
250 253
251 254 $ (get-with-headers.py localhost:$HGPORT 'log/4/a')
252 255 200 Script output follows
253 256
254 257 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
255 258 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
256 259 <head>
257 260 <link rel="icon" href="/static/hgicon.png" type="image/png" />
258 261 <meta name="robots" content="index, nofollow" />
259 262 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
260 263 <script type="text/javascript" src="/static/mercurial.js"></script>
261 264
262 265 <title>test: a history</title>
263 266 <link rel="alternate" type="application/atom+xml"
264 267 href="/atom-log/tip/a" title="Atom feed for test:a" />
265 268 <link rel="alternate" type="application/rss+xml"
266 269 href="/rss-log/tip/a" title="RSS feed for test:a" />
267 270 </head>
268 271 <body>
269 272
270 273 <div class="container">
271 274 <div class="menu">
272 275 <div class="logo">
273 276 <a href="https://mercurial-scm.org/">
274 277 <img src="/static/hglogo.png" alt="mercurial" /></a>
275 278 </div>
276 279 <ul>
277 280 <li><a href="/shortlog/4">log</a></li>
278 281 <li><a href="/graph/4">graph</a></li>
279 282 <li><a href="/tags">tags</a></li>
280 283 <li><a href="/bookmarks">bookmarks</a></li>
281 284 <li><a href="/branches">branches</a></li>
282 285 </ul>
283 286 <ul>
284 287 <li><a href="/rev/4">changeset</a></li>
285 288 <li><a href="/file/4">browse</a></li>
286 289 </ul>
287 290 <ul>
288 291 <li><a href="/file/4/a">file</a></li>
289 292 <li><a href="/diff/4/a">diff</a></li>
290 293 <li><a href="/comparison/4/a">comparison</a></li>
291 294 <li><a href="/annotate/4/a">annotate</a></li>
292 295 <li class="active">file log</li>
293 296 <li><a href="/raw-file/4/a">raw</a></li>
294 297 </ul>
295 298 <ul>
296 299 <li><a href="/help">help</a></li>
297 300 </ul>
298 301 <div class="atom-logo">
299 302 <a href="/atom-log/3f41bc784e7e/a" title="subscribe to atom feed">
300 303 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
301 304 </a>
302 305 </div>
303 306 </div>
304 307
305 308 <div class="main">
306 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 315 <form class="search" action="/log">
310 316
311 317 <p><input name="rev" id="search1" type="text" size="30" /></p>
312 318 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
313 319 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
314 320 </form>
315 321
316 322 <div class="navigate">
317 323 <a href="/log/4/a?revcount=30">less</a>
318 324 <a href="/log/4/a?revcount=120">more</a>
319 325 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
320 326
321 327 <table class="bigtable">
322 328 <thead>
323 329 <tr>
324 330 <th class="age">age</th>
325 331 <th class="author">author</th>
326 332 <th class="description">description</th>
327 333 </tr>
328 334 </thead>
329 335 <tbody class="stripes2">
330 336 <tr>
331 337 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
332 338 <td class="author">test</td>
333 339 <td class="description">
334 340 <a href="/rev/3f41bc784e7e">second a</a>
335 341 <span class="branchname">a-branch</span>
336 342 </td>
337 343 </tr>
338 344 <tr>
339 345 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
340 346 <td class="author">test</td>
341 347 <td class="description">
342 348 <a href="/rev/5ed941583260">first a</a>
343 349 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
344 350 </td>
345 351 </tr>
346 352
347 353 </tbody>
348 354 </table>
349 355
350 356 <div class="navigate">
351 357 <a href="/log/4/a?revcount=30">less</a>
352 358 <a href="/log/4/a?revcount=120">more</a>
353 359 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
354 360 </div>
355 361
356 362 </div>
357 363 </div>
358 364
359 365 <script type="text/javascript">process_dates()</script>
360 366
361 367
362 368 </body>
363 369 </html>
364 370
365 371
366 372 first deleted - one revision
367 373
368 374 $ (get-with-headers.py localhost:$HGPORT 'log/3/a')
369 375 200 Script output follows
370 376
371 377 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
372 378 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
373 379 <head>
374 380 <link rel="icon" href="/static/hgicon.png" type="image/png" />
375 381 <meta name="robots" content="index, nofollow" />
376 382 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
377 383 <script type="text/javascript" src="/static/mercurial.js"></script>
378 384
379 385 <title>test: a history</title>
380 386 <link rel="alternate" type="application/atom+xml"
381 387 href="/atom-log/tip/a" title="Atom feed for test:a" />
382 388 <link rel="alternate" type="application/rss+xml"
383 389 href="/rss-log/tip/a" title="RSS feed for test:a" />
384 390 </head>
385 391 <body>
386 392
387 393 <div class="container">
388 394 <div class="menu">
389 395 <div class="logo">
390 396 <a href="https://mercurial-scm.org/">
391 397 <img src="/static/hglogo.png" alt="mercurial" /></a>
392 398 </div>
393 399 <ul>
394 400 <li><a href="/shortlog/3">log</a></li>
395 401 <li><a href="/graph/3">graph</a></li>
396 402 <li><a href="/tags">tags</a></li>
397 403 <li><a href="/bookmarks">bookmarks</a></li>
398 404 <li><a href="/branches">branches</a></li>
399 405 </ul>
400 406 <ul>
401 407 <li><a href="/rev/3">changeset</a></li>
402 408 <li><a href="/file/3">browse</a></li>
403 409 </ul>
404 410 <ul>
405 411 <li><a href="/file/3/a">file</a></li>
406 412 <li><a href="/diff/3/a">diff</a></li>
407 413 <li><a href="/comparison/3/a">comparison</a></li>
408 414 <li><a href="/annotate/3/a">annotate</a></li>
409 415 <li class="active">file log</li>
410 416 <li><a href="/raw-file/3/a">raw</a></li>
411 417 </ul>
412 418 <ul>
413 419 <li><a href="/help">help</a></li>
414 420 </ul>
415 421 <div class="atom-logo">
416 422 <a href="/atom-log/5ed941583260/a" title="subscribe to atom feed">
417 423 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
418 424 </a>
419 425 </div>
420 426 </div>
421 427
422 428 <div class="main">
423 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 435 <form class="search" action="/log">
427 436
428 437 <p><input name="rev" id="search1" type="text" size="30" /></p>
429 438 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
430 439 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
431 440 </form>
432 441
433 442 <div class="navigate">
434 443 <a href="/log/3/a?revcount=30">less</a>
435 444 <a href="/log/3/a?revcount=120">more</a>
436 445 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
437 446
438 447 <table class="bigtable">
439 448 <thead>
440 449 <tr>
441 450 <th class="age">age</th>
442 451 <th class="author">author</th>
443 452 <th class="description">description</th>
444 453 </tr>
445 454 </thead>
446 455 <tbody class="stripes2">
447 456 <tr>
448 457 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
449 458 <td class="author">test</td>
450 459 <td class="description">
451 460 <a href="/rev/5ed941583260">first a</a>
452 461 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
453 462 </td>
454 463 </tr>
455 464
456 465 </tbody>
457 466 </table>
458 467
459 468 <div class="navigate">
460 469 <a href="/log/3/a?revcount=30">less</a>
461 470 <a href="/log/3/a?revcount=120">more</a>
462 471 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
463 472 </div>
464 473
465 474 </div>
466 475 </div>
467 476
468 477 <script type="text/javascript">process_dates()</script>
469 478
470 479
471 480 </body>
472 481 </html>
473 482
474 483
475 484 first version - one revision
476 485
477 486 $ (get-with-headers.py localhost:$HGPORT 'log/1/a')
478 487 200 Script output follows
479 488
480 489 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
481 490 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
482 491 <head>
483 492 <link rel="icon" href="/static/hgicon.png" type="image/png" />
484 493 <meta name="robots" content="index, nofollow" />
485 494 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
486 495 <script type="text/javascript" src="/static/mercurial.js"></script>
487 496
488 497 <title>test: a history</title>
489 498 <link rel="alternate" type="application/atom+xml"
490 499 href="/atom-log/tip/a" title="Atom feed for test:a" />
491 500 <link rel="alternate" type="application/rss+xml"
492 501 href="/rss-log/tip/a" title="RSS feed for test:a" />
493 502 </head>
494 503 <body>
495 504
496 505 <div class="container">
497 506 <div class="menu">
498 507 <div class="logo">
499 508 <a href="https://mercurial-scm.org/">
500 509 <img src="/static/hglogo.png" alt="mercurial" /></a>
501 510 </div>
502 511 <ul>
503 512 <li><a href="/shortlog/1">log</a></li>
504 513 <li><a href="/graph/1">graph</a></li>
505 514 <li><a href="/tags">tags</a></li>
506 515 <li><a href="/bookmarks">bookmarks</a></li>
507 516 <li><a href="/branches">branches</a></li>
508 517 </ul>
509 518 <ul>
510 519 <li><a href="/rev/1">changeset</a></li>
511 520 <li><a href="/file/1">browse</a></li>
512 521 </ul>
513 522 <ul>
514 523 <li><a href="/file/1/a">file</a></li>
515 524 <li><a href="/diff/1/a">diff</a></li>
516 525 <li><a href="/comparison/1/a">comparison</a></li>
517 526 <li><a href="/annotate/1/a">annotate</a></li>
518 527 <li class="active">file log</li>
519 528 <li><a href="/raw-file/1/a">raw</a></li>
520 529 </ul>
521 530 <ul>
522 531 <li><a href="/help">help</a></li>
523 532 </ul>
524 533 <div class="atom-logo">
525 534 <a href="/atom-log/5ed941583260/a" title="subscribe to atom feed">
526 535 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
527 536 </a>
528 537 </div>
529 538 </div>
530 539
531 540 <div class="main">
532 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 547 <form class="search" action="/log">
536 548
537 549 <p><input name="rev" id="search1" type="text" size="30" /></p>
538 550 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
539 551 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
540 552 </form>
541 553
542 554 <div class="navigate">
543 555 <a href="/log/1/a?revcount=30">less</a>
544 556 <a href="/log/1/a?revcount=120">more</a>
545 557 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
546 558
547 559 <table class="bigtable">
548 560 <thead>
549 561 <tr>
550 562 <th class="age">age</th>
551 563 <th class="author">author</th>
552 564 <th class="description">description</th>
553 565 </tr>
554 566 </thead>
555 567 <tbody class="stripes2">
556 568 <tr>
557 569 <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
558 570 <td class="author">test</td>
559 571 <td class="description">
560 572 <a href="/rev/5ed941583260">first a</a>
561 573 <span class="tag">a-tag</span> <span class="tag">a-bookmark</span>
562 574 </td>
563 575 </tr>
564 576
565 577 </tbody>
566 578 </table>
567 579
568 580 <div class="navigate">
569 581 <a href="/log/1/a?revcount=30">less</a>
570 582 <a href="/log/1/a?revcount=120">more</a>
571 583 | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
572 584 </div>
573 585
574 586 </div>
575 587 </div>
576 588
577 589 <script type="text/javascript">process_dates()</script>
578 590
579 591
580 592 </body>
581 593 </html>
582 594
583 595
584 596 before addition - error
585 597
586 598 $ (get-with-headers.py localhost:$HGPORT 'log/0/a')
587 599 404 Not Found
588 600
589 601 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
590 602 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
591 603 <head>
592 604 <link rel="icon" href="/static/hgicon.png" type="image/png" />
593 605 <meta name="robots" content="index, nofollow" />
594 606 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
595 607 <script type="text/javascript" src="/static/mercurial.js"></script>
596 608
597 609 <title>test: error</title>
598 610 </head>
599 611 <body>
600 612
601 613 <div class="container">
602 614 <div class="menu">
603 615 <div class="logo">
604 616 <a href="https://mercurial-scm.org/">
605 617 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
606 618 </div>
607 619 <ul>
608 620 <li><a href="/shortlog">log</a></li>
609 621 <li><a href="/graph">graph</a></li>
610 622 <li><a href="/tags">tags</a></li>
611 623 <li><a href="/bookmarks">bookmarks</a></li>
612 624 <li><a href="/branches">branches</a></li>
613 625 </ul>
614 626 <ul>
615 627 <li><a href="/help">help</a></li>
616 628 </ul>
617 629 </div>
618 630
619 631 <div class="main">
620 632
621 633 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
622 634 <h3>error</h3>
623 635
624 636 <form class="search" action="/log">
625 637
626 638 <p><input name="rev" id="search1" type="text" size="30"></p>
627 639 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
628 640 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
629 641 </form>
630 642
631 643 <div class="description">
632 644 <p>
633 645 An error occurred while processing your request:
634 646 </p>
635 647 <p>
636 648 a@6563da9dcf87: not found in manifest
637 649 </p>
638 650 </div>
639 651 </div>
640 652 </div>
641 653
642 654 <script type="text/javascript">process_dates()</script>
643 655
644 656
645 657 </body>
646 658 </html>
647 659
648 660 [1]
649 661
650 662 should show base link, use spartan because it shows it
651 663
652 664 $ (get-with-headers.py localhost:$HGPORT 'log/tip/c?style=spartan')
653 665 200 Script output follows
654 666
655 667 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
656 668 <html>
657 669 <head>
658 670 <link rel="icon" href="/static/hgicon.png" type="image/png">
659 671 <meta name="robots" content="index, nofollow" />
660 672 <link rel="stylesheet" href="/static/style.css" type="text/css" />
661 673 <script type="text/javascript" src="/static/mercurial.js"></script>
662 674
663 675 <title>test: c history</title>
664 676 <link rel="alternate" type="application/atom+xml"
665 677 href="/atom-log/tip/c" title="Atom feed for test:c">
666 678 <link rel="alternate" type="application/rss+xml"
667 679 href="/rss-log/tip/c" title="RSS feed for test:c">
668 680 </head>
669 681 <body>
670 682
671 683 <div class="buttons">
672 684 <a href="/log?style=spartan">changelog</a>
673 685 <a href="/shortlog?style=spartan">shortlog</a>
674 686 <a href="/graph?style=spartan">graph</a>
675 687 <a href="/tags?style=spartan">tags</a>
676 688 <a href="/branches?style=spartan">branches</a>
677 689 <a href="/file/tip/c?style=spartan">file</a>
678 690 <a href="/annotate/tip/c?style=spartan">annotate</a>
679 691 <a href="/help?style=spartan">help</a>
680 692 <a type="application/rss+xml" href="/rss-log/tip/c">rss</a>
681 693 <a type="application/atom+xml" href="/atom-log/tip/c" title="Atom feed for test:c">atom</a>
682 694 </div>
683 695
684 696 <h2><a href="/">Mercurial</a> / c revision history</h2>
685 697
686 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 700 <table class="logEntry parity0">
689 701 <tr>
690 702 <th class="label"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
691 703 <th class="firstline"><a href="/rev/46c1a66bd8fc?style=spartan">change c</a></th>
692 704 </tr>
693 705 <tr>
694 706 <th class="revision">revision 1:</th>
695 707 <td class="node">
696 708 <a href="/file/46c1a66bd8fc/c?style=spartan">46c1a66bd8fc</a>
697 709 <a href="/diff/46c1a66bd8fc/c?style=spartan">(diff)</a>
698 710 <a href="/annotate/46c1a66bd8fc/c?style=spartan">(annotate)</a>
699 711 </td>
700 712 </tr>
701 713
702 714 <tr>
703 715 <th class="author">author:</th>
704 716 <td class="author">&#116;&#101;&#115;&#116;</td>
705 717 </tr>
706 718 <tr>
707 719 <th class="date">date:</th>
708 720 <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
709 721 </tr>
710 722 </table>
711 723
712 724
713 725 <table class="logEntry parity1">
714 726 <tr>
715 727 <th class="label"><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
716 728 <th class="firstline"><a href="/rev/c9637d3cc8ef?style=spartan">mv b</a></th>
717 729 </tr>
718 730 <tr>
719 731 <th class="revision">revision 0:</th>
720 732 <td class="node">
721 733 <a href="/file/c9637d3cc8ef/c?style=spartan">c9637d3cc8ef</a>
722 734 <a href="/diff/c9637d3cc8ef/c?style=spartan">(diff)</a>
723 735 <a href="/annotate/c9637d3cc8ef/c?style=spartan">(annotate)</a>
724 736 </td>
725 737 </tr>
726 738
727 739 <tr>
728 740 <th>base:</th>
729 741 <td>
730 742 <a href="/file/1e88685f5dde/b?style=spartan">
731 743 b@1e88685f5dde
732 744 </a>
733 745 </td>
734 746 </tr>
735 747 <tr>
736 748 <th class="author">author:</th>
737 749 <td class="author">&#116;&#101;&#115;&#116;</td>
738 750 </tr>
739 751 <tr>
740 752 <th class="date">date:</th>
741 753 <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
742 754 </tr>
743 755 </table>
744 756
745 757
746 758
747 759
748 760 <script type="text/javascript">process_dates()</script>
749 761
750 762 <div class="logo">
751 763 <a href="https://mercurial-scm.org/">
752 764 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
753 765 </div>
754 766
755 767 </body>
756 768 </html>
757 769
758 770
759 771 rss log
760 772
761 773 $ (get-with-headers.py localhost:$HGPORT 'rss-log/tip/a')
762 774 200 Script output follows
763 775
764 776 <?xml version="1.0" encoding="ascii"?>
765 777 <rss version="2.0">
766 778 <channel>
767 779 <link>http://*:$HGPORT/</link> (glob)
768 780 <language>en-us</language>
769 781
770 782 <title>test: a history</title>
771 783 <description>a revision history</description>
772 784 <item>
773 785 <title>second a</title>
774 786 <link>http://*:$HGPORT/log3f41bc784e7e/a</link> (glob)
775 787 <description><![CDATA[second a]]></description>
776 788 <author>&#116;&#101;&#115;&#116;</author>
777 789 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
778 790 </item>
779 791 <item>
780 792 <title>first a</title>
781 793 <link>http://*:$HGPORT/log5ed941583260/a</link> (glob)
782 794 <description><![CDATA[first a]]></description>
783 795 <author>&#116;&#101;&#115;&#116;</author>
784 796 <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
785 797 </item>
786 798
787 799 </channel>
788 800 </rss>
789 801
790 802 atom log
791 803
792 804 $ (get-with-headers.py localhost:$HGPORT 'atom-log/tip/a')
793 805 200 Script output follows
794 806
795 807 <?xml version="1.0" encoding="ascii"?>
796 808 <feed xmlns="http://www.w3.org/2005/Atom">
797 809 <id>http://*:$HGPORT/atom-log/tip/a</id> (glob)
798 810 <link rel="self" href="http://*:$HGPORT/atom-log/tip/a"/> (glob)
799 811 <title>test: a history</title>
800 812 <updated>1970-01-01T00:00:00+00:00</updated>
801 813
802 814 <entry>
803 815 <title>[a-branch] second a</title>
804 816 <id>http://*:$HGPORT/#changeset-3f41bc784e7e73035c6d47112c6cc7efb673adf8</id> (glob)
805 817 <link href="http://*:$HGPORT/rev/3f41bc784e7e"/> (glob)
806 818 <author>
807 819 <name>test</name>
808 820 <email>&#116;&#101;&#115;&#116;</email>
809 821 </author>
810 822 <updated>1970-01-01T00:00:00+00:00</updated>
811 823 <published>1970-01-01T00:00:00+00:00</published>
812 824 <content type="xhtml">
813 825 <table xmlns="http://www.w3.org/1999/xhtml">
814 826 <tr>
815 827 <th style="text-align:left;">changeset</th>
816 828 <td>3f41bc784e7e</td>
817 829 </tr>
818 830 <tr>
819 831 <th style="text-align:left;">branch</th>
820 832 <td>a-branch</td>
821 833 </tr>
822 834 <tr>
823 835 <th style="text-align:left;">bookmark</th>
824 836 <td></td>
825 837 </tr>
826 838 <tr>
827 839 <th style="text-align:left;">tag</th>
828 840 <td></td>
829 841 </tr>
830 842 <tr>
831 843 <th style="text-align:left;">user</th>
832 844 <td>&#116;&#101;&#115;&#116;</td>
833 845 </tr>
834 846 <tr>
835 847 <th style="text-align:left;vertical-align:top;">description</th>
836 848 <td>second a</td>
837 849 </tr>
838 850 <tr>
839 851 <th style="text-align:left;vertical-align:top;">files</th>
840 852 <td></td>
841 853 </tr>
842 854 </table>
843 855 </content>
844 856 </entry>
845 857 <entry>
846 858 <title>first a</title>
847 859 <id>http://*:$HGPORT/#changeset-5ed941583260248620985524192fdc382ef57c36</id> (glob)
848 860 <link href="http://*:$HGPORT/rev/5ed941583260"/> (glob)
849 861 <author>
850 862 <name>test</name>
851 863 <email>&#116;&#101;&#115;&#116;</email>
852 864 </author>
853 865 <updated>1970-01-01T00:00:00+00:00</updated>
854 866 <published>1970-01-01T00:00:00+00:00</published>
855 867 <content type="xhtml">
856 868 <table xmlns="http://www.w3.org/1999/xhtml">
857 869 <tr>
858 870 <th style="text-align:left;">changeset</th>
859 871 <td>5ed941583260</td>
860 872 </tr>
861 873 <tr>
862 874 <th style="text-align:left;">branch</th>
863 875 <td></td>
864 876 </tr>
865 877 <tr>
866 878 <th style="text-align:left;">bookmark</th>
867 879 <td>a-bookmark</td>
868 880 </tr>
869 881 <tr>
870 882 <th style="text-align:left;">tag</th>
871 883 <td>a-tag</td>
872 884 </tr>
873 885 <tr>
874 886 <th style="text-align:left;">user</th>
875 887 <td>&#116;&#101;&#115;&#116;</td>
876 888 </tr>
877 889 <tr>
878 890 <th style="text-align:left;vertical-align:top;">description</th>
879 891 <td>first a</td>
880 892 </tr>
881 893 <tr>
882 894 <th style="text-align:left;vertical-align:top;">files</th>
883 895 <td></td>
884 896 </tr>
885 897 </table>
886 898 </content>
887 899 </entry>
888 900
889 901 </feed>
890 902
891 903 errors
892 904
893 905 $ cat errors.log
894 906
895 907 $ cd ..
@@ -1,1050 +1,1052 b''
1 1 #require serve
2 2
3 3 Test symbolic revision usage in links produced by hgweb pages. There are
4 4 multiple issues related to this:
5 5 - issue2296
6 6 - issue2826
7 7 - issue3594
8 8 - issue3634
9 9
10 10 Set up the repo
11 11
12 12 $ hg init test
13 13 $ cd test
14 14 $ echo 0 > foo
15 15 $ mkdir dir
16 16 $ echo 0 > dir/bar
17 17 $ hg ci -Am 'first'
18 18 adding dir/bar
19 19 adding foo
20 20 $ echo 1 >> foo
21 21 $ hg ci -m 'second'
22 22 $ echo 2 >> foo
23 23 $ hg ci -m 'third'
24 24 $ hg bookmark -r1 xyzzy
25 25
26 26 $ hg log -G --template '{rev}:{node|short} {tags} {bookmarks}\n'
27 27 @ 2:9d8c40cba617 tip
28 28 |
29 29 o 1:a7c1559b7bba xyzzy
30 30 |
31 31 o 0:43c799df6e75
32 32
33 33 $ hg serve --config web.allow_archive=zip -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
34 34 $ cat hg.pid >> $DAEMON_PIDS
35 35
36 36 $ REVLINKS='href=[^>]+(rev=|/)(43c799df6e75|0|a7c1559b7bba|1|xyzzy|9d8c40cba617|2|tip|default)'
37 37
38 38 (De)referencing symbolic revisions (paper)
39 39
40 40 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=paper' | egrep $REVLINKS
41 41 <li><a href="/graph/tip?style=paper">graph</a></li>
42 42 <li><a href="/rev/tip?style=paper">changeset</a></li>
43 43 <li><a href="/file/tip?style=paper">browse</a></li>
44 44 <a href="/archive/tip.zip">zip</a>
45 45 <a href="/shortlog/tip?revcount=30&style=paper">less</a>
46 46 <a href="/shortlog/tip?revcount=120&style=paper">more</a>
47 47 | rev 2: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
48 48 <a href="/rev/9d8c40cba617?style=paper">third</a>
49 49 <a href="/rev/a7c1559b7bba?style=paper">second</a>
50 50 <a href="/rev/43c799df6e75?style=paper">first</a>
51 51 <a href="/shortlog/tip?revcount=30&style=paper">less</a>
52 52 <a href="/shortlog/tip?revcount=120&style=paper">more</a>
53 53 | rev 2: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
54 54
55 55 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=paper' | egrep $REVLINKS
56 56 <li><a href="/shortlog/tip?style=paper">log</a></li>
57 57 <li><a href="/rev/tip?style=paper">changeset</a></li>
58 58 <li><a href="/file/tip?style=paper">browse</a></li>
59 59 <a href="/graph/tip?revcount=30&style=paper">less</a>
60 60 <a href="/graph/tip?revcount=120&style=paper">more</a>
61 61 | rev 2: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
62 62 <a href="/graph/tip?revcount=30&style=paper">less</a>
63 63 <a href="/graph/tip?revcount=120&style=paper">more</a>
64 64 | rev 2: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
65 65
66 66 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=paper' | egrep $REVLINKS
67 67 <li><a href="/shortlog/tip?style=paper">log</a></li>
68 68 <li><a href="/graph/tip?style=paper">graph</a></li>
69 69 <li><a href="/rev/tip?style=paper">changeset</a></li>
70 70 <a href="/archive/tip.zip">zip</a>
71 71 directory / @ 2:<a href="/rev/9d8c40cba617?style=paper">9d8c40cba617</a>
72 72 <td class="name"><a href="/file/tip/?style=paper">[up]</a></td>
73 73 <a href="/file/tip/dir?style=paper">
74 74 <a href="/file/tip/dir/?style=paper">
75 75 <a href="/file/tip/foo?style=paper">
76 76
77 77 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=paper' | egrep $REVLINKS
78 78 <a href="/shortlog/default?style=paper" class="open">
79 79 <a href="/shortlog/9d8c40cba617?style=paper" class="open">
80 80
81 81 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=paper' | egrep $REVLINKS
82 82 <a href="/rev/tip?style=paper">
83 83 <a href="/rev/9d8c40cba617?style=paper">
84 84
85 85 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=paper' | egrep $REVLINKS
86 86 <a href="/rev/xyzzy?style=paper">
87 87 <a href="/rev/a7c1559b7bba?style=paper">
88 88
89 89 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=paper&rev=all()' | egrep $REVLINKS
90 90 <a href="/rev/9d8c40cba617?style=paper">third</a>
91 91 <a href="/rev/a7c1559b7bba?style=paper">second</a>
92 92 <a href="/rev/43c799df6e75?style=paper">first</a>
93 93
94 94 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=paper' | egrep $REVLINKS
95 95 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
96 96 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
97 97 <li><a href="/raw-rev/xyzzy?style=paper">raw</a></li>
98 98 <li><a href="/file/xyzzy?style=paper">browse</a></li>
99 99 <a href="/archive/xyzzy.zip">zip</a>
100 100 changeset 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
101 101 <td class="author"><a href="/rev/43c799df6e75?style=paper">43c799df6e75</a> </td>
102 102 <td class="author"> <a href="/rev/9d8c40cba617?style=paper">9d8c40cba617</a></td>
103 103 <td class="files"><a href="/file/a7c1559b7bba/foo?style=paper">foo</a> </td>
104 104
105 105 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=paper' | egrep $REVLINKS
106 106 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
107 107 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
108 108 <li><a href="/file/xyzzy?style=paper">browse</a></li>
109 109 <a href="/archive/xyzzy.zip">zip</a>
110 110 <a href="/shortlog/xyzzy?revcount=30&style=paper">less</a>
111 111 <a href="/shortlog/xyzzy?revcount=120&style=paper">more</a>
112 112 | rev 1: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
113 113 <a href="/rev/a7c1559b7bba?style=paper">second</a>
114 114 <a href="/rev/43c799df6e75?style=paper">first</a>
115 115 <a href="/shortlog/xyzzy?revcount=30&style=paper">less</a>
116 116 <a href="/shortlog/xyzzy?revcount=120&style=paper">more</a>
117 117 | rev 1: <a href="/shortlog/43c799df6e75?style=paper">(0)</a> <a href="/shortlog/tip?style=paper">tip</a>
118 118
119 119 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=paper' | egrep $REVLINKS
120 120 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
121 121 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
122 122 <li><a href="/file/xyzzy?style=paper">browse</a></li>
123 123 <a href="/graph/xyzzy?revcount=30&style=paper">less</a>
124 124 <a href="/graph/xyzzy?revcount=120&style=paper">more</a>
125 125 | rev 1: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
126 126 <a href="/graph/xyzzy?revcount=30&style=paper">less</a>
127 127 <a href="/graph/xyzzy?revcount=120&style=paper">more</a>
128 128 | rev 1: <a href="/graph/43c799df6e75?style=paper">(0)</a> <a href="/graph/tip?style=paper">tip</a>
129 129
130 130 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=paper' | egrep $REVLINKS
131 131 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
132 132 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
133 133 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
134 134 <a href="/archive/xyzzy.zip">zip</a>
135 135 directory / @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
136 136 <td class="name"><a href="/file/xyzzy/?style=paper">[up]</a></td>
137 137 <a href="/file/xyzzy/dir?style=paper">
138 138 <a href="/file/xyzzy/dir/?style=paper">
139 139 <a href="/file/xyzzy/foo?style=paper">
140 140
141 141 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=paper' | egrep $REVLINKS
142 142 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
143 143 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
144 144 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
145 145 <li><a href="/file/xyzzy/?style=paper">browse</a></li>
146 146 <li><a href="/file/tip/foo?style=paper">latest</a></li>
147 147 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
148 148 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
149 149 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
150 150 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
151 151 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
152 152 view foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
153 153 <td class="author"><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
154 154 <td class="author"><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
155 155
156 156 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=paper' | egrep $REVLINKS
157 157 href="/atom-log/tip/foo" title="Atom feed for test:foo" />
158 158 href="/rss-log/tip/foo" title="RSS feed for test:foo" />
159 159 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
160 160 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
161 161 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
162 162 <li><a href="/file/xyzzy?style=paper">browse</a></li>
163 163 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
164 164 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
165 165 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
166 166 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
167 167 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
168 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 170 <a href="/log/xyzzy/foo?revcount=30&style=paper">less</a>
170 171 <a href="/log/xyzzy/foo?revcount=120&style=paper">more</a>
171 172 | <a href="/log/43c799df6e75/foo?style=paper">(0)</a> <a href="/log/tip/foo?style=paper">tip</a> </div>
172 173 <a href="/rev/a7c1559b7bba?style=paper">second</a>
173 174 <a href="/rev/43c799df6e75?style=paper">first</a>
174 175 <a href="/log/xyzzy/foo?revcount=30&style=paper">less</a>
175 176 <a href="/log/xyzzy/foo?revcount=120&style=paper">more</a>
176 177 | <a href="/log/43c799df6e75/foo?style=paper">(0)</a> <a href="/log/tip/foo?style=paper">tip</a>
177 178
178 179 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=paper' | egrep $REVLINKS
179 180 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
180 181 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
181 182 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
182 183 <li><a href="/file/xyzzy/?style=paper">browse</a></li>
183 184 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
184 185 <li><a href="/file/tip/foo?style=paper">latest</a></li>
185 186 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
186 187 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
187 188 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
188 189 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
189 190 annotate foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
190 191 <td class="author"><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
191 192 <td class="author"><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
192 193 <a href="/annotate/43c799df6e75/foo?style=paper#l1"
193 194 <a href="/annotate/a7c1559b7bba/foo?style=paper#l2"
194 195
195 196 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=paper' | egrep $REVLINKS
196 197 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
197 198 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
198 199 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
199 200 <li><a href="/file/xyzzy?style=paper">browse</a></li>
200 201 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
201 202 <li><a href="/file/tip/foo?style=paper">latest</a></li>
202 203 <li><a href="/comparison/xyzzy/foo?style=paper">comparison</a></li>
203 204 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
204 205 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
205 206 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
206 207 diff foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
207 208 <td><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
208 209 <td><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
209 210
210 211 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=paper' | egrep $REVLINKS
211 212 <li><a href="/shortlog/xyzzy?style=paper">log</a></li>
212 213 <li><a href="/graph/xyzzy?style=paper">graph</a></li>
213 214 <li><a href="/rev/xyzzy?style=paper">changeset</a></li>
214 215 <li><a href="/file/xyzzy?style=paper">browse</a></li>
215 216 <li><a href="/file/xyzzy/foo?style=paper">file</a></li>
216 217 <li><a href="/file/tip/foo?style=paper">latest</a></li>
217 218 <li><a href="/diff/xyzzy/foo?style=paper">diff</a></li>
218 219 <li><a href="/annotate/xyzzy/foo?style=paper">annotate</a></li>
219 220 <li><a href="/log/xyzzy/foo?style=paper">file log</a></li>
220 221 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
221 222 comparison foo @ 1:<a href="/rev/a7c1559b7bba?style=paper">a7c1559b7bba</a>
222 223 <td><a href="/file/43c799df6e75/foo?style=paper">43c799df6e75</a> </td>
223 224 <td><a href="/file/9d8c40cba617/foo?style=paper">9d8c40cba617</a> </td>
224 225
225 226 (De)referencing symbolic revisions (coal)
226 227
227 228 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=coal' | egrep $REVLINKS
228 229 <li><a href="/graph/tip?style=coal">graph</a></li>
229 230 <li><a href="/rev/tip?style=coal">changeset</a></li>
230 231 <li><a href="/file/tip?style=coal">browse</a></li>
231 232 <a href="/archive/tip.zip">zip</a>
232 233 <a href="/shortlog/tip?revcount=30&style=coal">less</a>
233 234 <a href="/shortlog/tip?revcount=120&style=coal">more</a>
234 235 | rev 2: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
235 236 <a href="/rev/9d8c40cba617?style=coal">third</a>
236 237 <a href="/rev/a7c1559b7bba?style=coal">second</a>
237 238 <a href="/rev/43c799df6e75?style=coal">first</a>
238 239 <a href="/shortlog/tip?revcount=30&style=coal">less</a>
239 240 <a href="/shortlog/tip?revcount=120&style=coal">more</a>
240 241 | rev 2: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
241 242
242 243 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=coal' | egrep $REVLINKS
243 244 <li><a href="/shortlog/tip?style=coal">log</a></li>
244 245 <li><a href="/rev/tip?style=coal">changeset</a></li>
245 246 <li><a href="/file/tip?style=coal">browse</a></li>
246 247 <a href="/graph/tip?revcount=30&style=coal">less</a>
247 248 <a href="/graph/tip?revcount=120&style=coal">more</a>
248 249 | rev 2: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
249 250 <a href="/graph/tip?revcount=30&style=coal">less</a>
250 251 <a href="/graph/tip?revcount=120&style=coal">more</a>
251 252 | rev 2: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
252 253
253 254 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=coal' | egrep $REVLINKS
254 255 <li><a href="/shortlog/tip?style=coal">log</a></li>
255 256 <li><a href="/graph/tip?style=coal">graph</a></li>
256 257 <li><a href="/rev/tip?style=coal">changeset</a></li>
257 258 <a href="/archive/tip.zip">zip</a>
258 259 directory / @ 2:<a href="/rev/9d8c40cba617?style=coal">9d8c40cba617</a>
259 260 <td class="name"><a href="/file/tip/?style=coal">[up]</a></td>
260 261 <a href="/file/tip/dir?style=coal">
261 262 <a href="/file/tip/dir/?style=coal">
262 263 <a href="/file/tip/foo?style=coal">
263 264
264 265 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=coal' | egrep $REVLINKS
265 266 <a href="/shortlog/default?style=coal" class="open">
266 267 <a href="/shortlog/9d8c40cba617?style=coal" class="open">
267 268
268 269 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=coal' | egrep $REVLINKS
269 270 <a href="/rev/tip?style=coal">
270 271 <a href="/rev/9d8c40cba617?style=coal">
271 272
272 273 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=coal' | egrep $REVLINKS
273 274 <a href="/rev/xyzzy?style=coal">
274 275 <a href="/rev/a7c1559b7bba?style=coal">
275 276
276 277 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=coal&rev=all()' | egrep $REVLINKS
277 278 <a href="/rev/9d8c40cba617?style=coal">third</a>
278 279 <a href="/rev/a7c1559b7bba?style=coal">second</a>
279 280 <a href="/rev/43c799df6e75?style=coal">first</a>
280 281
281 282 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=coal' | egrep $REVLINKS
282 283 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
283 284 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
284 285 <li><a href="/raw-rev/xyzzy?style=coal">raw</a></li>
285 286 <li><a href="/file/xyzzy?style=coal">browse</a></li>
286 287 <a href="/archive/xyzzy.zip">zip</a>
287 288 changeset 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
288 289 <td class="author"><a href="/rev/43c799df6e75?style=coal">43c799df6e75</a> </td>
289 290 <td class="author"> <a href="/rev/9d8c40cba617?style=coal">9d8c40cba617</a></td>
290 291 <td class="files"><a href="/file/a7c1559b7bba/foo?style=coal">foo</a> </td>
291 292
292 293 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=coal' | egrep $REVLINKS
293 294 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
294 295 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
295 296 <li><a href="/file/xyzzy?style=coal">browse</a></li>
296 297 <a href="/archive/xyzzy.zip">zip</a>
297 298 <a href="/shortlog/xyzzy?revcount=30&style=coal">less</a>
298 299 <a href="/shortlog/xyzzy?revcount=120&style=coal">more</a>
299 300 | rev 1: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
300 301 <a href="/rev/a7c1559b7bba?style=coal">second</a>
301 302 <a href="/rev/43c799df6e75?style=coal">first</a>
302 303 <a href="/shortlog/xyzzy?revcount=30&style=coal">less</a>
303 304 <a href="/shortlog/xyzzy?revcount=120&style=coal">more</a>
304 305 | rev 1: <a href="/shortlog/43c799df6e75?style=coal">(0)</a> <a href="/shortlog/tip?style=coal">tip</a>
305 306
306 307 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=coal' | egrep $REVLINKS
307 308 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
308 309 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
309 310 <li><a href="/file/xyzzy?style=coal">browse</a></li>
310 311 <a href="/graph/xyzzy?revcount=30&style=coal">less</a>
311 312 <a href="/graph/xyzzy?revcount=120&style=coal">more</a>
312 313 | rev 1: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
313 314 <a href="/graph/xyzzy?revcount=30&style=coal">less</a>
314 315 <a href="/graph/xyzzy?revcount=120&style=coal">more</a>
315 316 | rev 1: <a href="/graph/43c799df6e75?style=coal">(0)</a> <a href="/graph/tip?style=coal">tip</a>
316 317
317 318 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=coal' | egrep $REVLINKS
318 319 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
319 320 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
320 321 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
321 322 <a href="/archive/xyzzy.zip">zip</a>
322 323 directory / @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
323 324 <td class="name"><a href="/file/xyzzy/?style=coal">[up]</a></td>
324 325 <a href="/file/xyzzy/dir?style=coal">
325 326 <a href="/file/xyzzy/dir/?style=coal">
326 327 <a href="/file/xyzzy/foo?style=coal">
327 328
328 329 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=coal' | egrep $REVLINKS
329 330 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
330 331 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
331 332 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
332 333 <li><a href="/file/xyzzy/?style=coal">browse</a></li>
333 334 <li><a href="/file/tip/foo?style=coal">latest</a></li>
334 335 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
335 336 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
336 337 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
337 338 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
338 339 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
339 340 view foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
340 341 <td class="author"><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
341 342 <td class="author"><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
342 343
343 344 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=coal' | egrep $REVLINKS
344 345 href="/atom-log/tip/foo" title="Atom feed for test:foo" />
345 346 href="/rss-log/tip/foo" title="RSS feed for test:foo" />
346 347 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
347 348 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
348 349 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
349 350 <li><a href="/file/xyzzy?style=coal">browse</a></li>
350 351 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
351 352 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
352 353 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
353 354 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
354 355 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
355 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 358 <a href="/log/xyzzy/foo?revcount=30&style=coal">less</a>
357 359 <a href="/log/xyzzy/foo?revcount=120&style=coal">more</a>
358 360 | <a href="/log/43c799df6e75/foo?style=coal">(0)</a> <a href="/log/tip/foo?style=coal">tip</a> </div>
359 361 <a href="/rev/a7c1559b7bba?style=coal">second</a>
360 362 <a href="/rev/43c799df6e75?style=coal">first</a>
361 363 <a href="/log/xyzzy/foo?revcount=30&style=coal">less</a>
362 364 <a href="/log/xyzzy/foo?revcount=120&style=coal">more</a>
363 365 | <a href="/log/43c799df6e75/foo?style=coal">(0)</a> <a href="/log/tip/foo?style=coal">tip</a>
364 366
365 367 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=coal' | egrep $REVLINKS
366 368 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
367 369 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
368 370 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
369 371 <li><a href="/file/xyzzy/?style=coal">browse</a></li>
370 372 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
371 373 <li><a href="/file/tip/foo?style=coal">latest</a></li>
372 374 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
373 375 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
374 376 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
375 377 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
376 378 annotate foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
377 379 <td class="author"><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
378 380 <td class="author"><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
379 381 <a href="/annotate/43c799df6e75/foo?style=coal#l1"
380 382 <a href="/annotate/a7c1559b7bba/foo?style=coal#l2"
381 383
382 384 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=coal' | egrep $REVLINKS
383 385 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
384 386 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
385 387 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
386 388 <li><a href="/file/xyzzy?style=coal">browse</a></li>
387 389 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
388 390 <li><a href="/file/tip/foo?style=coal">latest</a></li>
389 391 <li><a href="/comparison/xyzzy/foo?style=coal">comparison</a></li>
390 392 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
391 393 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
392 394 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
393 395 diff foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
394 396 <td><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
395 397 <td><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
396 398
397 399 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=coal' | egrep $REVLINKS
398 400 <li><a href="/shortlog/xyzzy?style=coal">log</a></li>
399 401 <li><a href="/graph/xyzzy?style=coal">graph</a></li>
400 402 <li><a href="/rev/xyzzy?style=coal">changeset</a></li>
401 403 <li><a href="/file/xyzzy?style=coal">browse</a></li>
402 404 <li><a href="/file/xyzzy/foo?style=coal">file</a></li>
403 405 <li><a href="/file/tip/foo?style=coal">latest</a></li>
404 406 <li><a href="/diff/xyzzy/foo?style=coal">diff</a></li>
405 407 <li><a href="/annotate/xyzzy/foo?style=coal">annotate</a></li>
406 408 <li><a href="/log/xyzzy/foo?style=coal">file log</a></li>
407 409 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
408 410 comparison foo @ 1:<a href="/rev/a7c1559b7bba?style=coal">a7c1559b7bba</a>
409 411 <td><a href="/file/43c799df6e75/foo?style=coal">43c799df6e75</a> </td>
410 412 <td><a href="/file/9d8c40cba617/foo?style=coal">9d8c40cba617</a> </td>
411 413
412 414 (De)referencing symbolic revisions (gitweb)
413 415
414 416 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'summary?style=gitweb' | egrep $REVLINKS
415 417 <a href="/file?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
416 418 <a class="list" href="/rev/9d8c40cba617?style=gitweb">
417 419 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
418 420 <a href="/file/9d8c40cba617?style=gitweb">files</a>
419 421 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
420 422 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
421 423 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
422 424 <a class="list" href="/rev/43c799df6e75?style=gitweb">
423 425 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
424 426 <a href="/file/43c799df6e75?style=gitweb">files</a>
425 427 <td><a class="list" href="/rev/xyzzy?style=gitweb"><b>xyzzy</b></a></td>
426 428 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
427 429 <a href="/log/a7c1559b7bba?style=gitweb">changelog</a> |
428 430 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
429 431 <td class="open"><a class="list" href="/shortlog/default?style=gitweb"><b>default</b></a></td>
430 432 <a href="/changeset/9d8c40cba617?style=gitweb">changeset</a> |
431 433 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
432 434 <a href="/file/9d8c40cba617?style=gitweb">files</a>
433 435
434 436 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=gitweb' | egrep $REVLINKS
435 437 <a href="/log/tip?style=gitweb">changelog</a> |
436 438 <a href="/graph/tip?style=gitweb">graph</a> |
437 439 <a href="/file/tip?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
438 440 <br/><a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a> <br/>
439 441 <a class="list" href="/rev/9d8c40cba617?style=gitweb">
440 442 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
441 443 <a href="/file/9d8c40cba617?style=gitweb">files</a>
442 444 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
443 445 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
444 446 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
445 447 <a class="list" href="/rev/43c799df6e75?style=gitweb">
446 448 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
447 449 <a href="/file/43c799df6e75?style=gitweb">files</a>
448 450 <a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a>
449 451
450 452 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=gitweb' | egrep $REVLINKS
451 453 <a href="/shortlog/tip?style=gitweb">shortlog</a> |
452 454 <a href="/graph/tip?style=gitweb">graph</a> |
453 455 <a href="/file/tip?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a> |
454 456 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
455 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 458 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a><br/>
457 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 460 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
459 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 462 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
461 463 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
462 464
463 465 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=gitweb' | egrep $REVLINKS
464 466 <a href="/shortlog/tip?style=gitweb">shortlog</a> |
465 467 <a href="/log/tip?style=gitweb">changelog</a> |
466 468 <a href="/file/tip?style=gitweb">files</a> |
467 469 <a href="/graph/tip?revcount=30&style=gitweb">less</a>
468 470 <a href="/graph/tip?revcount=120&style=gitweb">more</a>
469 471 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
470 472 <a href="/graph/tip?revcount=30&style=gitweb">less</a>
471 473 <a href="/graph/tip?revcount=120&style=gitweb">more</a>
472 474 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a>
473 475
474 476 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=gitweb' | egrep $REVLINKS
475 477 <td><a class="list" href="/rev/tip?style=gitweb"><b>tip</b></a></td>
476 478 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a> |
477 479 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
478 480 <a href="/file/9d8c40cba617?style=gitweb">files</a>
479 481
480 482 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=gitweb' | egrep $REVLINKS
481 483 <td><a class="list" href="/rev/xyzzy?style=gitweb"><b>xyzzy</b></a></td>
482 484 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
483 485 <a href="/log/a7c1559b7bba?style=gitweb">changelog</a> |
484 486 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
485 487
486 488 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=gitweb' | egrep $REVLINKS
487 489 <td class="open"><a class="list" href="/shortlog/default?style=gitweb"><b>default</b></a></td>
488 490 <a href="/changeset/9d8c40cba617?style=gitweb">changeset</a> |
489 491 <a href="/log/9d8c40cba617?style=gitweb">changelog</a> |
490 492 <a href="/file/9d8c40cba617?style=gitweb">files</a>
491 493
492 494 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=gitweb' | egrep $REVLINKS
493 495 <a href="/rev/tip?style=gitweb">changeset</a> | <a href="/archive/tip.zip">zip</a> |
494 496 <td><a href="/file/tip/?style=gitweb">[up]</a></td>
495 497 <a href="/file/tip/dir?style=gitweb">dir</a>
496 498 <a href="/file/tip/dir/?style=gitweb"></a>
497 499 <a href="/file/tip/dir?style=gitweb">files</a>
498 500 <a class="list" href="/file/tip/foo?style=gitweb">foo</a>
499 501 <a href="/file/tip/foo?style=gitweb">file</a> |
500 502 <a href="/log/tip/foo?style=gitweb">revisions</a> |
501 503 <a href="/annotate/tip/foo?style=gitweb">annotate</a>
502 504
503 505 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=gitweb&rev=all()' | egrep $REVLINKS
504 506 <a href="/file?style=gitweb">files</a> | <a href="/archive/tip.zip">zip</a>
505 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 508 <a href="/rev/9d8c40cba617?style=gitweb">changeset</a><br/>
507 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 510 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
509 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 512 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
511 513
512 514 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=gitweb' | egrep $REVLINKS
513 515 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
514 516 <a href="/log/xyzzy?style=gitweb">changelog</a> |
515 517 <a href="/graph/xyzzy?style=gitweb">graph</a> |
516 518 <a href="/file/xyzzy?style=gitweb">files</a> |
517 519 <a href="/raw-rev/xyzzy">raw</a> | <a href="/archive/xyzzy.zip">zip</a> |
518 520 <a class="title" href="/raw-rev/a7c1559b7bba">second <span class="logtags"><span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a>
519 521 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
520 522 <a class="list" href="/rev/43c799df6e75?style=gitweb">43c799df6e75</a>
521 523 <a class="list" href="/rev/9d8c40cba617?style=gitweb">9d8c40cba617</a>
522 524 <td><a class="list" href="/diff/a7c1559b7bba/foo?style=gitweb">foo</a></td>
523 525 <a href="/file/a7c1559b7bba/foo?style=gitweb">file</a> |
524 526 <a href="/annotate/a7c1559b7bba/foo?style=gitweb">annotate</a> |
525 527 <a href="/diff/a7c1559b7bba/foo?style=gitweb">diff</a> |
526 528 <a href="/comparison/a7c1559b7bba/foo?style=gitweb">comparison</a> |
527 529 <a href="/log/a7c1559b7bba/foo?style=gitweb">revisions</a>
528 530
529 531 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=gitweb' | egrep $REVLINKS
530 532 <a href="/log/xyzzy?style=gitweb">changelog</a> |
531 533 <a href="/graph/xyzzy?style=gitweb">graph</a> |
532 534 <a href="/file/xyzzy?style=gitweb">files</a> | <a href="/archive/xyzzy.zip">zip</a> |
533 535 <br/><a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a> <br/>
534 536 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
535 537 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a> |
536 538 <a href="/file/a7c1559b7bba?style=gitweb">files</a>
537 539 <a class="list" href="/rev/43c799df6e75?style=gitweb">
538 540 <a href="/rev/43c799df6e75?style=gitweb">changeset</a> |
539 541 <a href="/file/43c799df6e75?style=gitweb">files</a>
540 542 <a href="/shortlog/43c799df6e75?style=gitweb">(0)</a> <a href="/shortlog/tip?style=gitweb">tip</a>
541 543
542 544 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=gitweb' | egrep $REVLINKS
543 545 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
544 546 <a href="/graph/xyzzy?style=gitweb">graph</a> |
545 547 <a href="/file/xyzzy?style=gitweb">files</a> | <a href="/archive/xyzzy.zip">zip</a> |
546 548 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
547 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 550 <a href="/rev/a7c1559b7bba?style=gitweb">changeset</a><br/>
549 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 552 <a href="/rev/43c799df6e75?style=gitweb">changeset</a><br/>
551 553 <a href="/log/43c799df6e75?style=gitweb">(0)</a> <a href="/log/tip?style=gitweb">tip</a> <br/>
552 554
553 555 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=gitweb' | egrep $REVLINKS
554 556 <a href="/shortlog/xyzzy?style=gitweb">shortlog</a> |
555 557 <a href="/log/xyzzy?style=gitweb">changelog</a> |
556 558 <a href="/file/xyzzy?style=gitweb">files</a> |
557 559 <a href="/graph/xyzzy?revcount=30&style=gitweb">less</a>
558 560 <a href="/graph/xyzzy?revcount=120&style=gitweb">more</a>
559 561 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
560 562 <a href="/graph/xyzzy?revcount=30&style=gitweb">less</a>
561 563 <a href="/graph/xyzzy?revcount=120&style=gitweb">more</a>
562 564 | <a href="/graph/43c799df6e75?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a>
563 565
564 566 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=gitweb' | egrep $REVLINKS
565 567 <a href="/rev/xyzzy?style=gitweb">changeset</a> | <a href="/archive/xyzzy.zip">zip</a> |
566 568 <td><a href="/file/xyzzy/?style=gitweb">[up]</a></td>
567 569 <a href="/file/xyzzy/dir?style=gitweb">dir</a>
568 570 <a href="/file/xyzzy/dir/?style=gitweb"></a>
569 571 <a href="/file/xyzzy/dir?style=gitweb">files</a>
570 572 <a class="list" href="/file/xyzzy/foo?style=gitweb">foo</a>
571 573 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
572 574 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
573 575 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a>
574 576
575 577 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=gitweb' | egrep $REVLINKS
576 578 <a href="/file/xyzzy/?style=gitweb">files</a> |
577 579 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
578 580 <a href="/file/tip/foo?style=gitweb">latest</a> |
579 581 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
580 582 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
581 583 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
582 584 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
583 585 <a href="/raw-file/xyzzy/foo">raw</a> |
584 586 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
585 587 <a class="list" href="/file/43c799df6e75/foo?style=gitweb">
586 588 <a class="list" href="/file/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a></td>
587 589
588 590 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=gitweb' | egrep $REVLINKS
589 591 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
590 592 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
591 593 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
592 594 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
593 595 <a href="/rss-log/tip/foo">rss</a> |
594 596 <a href="/log/43c799df6e75/foo?style=gitweb">(0)</a> <a href="/log/tip/foo?style=gitweb">tip</a>
595 597 <a class="list" href="/rev/a7c1559b7bba?style=gitweb">
596 598 <a href="/file/a7c1559b7bba/foo?style=gitweb">file</a> |
597 599 <a href="/diff/a7c1559b7bba/foo?style=gitweb">diff</a> |
598 600 <a href="/annotate/a7c1559b7bba/foo?style=gitweb">annotate</a>
599 601 <a class="list" href="/rev/43c799df6e75?style=gitweb">
600 602 <a href="/file/43c799df6e75/foo?style=gitweb">file</a> |
601 603 <a href="/diff/43c799df6e75/foo?style=gitweb">diff</a> |
602 604 <a href="/annotate/43c799df6e75/foo?style=gitweb">annotate</a>
603 605 <a href="/log/43c799df6e75/foo?style=gitweb">(0)</a> <a href="/log/tip/foo?style=gitweb">tip</a>
604 606
605 607 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=gitweb' | egrep $REVLINKS
606 608 <a href="/file/xyzzy/?style=gitweb">files</a> |
607 609 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
608 610 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
609 611 <a href="/file/tip/foo?style=gitweb">latest</a> |
610 612 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
611 613 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
612 614 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
613 615 <a href="/raw-annotate/xyzzy/foo">raw</a> |
614 616 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
615 617 <a class="list" href="/annotate/43c799df6e75/foo?style=gitweb">
616 618 <a class="list" href="/annotate/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a></td>
617 619 <a href="/annotate/43c799df6e75/foo?style=gitweb#l1"
618 620 <a href="/annotate/a7c1559b7bba/foo?style=gitweb#l2"
619 621
620 622 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=gitweb' | egrep $REVLINKS
621 623 <a href="/file/xyzzy?style=gitweb">files</a> |
622 624 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
623 625 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
624 626 <a href="/file/tip/foo?style=gitweb">latest</a> |
625 627 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
626 628 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
627 629 <a href="/comparison/xyzzy/foo?style=gitweb">comparison</a> |
628 630 <a href="/raw-diff/xyzzy/foo">raw</a> |
629 631 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
630 632 <a class="list" href="/diff/43c799df6e75/foo?style=gitweb">
631 633 <a class="list" href="/diff/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a>
632 634
633 635 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=gitweb' | egrep $REVLINKS
634 636 <a href="/file/xyzzy?style=gitweb">files</a> |
635 637 <a href="/rev/xyzzy?style=gitweb">changeset</a> |
636 638 <a href="/file/xyzzy/foo?style=gitweb">file</a> |
637 639 <a href="/file/tip/foo?style=gitweb">latest</a> |
638 640 <a href="/log/xyzzy/foo?style=gitweb">revisions</a> |
639 641 <a href="/annotate/xyzzy/foo?style=gitweb">annotate</a> |
640 642 <a href="/diff/xyzzy/foo?style=gitweb">diff</a> |
641 643 <a href="/raw-diff/xyzzy/foo">raw</a> |
642 644 <td style="font-family:monospace"><a class="list" href="/rev/a7c1559b7bba?style=gitweb">a7c1559b7bba</a></td>
643 645 <a class="list" href="/comparison/43c799df6e75/foo?style=gitweb">
644 646 <a class="list" href="/comparison/9d8c40cba617/foo?style=gitweb">9d8c40cba617</a>
645 647
646 648 (De)referencing symbolic revisions (monoblue)
647 649
648 650 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'summary?style=monoblue' | egrep $REVLINKS
649 651 <li><a href="/archive/tip.zip">zip</a></li>
650 652 <a href="/rev/9d8c40cba617?style=monoblue">
651 653 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
652 654 <a href="/file/9d8c40cba617?style=monoblue">files</a>
653 655 <a href="/rev/a7c1559b7bba?style=monoblue">
654 656 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
655 657 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
656 658 <a href="/rev/43c799df6e75?style=monoblue">
657 659 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
658 660 <a href="/file/43c799df6e75?style=monoblue">files</a>
659 661 <td><a href="/rev/xyzzy?style=monoblue">xyzzy</a></td>
660 662 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
661 663 <a href="/log/a7c1559b7bba?style=monoblue">changelog</a> |
662 664 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
663 665 <td class="open"><a href="/shortlog/default?style=monoblue">default</a></td>
664 666 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
665 667 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
666 668 <a href="/file/9d8c40cba617?style=monoblue">files</a>
667 669
668 670 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=monoblue' | egrep $REVLINKS
669 671 <li><a href="/graph/tip?style=monoblue">graph</a></li>
670 672 <li><a href="/file/tip?style=monoblue">files</a></li>
671 673 <li><a href="/archive/tip.zip">zip</a></li>
672 674 <a href="/rev/9d8c40cba617?style=monoblue">
673 675 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
674 676 <a href="/file/9d8c40cba617?style=monoblue">files</a>
675 677 <a href="/rev/a7c1559b7bba?style=monoblue">
676 678 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
677 679 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
678 680 <a href="/rev/43c799df6e75?style=monoblue">
679 681 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
680 682 <a href="/file/43c799df6e75?style=monoblue">files</a>
681 683 <a href="/shortlog/43c799df6e75?style=monoblue">(0)</a> <a href="/shortlog/tip?style=monoblue">tip</a>
682 684
683 685 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=monoblue' | egrep $REVLINKS
684 686 <li><a href="/graph/tip?style=monoblue">graph</a></li>
685 687 <li><a href="/file/tip?style=monoblue">files</a></li>
686 688 <li><a href="/archive/tip.zip">zip</a></li>
687 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 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 691 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
690 692 <a href="/log/43c799df6e75?style=monoblue">(0)</a> <a href="/log/tip?style=monoblue">tip</a>
691 693
692 694 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=monoblue' | egrep $REVLINKS
693 695 <li><a href="/file/tip?style=monoblue">files</a></li>
694 696 <a href="/graph/tip?revcount=30&style=monoblue">less</a>
695 697 <a href="/graph/tip?revcount=120&style=monoblue">more</a>
696 698 | <a href="/graph/43c799df6e75?style=monoblue">(0)</a> <a href="/graph/tip?style=monoblue">tip</a>
697 699
698 700 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=monoblue' | egrep $REVLINKS
699 701 <td><a href="/rev/tip?style=monoblue">tip</a></td>
700 702 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
701 703 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
702 704 <a href="/file/9d8c40cba617?style=monoblue">files</a>
703 705
704 706 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'bookmarks?style=monoblue' | egrep $REVLINKS
705 707 <td><a href="/rev/xyzzy?style=monoblue">xyzzy</a></td>
706 708 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
707 709 <a href="/log/a7c1559b7bba?style=monoblue">changelog</a> |
708 710 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
709 711
710 712 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=monoblue' | egrep $REVLINKS
711 713 <td class="open"><a href="/shortlog/default?style=monoblue">default</a></td>
712 714 <a href="/rev/9d8c40cba617?style=monoblue">changeset</a> |
713 715 <a href="/log/9d8c40cba617?style=monoblue">changelog</a> |
714 716 <a href="/file/9d8c40cba617?style=monoblue">files</a>
715 717
716 718 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=monoblue' | egrep $REVLINKS
717 719 <li><a href="/graph/tip?style=monoblue">graph</a></li>
718 720 <li><a href="/rev/tip?style=monoblue">changeset</a></li>
719 721 <li><a href="/archive/tip.zip">zip</a></li>
720 722 <td><a href="/file/tip/?style=monoblue">[up]</a></td>
721 723 <a href="/file/tip/dir?style=monoblue">dir</a>
722 724 <a href="/file/tip/dir/?style=monoblue"></a>
723 725 <td><a href="/file/tip/dir?style=monoblue">files</a></td>
724 726 <td><a href="/file/tip/foo?style=monoblue">foo</a></td>
725 727 <a href="/file/tip/foo?style=monoblue">file</a> |
726 728 <a href="/log/tip/foo?style=monoblue">revisions</a> |
727 729 <a href="/annotate/tip/foo?style=monoblue">annotate</a>
728 730
729 731 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=monoblue&rev=all()' | egrep $REVLINKS
730 732 <li><a href="/archive/tip.zip">zip</a></li>
731 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 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 735 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
734 736
735 737 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=monoblue' | egrep $REVLINKS
736 738 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
737 739 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
738 740 <li><a href="/raw-rev/xyzzy">raw</a></li>
739 741 <li><a href="/archive/xyzzy.zip">zip</a></li>
740 742 <h3 class="changeset"><a href="/raw-rev/a7c1559b7bba">second <span class="logtags"><span class="bookmarktag" title="xyzzy">xyzzy</span> </span></a></h3>
741 743 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
742 744 <dd><a href="/rev/43c799df6e75?style=monoblue">43c799df6e75</a></dd>
743 745 <dd><a href="/rev/9d8c40cba617?style=monoblue">9d8c40cba617</a></dd>
744 746 <td><a href="/diff/a7c1559b7bba/foo?style=monoblue">foo</a></td>
745 747 <a href="/file/a7c1559b7bba/foo?style=monoblue">file</a> |
746 748 <a href="/annotate/a7c1559b7bba/foo?style=monoblue">annotate</a> |
747 749 <a href="/diff/a7c1559b7bba/foo?style=monoblue">diff</a> |
748 750 <a href="/comparison/a7c1559b7bba/foo?style=monoblue">comparison</a> |
749 751 <a href="/log/a7c1559b7bba/foo?style=monoblue">revisions</a>
750 752
751 753 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=monoblue' | egrep $REVLINKS
752 754 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
753 755 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
754 756 <li><a href="/archive/xyzzy.zip">zip</a></li>
755 757 <a href="/rev/a7c1559b7bba?style=monoblue">
756 758 <a href="/rev/a7c1559b7bba?style=monoblue">changeset</a> |
757 759 <a href="/file/a7c1559b7bba?style=monoblue">files</a>
758 760 <a href="/rev/43c799df6e75?style=monoblue">
759 761 <a href="/rev/43c799df6e75?style=monoblue">changeset</a> |
760 762 <a href="/file/43c799df6e75?style=monoblue">files</a>
761 763 <a href="/shortlog/43c799df6e75?style=monoblue">(0)</a> <a href="/shortlog/tip?style=monoblue">tip</a>
762 764
763 765 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=monoblue' | egrep $REVLINKS
764 766 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
765 767 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
766 768 <li><a href="/archive/xyzzy.zip">zip</a></li>
767 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 770 <h3 class="changelog"><a class="title" href="/rev/43c799df6e75?style=monoblue">first<span class="logtags"> </span></a></h3>
769 771 <a href="/log/43c799df6e75?style=monoblue">(0)</a> <a href="/log/tip?style=monoblue">tip</a>
770 772
771 773 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=monoblue' | egrep $REVLINKS
772 774 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
773 775 <a href="/graph/xyzzy?revcount=30&style=monoblue">less</a>
774 776 <a href="/graph/xyzzy?revcount=120&style=monoblue">more</a>
775 777 | <a href="/graph/43c799df6e75?style=monoblue">(0)</a> <a href="/graph/tip?style=monoblue">tip</a>
776 778
777 779 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=monoblue' | egrep $REVLINKS
778 780 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
779 781 <li><a href="/rev/xyzzy?style=monoblue">changeset</a></li>
780 782 <li><a href="/archive/xyzzy.zip">zip</a></li>
781 783 <td><a href="/file/xyzzy/?style=monoblue">[up]</a></td>
782 784 <a href="/file/xyzzy/dir?style=monoblue">dir</a>
783 785 <a href="/file/xyzzy/dir/?style=monoblue"></a>
784 786 <td><a href="/file/xyzzy/dir?style=monoblue">files</a></td>
785 787 <td><a href="/file/xyzzy/foo?style=monoblue">foo</a></td>
786 788 <a href="/file/xyzzy/foo?style=monoblue">file</a> |
787 789 <a href="/log/xyzzy/foo?style=monoblue">revisions</a> |
788 790 <a href="/annotate/xyzzy/foo?style=monoblue">annotate</a>
789 791
790 792 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=monoblue' | egrep $REVLINKS
791 793 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
792 794 <li><a href="/file/xyzzy/?style=monoblue">files</a></li>
793 795 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
794 796 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
795 797 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
796 798 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
797 799 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
798 800 <li><a href="/raw-file/xyzzy/foo">raw</a></li>
799 801 <dd><a class="list" href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
800 802 <a href="/file/43c799df6e75/foo?style=monoblue">
801 803 <a href="/file/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a>
802 804
803 805 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=monoblue' | egrep $REVLINKS
804 806 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
805 807 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
806 808 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
807 809 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
808 810 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
809 811 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
810 812 <li><a href="/rss-log/tip/foo">rss</a></li>
811 813 <a href="/rev/a7c1559b7bba?style=monoblue">
812 814 <a href="/file/a7c1559b7bba/foo?style=monoblue">file</a> |
813 815 <a href="/diff/a7c1559b7bba/foo?style=monoblue">diff</a> |
814 816 <a href="/annotate/a7c1559b7bba/foo?style=monoblue">annotate</a>
815 817 <a href="/rev/43c799df6e75?style=monoblue">
816 818 <a href="/file/43c799df6e75/foo?style=monoblue">file</a> |
817 819 <a href="/diff/43c799df6e75/foo?style=monoblue">diff</a> |
818 820 <a href="/annotate/43c799df6e75/foo?style=monoblue">annotate</a>
819 821 <a href="/log/43c799df6e75/foo?style=monoblue">(0)</a> <a href="/log/tip/foo?style=monoblue">tip</a>
820 822
821 823 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=monoblue' | egrep $REVLINKS
822 824 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
823 825 <li><a href="/file/xyzzy/?style=monoblue">files</a></li>
824 826 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
825 827 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
826 828 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
827 829 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
828 830 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
829 831 <li><a href="/raw-annotate/xyzzy/foo">raw</a></li>
830 832 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
831 833 <a href="/annotate/43c799df6e75/foo?style=monoblue">
832 834 <a href="/annotate/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a>
833 835 <a href="/annotate/43c799df6e75/foo?style=monoblue#l1"
834 836 <a href="/annotate/a7c1559b7bba/foo?style=monoblue#l2"
835 837
836 838 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=monoblue' | egrep $REVLINKS
837 839 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
838 840 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
839 841 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
840 842 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
841 843 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
842 844 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
843 845 <li><a href="/comparison/xyzzy/foo?style=monoblue">comparison</a></li>
844 846 <li><a href="/raw-diff/xyzzy/foo">raw</a></li>
845 847 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
846 848 <dd><a href="/diff/43c799df6e75/foo?style=monoblue">43c799df6e75</a></dd>
847 849 <dd><a href="/diff/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a></dd>
848 850
849 851 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'comparison/xyzzy/foo?style=monoblue' | egrep $REVLINKS
850 852 <li><a href="/graph/xyzzy?style=monoblue">graph</a></li>
851 853 <li><a href="/file/xyzzy?style=monoblue">files</a></li>
852 854 <li><a href="/file/xyzzy/foo?style=monoblue">file</a></li>
853 855 <li><a href="/file/tip/foo?style=monoblue">latest</a></li>
854 856 <li><a href="/log/xyzzy/foo?style=monoblue">revisions</a></li>
855 857 <li><a href="/annotate/xyzzy/foo?style=monoblue">annotate</a></li>
856 858 <li><a href="/diff/xyzzy/foo?style=monoblue">diff</a></li>
857 859 <li><a href="/raw-diff/xyzzy/foo">raw</a></li>
858 860 <dd><a href="/rev/a7c1559b7bba?style=monoblue">a7c1559b7bba</a></dd>
859 861 <dd><a href="/comparison/43c799df6e75/foo?style=monoblue">43c799df6e75</a></dd>
860 862 <dd><a href="/comparison/9d8c40cba617/foo?style=monoblue">9d8c40cba617</a></dd>
861 863
862 864 (De)referencing symbolic revisions (spartan)
863 865
864 866 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=spartan' | egrep $REVLINKS
865 867 <a href="/log/tip?style=spartan">changelog</a>
866 868 <a href="/graph/tip?style=spartan">graph</a>
867 869 <a href="/file/tip/?style=spartan">files</a>
868 870 <a href="/archive/tip.zip">zip</a>
869 871 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
870 872 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">third</a></td>
871 873 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">second</a></td>
872 874 <td class="node"><a href="/rev/43c799df6e75?style=spartan">first</a></td>
873 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 877 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?style=spartan' | egrep $REVLINKS
876 878 <a href="/shortlog/tip?style=spartan">shortlog</a>
877 879 <a href="/graph/tip?style=spartan">graph</a>
878 880 <a href="/file/tip?style=spartan">files</a>
879 881 <a href="/archive/tip.zip">zip</a>
880 882 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
881 883 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
882 884 <th class="files"><a href="/file/9d8c40cba617?style=spartan">files</a>:</th>
883 885 <td class="files"><a href="/diff/9d8c40cba617/foo?style=spartan">foo</a> </td>
884 886 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
885 887 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
886 888 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
887 889 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
888 890 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
889 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 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 894 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph?style=spartan' | egrep $REVLINKS
893 895 <a href="/log/tip?style=spartan">changelog</a>
894 896 <a href="/shortlog/tip?style=spartan">shortlog</a>
895 897 <a href="/file/tip/?style=spartan">files</a>
896 898 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
897 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 901 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'tags?style=spartan' | egrep $REVLINKS
900 902 <a href="/rev/9d8c40cba617?style=spartan">tip</a>
901 903
902 904 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'branches?style=spartan' | egrep $REVLINKS
903 905 <a href="/shortlog/9d8c40cba617?style=spartan" class="open">default</a>
904 906
905 907 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file?style=spartan' | egrep $REVLINKS
906 908 <a href="/log/tip?style=spartan">changelog</a>
907 909 <a href="/shortlog/tip?style=spartan">shortlog</a>
908 910 <a href="/graph/tip?style=spartan">graph</a>
909 911 <a href="/rev/tip?style=spartan">changeset</a>
910 912 <a href="/archive/tip.zip">zip</a>
911 913 <h2><a href="/">Mercurial</a> / files for changeset <a href="/rev/9d8c40cba617">9d8c40cba617</a>: /</h2>
912 914 <td><a href="/file/tip/?style=spartan">[up]</a>
913 915 <a href="/file/tip/dir?style=spartan">dir/</a>
914 916 <a href="/file/tip/dir/?style=spartan">
915 917 <td><a href="/file/tip/foo?style=spartan">foo</a>
916 918
917 919 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog?style=spartan&rev=all()' | egrep $REVLINKS
918 920 <a href="/archive/tip.zip">zip</a>
919 921 <td class="node"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
920 922 <a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a>
921 923 <th class="files"><a href="/file/9d8c40cba617?style=spartan">files</a>:</th>
922 924 <td class="files"><a href="/diff/9d8c40cba617/foo?style=spartan">foo</a> </td>
923 925 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
924 926 <a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a>
925 927 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
926 928 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
927 929 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
928 930 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
929 931 <td class="child"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
930 932 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
931 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 935 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/xyzzy?style=spartan' | egrep $REVLINKS
934 936 <a href="/log/xyzzy?style=spartan">changelog</a>
935 937 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
936 938 <a href="/graph/xyzzy?style=spartan">graph</a>
937 939 <a href="/file/xyzzy?style=spartan">files</a>
938 940 <a href="/raw-rev/xyzzy">raw</a>
939 941 <a href="/archive/xyzzy.zip">zip</a>
940 942 <td class="changeset"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
941 943 <td class="parent"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
942 944 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
943 945 <td class="files"><a href="/file/a7c1559b7bba/foo?style=spartan">foo</a> </td>
944 946
945 947 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/xyzzy?style=spartan' | egrep $REVLINKS
946 948 <a href="/log/xyzzy?style=spartan">changelog</a>
947 949 <a href="/graph/xyzzy?style=spartan">graph</a>
948 950 <a href="/file/xyzzy/?style=spartan">files</a>
949 951 <a href="/archive/xyzzy.zip">zip</a>
950 952 navigate: <small class="navigate"><a href="/shortlog/43c799df6e75?style=spartan">(0)</a> <a href="/shortlog/tip?style=spartan">tip</a> </small>
951 953 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">second</a></td>
952 954 <td class="node"><a href="/rev/43c799df6e75?style=spartan">first</a></td>
953 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 957 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy?style=spartan' | egrep $REVLINKS
956 958 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
957 959 <a href="/graph/xyzzy?style=spartan">graph</a>
958 960 <a href="/file/xyzzy?style=spartan">files</a>
959 961 <a href="/archive/xyzzy.zip">zip</a>
960 962 navigate: <small class="navigate"><a href="/log/43c799df6e75?style=spartan">(0)</a> <a href="/log/tip?style=spartan">tip</a> </small>
961 963 <td class="node"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
962 964 <th class="files"><a href="/file/a7c1559b7bba?style=spartan">files</a>:</th>
963 965 <td class="files"><a href="/diff/a7c1559b7bba/foo?style=spartan">foo</a> </td>
964 966 <td class="node"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
965 967 <th class="files"><a href="/file/43c799df6e75?style=spartan">files</a>:</th>
966 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 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 971 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/xyzzy?style=spartan' | egrep $REVLINKS
970 972 <a href="/log/xyzzy?style=spartan">changelog</a>
971 973 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
972 974 <a href="/file/xyzzy/?style=spartan">files</a>
973 975 navigate: <small class="navigate"><a href="/graph/43c799df6e75?style=spartan">(0)</a> <a href="/graph/tip?style=spartan">tip</a> </small>
974 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 978 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy?style=spartan' | egrep $REVLINKS
977 979 <a href="/log/xyzzy?style=spartan">changelog</a>
978 980 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
979 981 <a href="/graph/xyzzy?style=spartan">graph</a>
980 982 <a href="/rev/xyzzy?style=spartan">changeset</a>
981 983 <a href="/archive/xyzzy.zip">zip</a>
982 984 <h2><a href="/">Mercurial</a> / files for changeset <a href="/rev/a7c1559b7bba">a7c1559b7bba</a>: /</h2>
983 985 <td><a href="/file/xyzzy/?style=spartan">[up]</a>
984 986 <a href="/file/xyzzy/dir?style=spartan">dir/</a>
985 987 <a href="/file/xyzzy/dir/?style=spartan">
986 988 <td><a href="/file/xyzzy/foo?style=spartan">foo</a>
987 989
988 990 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/xyzzy/foo?style=spartan' | egrep $REVLINKS
989 991 <a href="/log/xyzzy?style=spartan">changelog</a>
990 992 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
991 993 <a href="/graph/xyzzy?style=spartan">graph</a>
992 994 <a href="/rev/xyzzy?style=spartan">changeset</a>
993 995 <a href="/file/xyzzy/?style=spartan">files</a>
994 996 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
995 997 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
996 998 <a href="/raw-file/xyzzy/foo">raw</a>
997 999 <td><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
998 1000 <a href="/file/43c799df6e75/foo?style=spartan">
999 1001 <td><a href="/file/9d8c40cba617/foo?style=spartan">9d8c40cba617</a></td>
1000 1002
1001 1003 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/xyzzy/foo?style=spartan' | egrep $REVLINKS
1002 1004 href="/atom-log/tip/foo" title="Atom feed for test:foo">
1003 1005 href="/rss-log/tip/foo" title="RSS feed for test:foo">
1004 1006 <a href="/file/xyzzy/foo?style=spartan">file</a>
1005 1007 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
1006 1008 <a type="application/rss+xml" href="/rss-log/tip/foo">rss</a>
1007 1009 <a type="application/atom+xml" href="/atom-log/tip/foo" title="Atom feed for test:foo">atom</a>
1008 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 1011 <th class="firstline"><a href="/rev/a7c1559b7bba?style=spartan">second</a></th>
1010 1012 <a href="/file/a7c1559b7bba/foo?style=spartan">a7c1559b7bba</a>
1011 1013 <a href="/diff/a7c1559b7bba/foo?style=spartan">(diff)</a>
1012 1014 <a href="/annotate/a7c1559b7bba/foo?style=spartan">(annotate)</a>
1013 1015 <th class="firstline"><a href="/rev/43c799df6e75?style=spartan">first</a></th>
1014 1016 <a href="/file/43c799df6e75/foo?style=spartan">43c799df6e75</a>
1015 1017 <a href="/diff/43c799df6e75/foo?style=spartan">(diff)</a>
1016 1018 <a href="/annotate/43c799df6e75/foo?style=spartan">(annotate)</a>
1017 1019
1018 1020 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/xyzzy/foo?style=spartan' | egrep $REVLINKS
1019 1021 <a href="/log/xyzzy?style=spartan">changelog</a>
1020 1022 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
1021 1023 <a href="/graph/xyzzy?style=spartan">graph</a>
1022 1024 <a href="/rev/xyzzy?style=spartan">changeset</a>
1023 1025 <a href="/file/xyzzy/?style=spartan">files</a>
1024 1026 <a href="/file/xyzzy/foo?style=spartan">file</a>
1025 1027 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
1026 1028 <a href="/raw-annotate/xyzzy/foo">raw</a>
1027 1029 <td><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
1028 1030 <a href="/annotate/43c799df6e75/foo?style=spartan">
1029 1031 <td><a href="/annotate/9d8c40cba617/foo?style=spartan">9d8c40cba617</a></td>
1030 1032 <a href="/annotate/43c799df6e75/foo?style=spartan#l1"
1031 1033 <a href="/annotate/a7c1559b7bba/foo?style=spartan#l2"
1032 1034
1033 1035 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'diff/xyzzy/foo?style=spartan' | egrep $REVLINKS
1034 1036 <a href="/log/xyzzy?style=spartan">changelog</a>
1035 1037 <a href="/shortlog/xyzzy?style=spartan">shortlog</a>
1036 1038 <a href="/graph/xyzzy?style=spartan">graph</a>
1037 1039 <a href="/rev/xyzzy?style=spartan">changeset</a>
1038 1040 <a href="/file/xyzzy/foo?style=spartan">file</a>
1039 1041 <a href="/log/xyzzy/foo?style=spartan">revisions</a>
1040 1042 <a href="/annotate/xyzzy/foo?style=spartan">annotate</a>
1041 1043 <a href="/raw-diff/xyzzy/foo">raw</a>
1042 1044 <td class="revision"><a href="/rev/a7c1559b7bba?style=spartan">a7c1559b7bba</a></td>
1043 1045 <td class="parent"><a href="/rev/43c799df6e75?style=spartan">43c799df6e75</a></td>
1044 1046 <td class="child"><a href="/rev/9d8c40cba617?style=spartan">9d8c40cba617</a></td>
1045 1047
1046 1048 Done
1047 1049
1048 1050 $ cat errors.log
1049 1051 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1050 1052 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now