annotate mercurial/hgweb.py @ 142:529bf610092e

Prettify the web interface Add header, footer templates Add null parent handling Combine files and directories Add parity flag for alternating line colors Add line numbers to filerevision
author mpm@selenic.com
date Mon, 23 May 2005 20:57:48 -0800
parents c77a679e9cfa
children e8a360cd5a9f 083c38bdfa64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
1 #!/usr/bin/env python
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
2 #
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
3 # hgweb.py - 0.2 - 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
4 # - web interface to a mercurial repository
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
5 #
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
6 # This software may be used and distributed according to the terms
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
7 # of the GNU General Public License, incorporated herein by reference.
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
8
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
9 # useful for debugging
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
10 import cgitb
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
11 cgitb.enable()
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
12
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
13 import os, cgi, time, re, difflib, sys, zlib
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
14 from mercurial.hg import *
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
15
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
16 def age(t):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
17 def plural(t, c):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
18 if c == 1: return t
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
19 return t + "s"
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
20 def fmt(t, c):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
21 return "%d %s" % (c, plural(t, c))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
22
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
23 now = time.time()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
24 delta = max(1, int(now - t))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
25
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
26 scales = [["second", 1],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
27 ["minute", 60],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
28 ["hour", 3600],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
29 ["day", 3600 * 24],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
30 ["week", 3600 * 24 * 7],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
31 ["month", 3600 * 24 * 30],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
32 ["year", 3600 * 24 * 365]]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
33
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
34 scales.reverse()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
35
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
36 for t, s in scales:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
37 n = delta / s
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
38 if n >= 1: return fmt(t, n)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
39
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
40 def nl2br(text):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
41 return text.replace('\n', '<br/>')
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
42
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
43 def obfuscate(text):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
44 return ''.join([ '&#%d' % ord(c) for c in text ])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
45
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
46 def up(p):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
47 if p[0] != "/": p = "/" + p
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
48 if p[-1] == "/": p = p[:-1]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
49 up = os.path.dirname(p)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
50 if up == "/":
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
51 return "/"
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
52 return up + "/"
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
53
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
54 def httphdr(type):
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
55 print 'Content-type: %s\n' % type
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
56
135
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
57 def write(*things):
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
58 for thing in things:
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
59 if hasattr(thing, "__iter__"):
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
60 for part in thing:
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
61 write(part)
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
62 else:
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
63 sys.stdout.write(str(thing))
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
64
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
65 def template(tmpl, **map):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
66 while tmpl:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
67 m = re.search(r"#([a-zA-Z0-9]+)#", tmpl)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
68 if m:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
69 yield tmpl[:m.start(0)]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
70 v = map.get(m.group(1), "")
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
71 yield callable(v) and v() or v
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
72 tmpl = tmpl[m.end(0):]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
73 else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
74 yield tmpl
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
75 return
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
76
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
77 class templater:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
78 def __init__(self, mapfile):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
79 self.cache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
80 self.map = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
81 self.base = os.path.dirname(mapfile)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
82
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
83 for l in file(mapfile):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
84 m = re.match(r'(\S+)\s*=\s*"(.*)"$', l)
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
85 if m:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
86 self.cache[m.group(1)] = m.group(2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
87 else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
88 m = re.match(r'(\S+)\s*=\s*(\S+)', l)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
89 if m:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
90 self.map[m.group(1)] = os.path.join(self.base, m.group(2))
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
91 else:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
92 raise "unknown map entry '%s'" % l
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
93
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
94 def __call__(self, t, **map):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
95 try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
96 tmpl = self.cache[t]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
97 except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
98 tmpl = self.cache[t] = file(self.map[t]).read()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
99 return template(tmpl, **map)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
100
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
101 class hgweb:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
102 maxchanges = 20
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
103 maxfiles = 10
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
104
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
105 def __init__(self, path, name, templatemap):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
106 self.reponame = name
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
107 self.repo = repository(ui(), path)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
108 self.t = templater(templatemap)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
109
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
110 def date(self, cs):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
111 return time.asctime(time.gmtime(float(cs[2].split(' ')[0])))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
112
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
113 def listfiles(self, files, mf):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
114 for f in files[:self.maxfiles]:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
115 yield self.t("filenodelink", node = hex(mf[f]), file = f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
116 if len(files) > self.maxfiles:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
117 yield self.t("fileellipses")
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
118
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
119 def listfilediffs(self, files, changeset):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
120 for f in files[:self.maxfiles]:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
121 yield self.t("filedifflink", node = hex(changeset), file = f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
122 if len(files) > self.maxfiles:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
123 yield self.t("fileellipses")
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
124
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
125 def parent(self, t1, node, rev):
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
126 if node != hex(nullid):
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
127 yield self.t(t1, node = node, rev = rev)
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
128
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
129 def diff(self, node1, node2, files):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
130 def filterfiles(list, files):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
131 l = [ x for x in list if x in files ]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
132
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
133 for f in files:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
134 if f[-1] != os.sep: f += os.sep
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
135 l += [ x for x in list if x.startswith(f) ]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
136 return l
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
137
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
138 def prettyprint(diff):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
139 for l in diff.splitlines(1):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
140 line = cgi.escape(l)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
141 if line.startswith('+'):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
142 yield self.t("difflineplus", line = line)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
143 elif line.startswith('-'):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
144 yield self.t("difflineminus", line = line)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
145 elif line.startswith('@'):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
146 yield self.t("difflineat", line = line)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
147 else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
148 yield self.t("diffline", line = line)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
149
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
150 r = self.repo
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
151 cl = r.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
152 mf = r.manifest
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
153 change1 = cl.read(node1)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
154 change2 = cl.read(node2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
155 mmap1 = mf.read(change1[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
156 mmap2 = mf.read(change2[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
157 date1 = self.date(change1)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
158 date2 = self.date(change2)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
159
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
160 c, a, d = r.diffrevs(node1, node2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
161 c, a, d = map(lambda x: filterfiles(x, files), (c, a, d))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
162
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
163 for f in c:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
164 to = r.file(f).read(mmap1[f])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
165 tn = r.file(f).read(mmap2[f])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
166 yield prettyprint(mdiff.unidiff(to, date1, tn, date2, f))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
167 for f in a:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
168 to = ""
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
169 tn = r.file(f).read(mmap2[f])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
170 yield prettyprint(mdiff.unidiff(to, date1, tn, date2, f))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
171 for f in d:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
172 to = r.file(f).read(mmap1[f])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
173 tn = ""
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
174 yield prettyprint(mdiff.unidiff(to, date1, tn, date2, f))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
175
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
176 def header(self):
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
177 yield self.t("header", repo = self.reponame)
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
178
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
179 def footer(self):
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
180 yield self.t("footer", repo = self.reponame)
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
181
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
182 def changelog(self, pos=None):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
183 def changenav():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
184 def seq(factor = 1):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
185 yield 1 * factor
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
186 yield 2 * factor
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
187 yield 5 * factor
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
188 for f in seq(factor * 10):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
189 yield f
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
190
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
191 linear = range(0, count - 2, self.maxchanges)[0:8]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
192
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
193 for i in linear:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
194 yield self.t("naventry", rev = max(i, 1))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
195
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
196 for s in seq():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
197 if s > count - 2: break
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
198 if s > linear[-1]:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
199 yield self.t("naventry", rev = s)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
200
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
201 yield self.t("naventry", rev = count - 1)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
202
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
203 def changelist():
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
204 parity = (start - end) & 1
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
205 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
206 l = [] # build a list in forward order for efficiency
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
207 for i in range(start, end + 1):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
208 n = cl.node(i)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
209 changes = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
210 hn = hex(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
211 p1, p2 = cl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
212 t = float(changes[2].split(' ')[0])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
213
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
214 l.insert(0, self.t(
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
215 'changelogentry',
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
216 parity = parity,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
217 author = obfuscate(changes[1]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
218 shortdesc = cgi.escape(changes[4].splitlines()[0]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
219 age = age(t),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
220 parent1 = self.parent("changelogparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
221 hex(p1), cl.rev(p1)),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
222 parent2 = self.parent("changelogparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
223 hex(p2), cl.rev(p2)),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
224 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
225 p1rev = cl.rev(p1), p2rev = cl.rev(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
226 manifest = hex(changes[0]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
227 desc = nl2br(cgi.escape(changes[4])),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
228 date = time.asctime(time.gmtime(t)),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
229 files = self.listfilediffs(changes[3], n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
230 rev = i,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
231 node = hn))
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
232 parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
233
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
234 yield l
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
235
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
236 count = self.repo.changelog.count()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
237 pos = pos or count - 1
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
238 end = min(pos, count - 1)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
239 start = max(0, pos - self.maxchanges)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
240 end = min(count - 1, start + self.maxchanges)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
241
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
242 yield self.t('changelog',
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
243 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
244 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
245 repo = self.reponame,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
246 changenav = changenav,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
247 rev = pos, changesets = count, entries = changelist)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
248
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
249 def changeset(self, nodeid):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
250 n = bin(nodeid)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
251 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
252 changes = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
253 p1, p2 = cl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
254 p1rev, p2rev = cl.rev(p1), cl.rev(p2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
255 t = float(changes[2].split(' ')[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
256
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
257 files = []
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
258 mf = self.repo.manifest.read(changes[0])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
259 for f in changes[3]:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
260 files.append(self.t("filenodelink",
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
261 filenode = hex(mf[f]), file = f))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
262
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
263 def diff():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
264 yield self.diff(p1, n, changes[3])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
265
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
266 yield self.t('changeset',
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
267 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
268 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
269 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
270 diff = diff,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
271 rev = cl.rev(n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
272 node = nodeid,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
273 shortdesc = cgi.escape(changes[4].splitlines()[0]),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
274 parent1 = self.parent("changesetparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
275 hex(p1), cl.rev(p1)),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
276 parent2 = self.parent("changesetparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
277 hex(p2), cl.rev(p2)),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
278 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
279 p1rev = cl.rev(p1), p2rev = cl.rev(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
280 manifest = hex(changes[0]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
281 author = obfuscate(changes[1]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
282 desc = nl2br(cgi.escape(changes[4])),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
283 date = time.asctime(time.gmtime(t)),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
284 files = files)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
285
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
286 def filelog(self, f, filenode):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
287 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
288 fl = self.repo.file(f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
289 count = fl.count()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
290
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
291 def entries():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
292 l = []
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
293 parity = (count - 1) & 1
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
294
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
295 for i in range(count):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
296
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
297 n = fl.node(i)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
298 lr = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
299 cn = cl.node(lr)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
300 cs = cl.read(cl.node(lr))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
301 p1, p2 = fl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
302 t = float(cs[2].split(' ')[0])
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
303
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
304 l.insert(0, self.t("filelogentry",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
305 parity = parity,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
306 filenode = hex(n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
307 filerev = i,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
308 file = f,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
309 node = hex(cn),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
310 author = obfuscate(cs[1]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
311 age = age(t),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
312 date = time.asctime(time.gmtime(t)),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
313 shortdesc = cgi.escape(cs[4].splitlines()[0]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
314 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
315 p1rev = fl.rev(p1), p2rev = fl.rev(p2)))
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
316 parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
317
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
318 yield l
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
319
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
320 yield self.t("filelog",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
321 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
322 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
323 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
324 file = f,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
325 filenode = filenode,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
326 entries = entries)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
327
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
328 def filerevision(self, f, node):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
329 fl = self.repo.file(f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
330 n = bin(node)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
331 text = cgi.escape(fl.read(n))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
332 changerev = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
333 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
334 cn = cl.node(changerev)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
335 cs = cl.read(cn)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
336 p1, p2 = fl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
337 t = float(cs[2].split(' ')[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
338 mfn = cs[0]
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
339
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
340 def lines():
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
341 for l, t in enumerate(text.splitlines(1)):
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
342 yield self.t("fileline",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
343 line = t,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
344 linenumber = "% 6d" % (l + 1),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
345 parity = l & 1)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
346
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
347 yield self.t("filerevision", file = f,
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
348 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
349 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
350 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
351 filenode = node,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
352 path = up(f),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
353 text = lines(),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
354 rev = changerev,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
355 node = hex(cn),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
356 manifest = hex(mfn),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
357 author = obfuscate(cs[1]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
358 age = age(t),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
359 date = time.asctime(time.gmtime(t)),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
360 shortdesc = cgi.escape(cs[4].splitlines()[0]),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
361 parent1 = self.parent("filerevparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
362 hex(p1), fl.rev(p1)),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
363 parent2 = self.parent("filerevparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
364 hex(p2), fl.rev(p2)),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
365 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
366 p1rev = fl.rev(p1), p2rev = fl.rev(p2))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
367
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
368
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
369 def fileannotate(self, f, node):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
370 bcache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
371 ncache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
372 fl = self.repo.file(f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
373 n = bin(node)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
374 changerev = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
375
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
376 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
377 cn = cl.node(changerev)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
378 cs = cl.read(cn)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
379 p1, p2 = fl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
380 t = float(cs[2].split(' ')[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
381 mfn = cs[0]
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
382
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
383 def annotate():
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
384 parity = 1
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
385 last = None
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
386 for r, l in fl.annotate(n):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
387 try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
388 cnode = ncache[r]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
389 except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
390 cnode = ncache[r] = self.repo.changelog.node(r)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
391
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
392 try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
393 name = bcache[r]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
394 except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
395 cl = self.repo.changelog.read(cnode)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
396 name = cl[1]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
397 f = name.find('@')
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
398 if f >= 0:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
399 name = name[:f]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
400 bcache[r] = name
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
401
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
402 if last != cnode:
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
403 parity = 1 - parity
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
404 last = cnode
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
405
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
406 yield self.t("annotateline",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
407 parity = parity,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
408 node = hex(cnode),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
409 rev = r,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
410 author = name,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
411 file = f,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
412 line = cgi.escape(l))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
413
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
414 yield self.t("fileannotate",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
415 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
416 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
417 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
418 file = f,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
419 filenode = node,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
420 annotate = annotate,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
421 path = up(f),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
422 rev = changerev,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
423 node = hex(cn),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
424 manifest = hex(mfn),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
425 author = obfuscate(cs[1]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
426 age = age(t),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
427 date = time.asctime(time.gmtime(t)),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
428 shortdesc = cgi.escape(cs[4].splitlines()[0]),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
429 parent1 = self.parent("filerevparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
430 hex(p1), fl.rev(p1)),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
431 parent2 = self.parent("filerevparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
432 hex(p2), fl.rev(p2)),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
433 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
434 p1rev = fl.rev(p1), p2rev = fl.rev(p2))
136
0e8d60d2bb2b added annotate
jake@edge2.net
parents: 135
diff changeset
435
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
436 def manifest(self, mnode, path):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
437 mf = self.repo.manifest.read(bin(mnode))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
438 rev = self.repo.manifest.rev(bin(mnode))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
439 node = self.repo.changelog.node(rev)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
440
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
441 files = {}
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
442
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
443 p = path[1:]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
444 l = len(p)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
445
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
446 for f,n in mf.items():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
447 if f[:l] != p:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
448 continue
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
449 remain = f[l:]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
450 if "/" in remain:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
451 short = remain[:remain.find("/") + 1] # bleah
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
452 files[short] = (f, None)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
453 else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
454 short = os.path.basename(remain)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
455 files[short] = (f, n)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
456
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
457 def filelist():
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
458 parity = 0
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
459 fl = files.keys()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
460 fl.sort()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
461 for f in fl:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
462 full, fnode = files[f]
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
463 if fnode:
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
464 yield self.t("manifestfileentry",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
465 file = full,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
466 manifest = mnode,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
467 filenode = hex(fnode),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
468 parity = parity,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
469 basename = f)
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
470 else:
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
471 yield self.t("manifestdirentry",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
472 parity = parity,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
473 path = os.path.join(path, f),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
474 manifest = mnode, basename = f[:-1])
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
475 parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
476
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
477 yield self.t("manifest",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
478 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
479 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
480 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
481 manifest = mnode,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
482 rev = rev,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
483 node = hex(node),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
484 path = path,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
485 up = up(path),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
486 entries = filelist)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
487
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
488 def filediff(self, file, changeset):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
489 n = bin(changeset)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
490 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
491 p1 = cl.parents(n)[0]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
492 cs = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
493 mf = self.repo.manifest.read(cs[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
494
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
495 def diff():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
496 yield self.diff(p1, n, file)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
497
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
498 yield self.t("filediff",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
499 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
500 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
501 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
502 file = file,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
503 filenode = hex(mf[file]),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
504 node = changeset,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
505 rev = self.repo.changelog.rev(n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
506 p1 = hex(p1),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
507 p1rev = self.repo.changelog.rev(p1),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
508 diff = diff)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
509
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
510 # add tags to things
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
511 # tags -> list of changesets corresponding to tags
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
512 # find tag, changeset, file
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
513
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
514 def run(self):
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
515 args = cgi.parse()
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
516
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
517 if not args.has_key('cmd') or args['cmd'][0] == 'changelog':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
518 hi = self.repo.changelog.count()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
519 if args.has_key('pos'):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
520 hi = int(args['pos'][0])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
521
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
522 write(self.changelog(hi))
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
523
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
524 elif args['cmd'][0] == 'changeset':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
525 write(self.changeset(args['node'][0]))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
526
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
527 elif args['cmd'][0] == 'manifest':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
528 write(self.manifest(args['manifest'][0], args['path'][0]))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
529
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
530 elif args['cmd'][0] == 'filediff':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
531 write(self.filediff(args['file'][0], args['node'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
532
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
533 elif args['cmd'][0] == 'file':
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
534 write(self.filerevision(args['file'][0], args['filenode'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
535
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
536 elif args['cmd'][0] == 'annotate':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
537 write(self.fileannotate(args['file'][0], args['filenode'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
538
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
539 elif args['cmd'][0] == 'filelog':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
540 write(self.filelog(args['file'][0], args['filenode'][0]))
136
0e8d60d2bb2b added annotate
jake@edge2.net
parents: 135
diff changeset
541
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
542 elif args['cmd'][0] == 'branches':
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
543 httphdr("text/plain")
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
544 nodes = []
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
545 if args.has_key('nodes'):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
546 nodes = map(bin, args['nodes'][0].split(" "))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
547 for b in self.repo.branches(nodes):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
548 sys.stdout.write(" ".join(map(hex, b)) + "\n")
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
549
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
550 elif args['cmd'][0] == 'between':
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
551 httphdr("text/plain")
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
552 nodes = []
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
553 if args.has_key('pairs'):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
554 pairs = [ map(bin, p.split("-"))
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
555 for p in args['pairs'][0].split(" ") ]
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
556 for b in self.repo.between(pairs):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
557 sys.stdout.write(" ".join(map(hex, b)) + "\n")
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
558
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
559 elif args['cmd'][0] == 'changegroup':
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
560 httphdr("application/hg-changegroup")
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
561 nodes = []
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
562 if args.has_key('roots'):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
563 nodes = map(bin, args['roots'][0].split(" "))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
564
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
565 z = zlib.compressobj()
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
566 for chunk in self.repo.changegroup(nodes):
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
567 sys.stdout.write(z.compress(chunk))
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
568
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
569 sys.stdout.write(z.flush())
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
570
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
571 else:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
572 write(self.t("error"))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
573
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
574 if __name__ == "__main__":
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
575 hgweb().run()