# HG changeset patch # User Thomas Arendsen Hein # Date 1159612471 -7200 # Node ID 9e8dd6114a4e210e71c5f6ace4a9e4aee5818a0e # Parent a7377a238cecc237f894b7500e96f27cf94807b0# Parent e7b7906cc47e150f89e1d2eefe0b568b49ed5b86 merged brendan's hgweb cleanups diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -148,6 +148,12 @@ class filectx(object): def __eq__(self, other): return self._path == other._path and self._changeid == other._changeid + def filectx(self, fileid): + '''opens an arbitrary revision of the file without + opening a new filelog''' + return filectx(self._repo, self._path, fileid=fileid, + filelog=self._filelog) + def filerev(self): return self._filerev def filenode(self): return self._filenode def filelog(self): return self._filelog diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py --- a/mercurial/hgweb/hgweb_mod.py +++ b/mercurial/hgweb/hgweb_mod.py @@ -70,14 +70,12 @@ class hgweb(object): if len(files) > self.maxfiles: yield self.t("fileellipses") - def siblings(self, siblings=[], rev=None, hiderev=None, **args): - if not rev: - rev = lambda x: "" - siblings = [s for s in siblings if s != nullid] - if len(siblings) == 1 and rev(siblings[0]) == hiderev: + def siblings(self, siblings=[], hiderev=None, **args): + siblings = [s for s in siblings if s.node() != nullid] + if len(siblings) == 1 and siblings[0].rev() == hiderev: return for s in siblings: - yield dict(node=hex(s), rev=rev(s), **args) + yield dict(node=hex(s.node()), rev=s.rev(), **args) def renamelink(self, fl, node): r = fl.renamed(node) @@ -191,23 +189,19 @@ class hgweb(object): cl = self.repo.changelog l = [] # build a list in forward order for efficiency for i in range(start, end): - n = cl.node(i) - changes = cl.read(n) - hn = hex(n) + ctx = self.repo.changectx(i) + n = ctx.node() l.insert(0, {"parity": parity, - "author": changes[1], - "parent": self.siblings(cl.parents(n), cl.rev, - cl.rev(n) - 1), - "child": self.siblings(cl.children(n), cl.rev, - cl.rev(n) + 1), + "author": ctx.user(), + "parent": self.siblings(ctx.parents(), i - 1), + "child": self.siblings(ctx.children(), i + 1), "changelogtag": self.showtag("changelogtag",n), - "manifest": hex(changes[0]), - "desc": changes[4], - "date": changes[2], - "files": self.listfilediffs(changes[3], n), + "desc": ctx.description(), + "date": ctx.date(), + "files": self.listfilediffs(ctx.files(), n), "rev": i, - "node": hn}) + "node": hex(n)}) parity = 1 - parity for e in l: @@ -223,7 +217,7 @@ class hgweb(object): yield self.t(shortlog and 'shortlog' or 'changelog', changenav=changenav, - manifest=hex(mf), + node=hex(cl.tip()), rev=pos, changesets=count, entries=changelist, archives=self.archivelist("tip")) @@ -238,64 +232,59 @@ class hgweb(object): for i in range(cl.count() - 1, 0, -100): l = [] for j in range(max(0, i - 100), i): - n = cl.node(j) - changes = cl.read(n) - l.append((n, j, changes)) + ctx = self.repo.changectx(j) + l.append(ctx) l.reverse() for e in l: yield e - for n, i, changes in revgen(): + for ctx in revgen(): miss = 0 for q in qw: - if not (q in changes[1].lower() or - q in changes[4].lower() or - q in " ".join(changes[3][:20]).lower()): + if not (q in ctx.user().lower() or + q in ctx.description().lower() or + q in " ".join(ctx.files()[:20]).lower()): miss = 1 break if miss: continue count += 1 - hn = hex(n) + n = ctx.node() yield self.t('searchentry', parity=self.stripes(count), - author=changes[1], - parent=self.siblings(cl.parents(n), cl.rev), - child=self.siblings(cl.children(n), cl.rev), + author=ctx.user(), + parent=self.siblings(ctx.parents()), + child=self.siblings(ctx.children()), changelogtag=self.showtag("changelogtag",n), - manifest=hex(changes[0]), - desc=changes[4], - date=changes[2], - files=self.listfilediffs(changes[3], n), - rev=i, - node=hn) + desc=ctx.description(), + date=ctx.date(), + files=self.listfilediffs(ctx.files(), n), + rev=ctx.rev(), + node=hex(n)) if count >= self.maxchanges: break cl = self.repo.changelog - mf = cl.read(cl.tip())[0] yield self.t('search', query=query, - manifest=hex(mf), + node=hex(cl.tip()), entries=changelist) def changeset(self, nodeid): - cl = self.repo.changelog - n = self.repo.lookup(nodeid) - nodeid = hex(n) - changes = cl.read(n) - p1 = cl.parents(n)[0] + ctx = self.repo.changectx(nodeid) + n = ctx.node() + parents = ctx.parents() + p1 = parents[0].node() files = [] - mf = self.repo.manifest.read(changes[0]) parity = 0 - for f in changes[3]: + for f in ctx.files(): files.append(self.t("filenodelink", - filenode=hex(mf.get(f, nullid)), file=f, + node=hex(n), file=f, parity=parity)) parity = 1 - parity @@ -304,22 +293,21 @@ class hgweb(object): yield self.t('changeset', diff=diff, - rev=cl.rev(n), - node=nodeid, - parent=self.siblings(cl.parents(n), cl.rev), - child=self.siblings(cl.children(n), cl.rev), + rev=ctx.rev(), + node=hex(n), + parent=self.siblings(parents), + child=self.siblings(ctx.children()), changesettag=self.showtag("changesettag",n), - manifest=hex(changes[0]), - author=changes[1], - desc=changes[4], - date=changes[2], + author=ctx.user(), + desc=ctx.description(), + date=ctx.date(), files=files, archives=self.archivelist(nodeid)) - def filelog(self, f, filenode): + def filelog(self, fctx): + f = fctx.path() cl = self.repo.changelog - fl = self.repo.file(f) - filenode = hex(fl.lookup(filenode)) + fl = fctx.filelog() count = fl.count() def entries(**map): @@ -327,41 +315,31 @@ class hgweb(object): parity = (count - 1) & 1 for i in range(count): + ctx = fctx.filectx(i) n = fl.node(i) - lr = fl.linkrev(n) - cn = cl.node(lr) - cs = cl.read(cl.node(lr)) l.insert(0, {"parity": parity, - "filenode": hex(n), "filerev": i, "file": f, - "node": hex(cn), - "author": cs[1], - "date": cs[2], + "node": hex(ctx.node()), + "author": ctx.user(), + "date": ctx.date(), "rename": self.renamelink(fl, n), - "parent": self.siblings(fl.parents(n), - fl.rev, file=f), - "child": self.siblings(fl.children(n), - fl.rev, file=f), - "desc": cs[4]}) + "parent": self.siblings(fctx.parents(), file=f), + "child": self.siblings(fctx.children(), file=f), + "desc": ctx.description()}) parity = 1 - parity for e in l: yield e - yield self.t("filelog", file=f, filenode=filenode, entries=entries) + yield self.t("filelog", file=f, node=hex(fctx.node()), entries=entries) - def filerevision(self, f, node): - fl = self.repo.file(f) - n = fl.lookup(node) - node = hex(n) - text = fl.read(n) - changerev = fl.linkrev(n) - cl = self.repo.changelog - cn = cl.node(changerev) - cs = cl.read(cn) - mfn = cs[0] + def filerevision(self, fctx): + f = fctx.path() + text = fctx.data() + fl = fctx.filelog() + n = fctx.filenode() mt = mimetypes.guess_type(f)[0] rawtext = text @@ -378,23 +356,21 @@ class hgweb(object): yield self.t("filerevision", file=f, - filenode=node, path=_up(f), text=lines(), raw=rawtext, mimetype=mt, - rev=changerev, - node=hex(cn), - manifest=hex(mfn), - author=cs[1], - date=cs[2], - parent=self.siblings(fl.parents(n), fl.rev, file=f), - child=self.siblings(fl.children(n), fl.rev, file=f), + rev=fctx.rev(), + node=hex(fctx.node()), + author=fctx.user(), + date=fctx.date(), + parent=self.siblings(fctx.parents(), file=f), + child=self.siblings(fctx.children(), file=f), rename=self.renamelink(fl, n), - permissions=self.repo.manifest.read(mfn).execf(f)) + permissions=fctx.manifest().execf(f)) - def fileannotate(self, f, node): - fctx = self.repo.filectx(f, fileid=node) + def fileannotate(self, fctx): + f = fctx.path() n = fctx.filenode() fl = fctx.filelog() @@ -411,7 +387,6 @@ class hgweb(object): yield {"parity": parity, "node": hex(f.node()), - "filenode": hex(fnode), "rev": f.rev(), "author": name, "file": f.path(), @@ -419,27 +394,20 @@ class hgweb(object): yield self.t("fileannotate", file=f, - filenode=node, annotate=annotate, path=_up(f), rev=fctx.rev(), node=hex(fctx.node()), - manifest=hex(fctx.changectx().changeset()[0]), author=fctx.user(), date=fctx.date(), rename=self.renamelink(fl, n), - parent=self.siblings(fl.parents(n), fl.rev, file=f), - child=self.siblings(fl.children(n), fl.rev, file=f), + parent=self.siblings(fctx.parents(), file=f), + child=self.siblings(fctx.children(), file=f), permissions=fctx.manifest().execf(f)) - def manifest(self, mnode, path): - man = self.repo.manifest - mn = man.lookup(mnode) - mnode = hex(mn) - mf = man.read(mn) - rev = man.rev(mn) - changerev = man.linkrev(mn) - node = self.repo.changelog.node(changerev) + def manifest(self, ctx, path): + mf = ctx.manifest() + node = ctx.node() files = {} @@ -469,7 +437,6 @@ class hgweb(object): continue yield {"file": full, - "manifest": mnode, "filenode": hex(fnode), "parity": self.stripes(parity), "basename": f, @@ -487,13 +454,11 @@ class hgweb(object): yield {"parity": self.stripes(parity), "path": os.path.join(path, f), - "manifest": mnode, "basename": f[:-1]} parity += 1 yield self.t("manifest", - manifest=mnode, - rev=rev, + rev=ctx.rev(), node=hex(node), path=path, up=_up(path), @@ -503,7 +468,6 @@ class hgweb(object): def tags(self): cl = self.repo.changelog - mf = cl.read(cl.tip())[0] i = self.repo.tagslist() i.reverse() @@ -514,19 +478,17 @@ class hgweb(object): if notip and k == "tip": continue yield {"parity": self.stripes(parity), "tag": k, - "tagmanifest": hex(cl.read(n)[0]), "date": cl.read(n)[2], "node": hex(n)} parity += 1 yield self.t("tags", - manifest=hex(mf), + node=hex(self.repo.changelog.tip()), entries=lambda **x: entries(False, **x), entriesnotip=lambda **x: entries(True, **x)) def summary(self): cl = self.repo.changelog - mf = cl.read(cl.tip())[0] i = self.repo.tagslist() i.reverse() @@ -550,8 +512,7 @@ class hgweb(object): parity = self.stripes(parity), tag = k, node = hex(n), - date = t, - tagmanifest = hex(m)) + date = t) parity += 1 def changelist(**map): @@ -568,7 +529,6 @@ class hgweb(object): 'shortlogentry', parity = parity, author = changes[1], - manifest = hex(changes[0]), desc = changes[4], date = t, rev = i, @@ -577,8 +537,6 @@ class hgweb(object): yield l - cl = self.repo.changelog - mf = cl.read(cl.tip())[0] count = cl.count() start = max(0, count - self.maxchanges) end = min(count, start + self.maxchanges) @@ -589,29 +547,26 @@ class hgweb(object): self.repo.ui.config("web", "contact") or # deprecated self.repo.ui.config("web", "author", "unknown")), # also lastchange = (0, 0), # FIXME - manifest = hex(mf), tags = tagentries, shortlog = changelist, + node = hex(self.repo.changelog.tip()), archives=self.archivelist("tip")) def filediff(self, file, changeset): - cl = self.repo.changelog - n = self.repo.lookup(changeset) - changeset = hex(n) - p1 = cl.parents(n)[0] - cs = cl.read(n) - mf = self.repo.manifest.read(cs[0]) + ctx = self.repo.changectx(changeset) + n = ctx.node() + parents = ctx.parents() + p1 = parents[0].node() def diff(**map): yield self.diff(p1, n, [file]) yield self.t("filediff", file=file, - filenode=hex(mf.get(file, nullid)), - node=changeset, - rev=self.repo.changelog.rev(n), - parent=self.siblings(cl.parents(n), cl.rev), - child=self.siblings(cl.children(n), cl.rev), + node=hex(n), + rev=ctx.rev(), + parent=self.siblings(parents), + child=self.siblings(ctx.children()), diff=diff) archive_specs = { @@ -693,6 +648,25 @@ class hgweb(object): form[name] = value del form[k] + if form.has_key('manifest'): + changeid = req.form['manifest'][0] + try: + req.changectx = self.repo.changectx(changeid) + except hg.RepoError: + man = self.repo.manifest + mn = man.lookup(changeid) + req.changectx = self.repo.changectx(man.linkrev(mn)) + + if form.has_key('filenode'): + changeid = req.form['filenode'][0] + path = self.cleanpath(req.form['file'][0]) + try: + req.changectx = self.repo.changectx(changeid) + req.filectx = req.changectx.filectx(path) + except hg.RepoError: + req.filectx = self.repo.filectx(path, fileid=changeid) + req.changectx = req.filectx.changectx() + self.refresh() expand_form(req.form) @@ -771,7 +745,7 @@ class hgweb(object): req.write(self.changeset(req.form['node'][0])) def do_manifest(self, req): - req.write(self.manifest(req.form['manifest'][0], + req.write(self.manifest(req.changectx, self.cleanpath(req.form['path'][0]))) def do_tags(self, req): @@ -785,16 +759,13 @@ class hgweb(object): req.form['node'][0])) def do_file(self, req): - req.write(self.filerevision(self.cleanpath(req.form['file'][0]), - req.form['filenode'][0])) + req.write(self.filerevision(req.filectx)) def do_annotate(self, req): - req.write(self.fileannotate(self.cleanpath(req.form['file'][0]), - req.form['filenode'][0])) + req.write(self.fileannotate(req.filectx)) def do_filelog(self, req): - req.write(self.filelog(self.cleanpath(req.form['file'][0]), - req.form['filenode'][0])) + req.write(self.filelog(req.filectx)) def do_heads(self, req): resp = " ".join(map(hex, self.repo.heads())) + "\n" diff --git a/templates/changelog-gitweb.tmpl b/templates/changelog-gitweb.tmpl --- a/templates/changelog-gitweb.tmpl +++ b/templates/changelog-gitweb.tmpl @@ -20,7 +20,7 @@ diff --git a/templates/changelog.tmpl b/templates/changelog.tmpl --- a/templates/changelog.tmpl +++ b/templates/changelog.tmpl @@ -8,7 +8,7 @@
shortlog tags -manifest +manifest #archives%archiveentry# rss
diff --git a/templates/changelogentry.tmpl b/templates/changelogentry.tmpl --- a/templates/changelogentry.tmpl +++ b/templates/changelogentry.tmpl @@ -19,7 +19,7 @@ #date|date# - files: + files: #files# diff --git a/templates/changeset-gitweb.tmpl b/templates/changeset-gitweb.tmpl --- a/templates/changeset-gitweb.tmpl +++ b/templates/changeset-gitweb.tmpl @@ -10,7 +10,7 @@
@@ -21,7 +21,7 @@ author#author|obfuscate# #date|date# (#date|age# ago) changeset#node|short# -manifest#manifest|short# +manifest#node|short# #parent%changesetparent# #child%changesetchild# #changesettag# diff --git a/templates/changeset.tmpl b/templates/changeset.tmpl --- a/templates/changeset.tmpl +++ b/templates/changeset.tmpl @@ -7,7 +7,7 @@ changelog shortlog tags -manifest +manifest raw #archives%archiveentry#
diff --git a/templates/error-gitweb.tmpl b/templates/error-gitweb.tmpl --- a/templates/error-gitweb.tmpl +++ b/templates/error-gitweb.tmpl @@ -10,7 +10,7 @@
diff --git a/templates/fileannotate-gitweb.tmpl b/templates/fileannotate-gitweb.tmpl --- a/templates/fileannotate-gitweb.tmpl +++ b/templates/fileannotate-gitweb.tmpl @@ -10,7 +10,7 @@
#file|escape#
@@ -24,7 +24,7 @@ #child%fileannotatechild# manifest: - #manifest|short# + #node|short# author: #author|obfuscate# diff --git a/templates/fileannotate.tmpl b/templates/fileannotate.tmpl --- a/templates/fileannotate.tmpl +++ b/templates/fileannotate.tmpl @@ -8,10 +8,10 @@ shortlog tags changeset -manifest -file -revisions -raw +manifest +file +revisions +raw

