# HG changeset patch
# User mpm@selenic.com
# Date 1116892802 28800
# Node ID c77a679e9cfa2b15e690a9cb0b3cc7d1ec691f3e
# Parent b45b1b00fc9e8025b14101d8dc7562635310c3b7
Revamped templated hgweb
diff -r b45b1b00fc9e -r c77a679e9cfa mercurial/hgweb.py
--- a/mercurial/hgweb.py Sun May 22 08:13:38 2005 -0800
+++ b/mercurial/hgweb.py Mon May 23 16:00:02 2005 -0800
@@ -11,16 +11,45 @@
cgitb.enable()
import os, cgi, time, re, difflib, sys, zlib
-from mercurial import hg, mdiff
+from mercurial.hg import *
+
+def age(t):
+ def plural(t, c):
+ if c == 1: return t
+ return t + "s"
+ def fmt(t, c):
+ return "%d %s" % (c, plural(t, c))
+
+ now = time.time()
+ delta = max(1, int(now - t))
+
+ scales = [["second", 1],
+ ["minute", 60],
+ ["hour", 3600],
+ ["day", 3600 * 24],
+ ["week", 3600 * 24 * 7],
+ ["month", 3600 * 24 * 30],
+ ["year", 3600 * 24 * 365]]
+
+ scales.reverse()
+
+ for t, s in scales:
+ n = delta / s
+ if n >= 1: return fmt(t, n)
def nl2br(text):
- return re.sub('\n', '
', text)
+ return text.replace('\n', '
')
def obfuscate(text):
- l = []
- for c in text:
- l.append('%d;' % ord(c))
- return ''.join(l)
+ return ''.join([ '%d' % ord(c) for c in text ])
+
+def up(p):
+ if p[0] != "/": p = "/" + p
+ if p[-1] == "/": p = p[:-1]
+ up = os.path.dirname(p)
+ if up == "/":
+ return "/"
+ return up + "/"
def httphdr(type):
print 'Content-type: %s\n' % type
@@ -33,365 +62,451 @@
else:
sys.stdout.write(str(thing))
-class template:
- def __init__(self, tmpl_dir):
- self.tmpl_dir = tmpl_dir
- def do_page(self, tmpl_fn, **map):
- txt = file(os.path.join(self.tmpl_dir, tmpl_fn)).read()
- while txt:
- m = re.search(r"#([a-zA-Z0-9]+)#", txt)
+def template(tmpl, **map):
+ while tmpl:
+ m = re.search(r"#([a-zA-Z0-9]+)#", tmpl)
+ if m:
+ yield tmpl[:m.start(0)]
+ v = map.get(m.group(1), "")
+ yield callable(v) and v() or v
+ tmpl = tmpl[m.end(0):]
+ else:
+ yield tmpl
+ return
+
+class templater:
+ def __init__(self, mapfile):
+ self.cache = {}
+ self.map = {}
+ self.base = os.path.dirname(mapfile)
+
+ for l in file(mapfile):
+ m = re.match(r'(\S+)\s*=\s*"(.*)"$', l)
if m:
- yield txt[:m.start(0)]
- v = map.get(m.group(1), "")
- if callable(v):
- for y in v(**map): yield y
+ self.cache[m.group(1)] = m.group(2)
+ else:
+ m = re.match(r'(\S+)\s*=\s*(\S+)', l)
+ if m:
+ self.map[m.group(1)] = os.path.join(self.base, m.group(2))
else:
- yield v
- txt = txt[m.end(0):]
- else:
- yield txt
- txt = ''
+ raise "unknown map entry '%s'" % l
-class page:
- def __init__(self, tmpl_dir = "", type="text/html", title="Mercurial Web",
- charset="ISO-8859-1"):
- self.tmpl = template(tmpl_dir)
+ def __call__(self, t, **map):
+ try:
+ tmpl = self.cache[t]
+ except KeyError:
+ tmpl = self.cache[t] = file(self.map[t]).read()
+ return template(tmpl, **map)
+
+class hgweb:
+ maxchanges = 20
+ maxfiles = 10
- print 'Content-type: %s; charset=%s\n' % (type, charset)
- write(self.tmpl.do_page('htmlstart.tmpl', title = title))
+ def __init__(self, path, name, templatemap):
+ self.reponame = name
+ self.repo = repository(ui(), path)
+ self.t = templater(templatemap)
- def endpage(self):
- print '