Annotate #file|escape#

diff --git a/templates/filediff.tmpl b/templates/filediff.tmpl --- a/templates/filediff.tmpl +++ b/templates/filediff.tmpl @@ -8,9 +8,9 @@ shortlog tags changeset -file -revisions -annotate +file +revisions +annotate raw diff --git a/templates/filelog-gitweb.tmpl b/templates/filelog-gitweb.tmpl --- a/templates/filelog-gitweb.tmpl +++ b/templates/filelog-gitweb.tmpl @@ -10,7 +10,7 @@
#file|urlescape#
diff --git a/templates/filelog.tmpl b/templates/filelog.tmpl --- a/templates/filelog.tmpl +++ b/templates/filelog.tmpl @@ -10,8 +10,8 @@ changelog shortlog tags -file -annotate +file +annotate rss diff --git a/templates/filelogentry-rss.tmpl b/templates/filelogentry-rss.tmpl --- a/templates/filelogentry-rss.tmpl +++ b/templates/filelogentry-rss.tmpl @@ -1,6 +1,6 @@ #desc|strip|firstline|strip|escape# - #url#?f=#filenode|short#;file=#file|urlescape# + #url#?f=#node|short#;file=#file|urlescape# #author|obfuscate# #date|rfc822date#> diff --git a/templates/filelogentry.tmpl b/templates/filelogentry.tmpl --- a/templates/filelogentry.tmpl +++ b/templates/filelogentry.tmpl @@ -6,9 +6,9 @@ revision #filerev#: - #filenode|short# + #node|short# (diff) - (annotate) + (annotate) #rename%filelogrename# diff --git a/templates/filerevision-gitweb.tmpl b/templates/filerevision-gitweb.tmpl --- a/templates/filerevision-gitweb.tmpl +++ b/templates/filerevision-gitweb.tmpl @@ -10,7 +10,7 @@
#file|escape#
@@ -24,7 +24,7 @@ #child%fileannotatechild# manifest: - #manifest|short# + #node|short# author: #author|obfuscate# diff --git a/templates/filerevision.tmpl b/templates/filerevision.tmpl --- a/templates/filerevision.tmpl +++ b/templates/filerevision.tmpl @@ -8,10 +8,10 @@ shortlog tags changeset -manifest -revisions -annotate -raw +manifest +revisions +annotate +raw

#file|escape#

diff --git a/templates/manifest-gitweb.tmpl b/templates/manifest-gitweb.tmpl --- a/templates/manifest-gitweb.tmpl +++ b/templates/manifest-gitweb.tmpl @@ -18,7 +18,7 @@ - + #dentries%manifestdirentry# diff --git a/templates/manifest.tmpl b/templates/manifest.tmpl --- a/templates/manifest.tmpl +++ b/templates/manifest.tmpl @@ -1,5 +1,5 @@ #header# -#repo|escape#: manifest #manifest|short# +#repo|escape#: manifest for changeset #node|short# @@ -16,7 +16,7 @@
drwxr-xr-x[up][up]
drwxr-xr-x  - [up] + [up] #dentries%manifestdirentry# #fentries%manifestfileentry#
diff --git a/templates/map b/templates/map --- a/templates/map +++ b/templates/map @@ -8,21 +8,21 @@ shortlogentry = shortlogentry.tmpl naventry = '#label|escape# ' navshortentry = '#label|escape# ' filedifflink = '#file|escape# ' -filenodelink = '#file|escape# ' +filenodelink = '#file|escape# ' fileellipses = '...' changelogentry = changelogentry.tmpl searchentry = changelogentry.tmpl changeset = changeset.tmpl manifest = manifest.tmpl -manifestdirentry = 'drwxr-xr-x #basename|escape#/' -manifestfileentry = '#permissions|permissions# #basename|escape#' +manifestdirentry = 'drwxr-xr-x #basename|escape#/' +manifestfileentry = '#permissions|permissions# #basename|escape#' filerevision = filerevision.tmpl fileannotate = fileannotate.tmpl filediff = filediff.tmpl filelog = filelog.tmpl fileline = '
#linenumber##line|escape#
' filelogentry = filelogentry.tmpl -annotateline = '#author|obfuscate#@#rev#
#line|escape#
' +annotateline = '#author|obfuscate#@#rev#
#line|escape#
' difflineplus = '#line|escape#' difflineminus = '#line|escape#' difflineat = '#line|escape#' diff --git a/templates/map-gitweb b/templates/map-gitweb --- a/templates/map-gitweb +++ b/templates/map-gitweb @@ -8,19 +8,19 @@ error = error-gitweb.tmpl naventry = '#label|escape# ' navshortentry = '#label|escape# ' filedifflink = '#file|escape# ' -filenodelink = '#file|escape#file | annotate | revisions' +filenodelink = '#file|escape#file | annotate | revisions' fileellipses = '...' changelogentry = changelogentry-gitweb.tmpl searchentry = changelogentry-gitweb.tmpl changeset = changeset-gitweb.tmpl manifest = manifest-gitweb.tmpl -manifestdirentry = 'drwxr-xr-x#basename|escape#/manifest' -manifestfileentry = '#permissions|permissions##basename|escape#file | revisions | annotate' +manifestdirentry = 'drwxr-xr-x#basename|escape#/manifest' +manifestfileentry = '#permissions|permissions##basename|escape#file | revisions | annotate' filerevision = filerevision-gitweb.tmpl fileannotate = fileannotate-gitweb.tmpl filelog = filelog-gitweb.tmpl fileline = '
   #linenumber# #line|escape#
' -annotateline = '#author|obfuscate#@#rev#
#line|escape#
' +annotateline = '#author|obfuscate#@#rev#
#line|escape#
' difflineplus = '
#line|escape#
' difflineminus = '
#line|escape#
' difflineat = '
#line|escape#
' @@ -36,7 +36,7 @@ changesetchild = 'childchild #rev#:#node|short#' filelogchild = 'child #rev#: #node|short#' shortlog = shortlog-gitweb.tmpl -shortlogentry = '#date|age# ago#author##desc|strip|firstline|escape#changeset | manifest' -filelogentry = '#date|age# ago#desc|strip|firstline|escape#file | annotate #rename%filelogrename#' +shortlogentry = '#date|age# ago#author##desc|strip|firstline|escape#changeset | manifest' +filelogentry = '#date|age# ago#desc|strip|firstline|escape#file | annotate #rename%filelogrename#' archiveentry = ' | #type|escape# ' diff --git a/templates/search-gitweb.tmpl b/templates/search-gitweb.tmpl --- a/templates/search-gitweb.tmpl +++ b/templates/search-gitweb.tmpl @@ -1,6 +1,6 @@ #header#

searching for #query|escape#

diff --git a/templates/search.tmpl b/templates/search.tmpl --- a/templates/search.tmpl +++ b/templates/search.tmpl @@ -7,7 +7,7 @@ changelog shortlog tags -manifest +manifest

searching for #query|escape#

diff --git a/templates/shortlog-gitweb.tmpl b/templates/shortlog-gitweb.tmpl --- a/templates/shortlog-gitweb.tmpl +++ b/templates/shortlog-gitweb.tmpl @@ -19,7 +19,7 @@ diff --git a/templates/tags-gitweb.tmpl b/templates/tags-gitweb.tmpl --- a/templates/tags-gitweb.tmpl +++ b/templates/tags-gitweb.tmpl @@ -10,7 +10,7 @@ diff --git a/templates/tags.tmpl b/templates/tags.tmpl --- a/templates/tags.tmpl +++ b/templates/tags.tmpl @@ -8,7 +8,7 @@ diff --git a/templates/template-vars.txt b/templates/template-vars.txt --- a/templates/template-vars.txt +++ b/templates/template-vars.txt @@ -3,14 +3,11 @@ rev a changeset.manifest revis node a changeset node changesets total number of changesets file a filename -filenode a file node filerev a file revision filerevs total number of file revisions up the directory of the relevant file path a path in the manifest, starting with "/" basename a short pathname -manifest a manifest node -manifestrev a manifest revision date a date string age age in hours, days, etc line a line of text (escaped)