Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/hgweb.py @ 133:fb84d3e71042
added template support for some hgweb output, also, template files for
the parts that have been converted
author | jake@edge2.net |
---|---|
date | Sat, 21 May 2005 16:13:42 -0700 |
parents | 210eeb6f5197 |
children | 13d609f8d830 |
rev | line source |
---|---|
131 | 1 #!/usr/bin/env python |
2 # | |
132 | 3 # hgweb.py - 0.2 - 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> |
131 | 4 # - web interface to a mercurial repository |
5 # | |
6 # This software may be used and distributed according to the terms | |
7 # of the GNU General Public License, incorporated herein by reference. | |
8 | |
9 # useful for debugging | |
10 import cgitb | |
11 cgitb.enable() | |
12 | |
13 import os, cgi, time, re, difflib, sys, zlib | |
14 from mercurial import hg, mdiff | |
15 | |
16 def nl2br(text): | |
17 return re.sub('\n', '<br />', text) | |
18 | |
19 def obfuscate(text): | |
20 l = [] | |
21 for c in text: | |
22 l.append('&#%d;' % ord(c)) | |
23 return ''.join(l) | |
24 | |
25 def httphdr(type): | |
26 print 'Content-type: %s\n' % type | |
27 | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
28 class template: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
29 def __init__(self, tmpl_dir): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
30 self.tmpl_dir = tmpl_dir |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
31 def do_page(self, tmpl_fn, **map): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
32 out = [] |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
33 txt = file(os.path.join(self.tmpl_dir, tmpl_fn)).read() |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
34 while txt: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
35 m = re.search(r"#([a-zA-Z0-9]+)#", txt) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
36 if m: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
37 out.append(txt[:m.start(0)]) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
38 v = map.get(m.group(1), "") |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
39 if callable(v): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
40 for y in v(**map): out.append(y) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
41 else: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
42 out.append(str(v)) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
43 txt = txt[m.end(0):] |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
44 else: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
45 out.append(txt) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
46 txt = '' |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
47 return ''.join(out) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
48 |
131 | 49 class page: |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
50 def __init__(self, tmpl_dir = "", type="text/html", title="Mercurial Web", |
131 | 51 charset="ISO-8859-1"): |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
52 self.tmpl = template(tmpl_dir) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
53 |
131 | 54 print 'Content-type: %s; charset=%s\n' % (type, charset) |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
55 print self.tmpl.do_page('htmlstart.tmpl', title = title) |
131 | 56 |
57 def endpage(self): | |
58 print '</BODY>' | |
59 print '</HTML>' | |
60 | |
61 def show_diff(self, a, b, fn): | |
62 a = a.splitlines(1) | |
63 b = b.splitlines(1) | |
64 l = difflib.unified_diff(a, b, fn, fn) | |
65 print '<pre>' | |
66 for line in l: | |
67 line = cgi.escape(line[:-1]) | |
68 if line.startswith('+'): | |
69 print '<span class="plusline">%s</span>' % (line, ) | |
70 elif line.startswith('-'): | |
71 print '<span class="minusline">%s</span>' % (line, ) | |
72 elif line.startswith('@'): | |
73 print '<span class="atline">%s</span>' % (line, ) | |
74 else: | |
75 print line | |
76 print '</pre>' | |
77 | |
78 class errpage(page): | |
79 def __init__(self): | |
80 page.__init__(self, title="Mercurial Web Error Page") | |
81 | |
82 class change_list(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
83 def __init__(self, repo, tmpl_dir, reponame, numchanges = 50): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
84 page.__init__(self, tmpl_dir) |
131 | 85 self.repo = repo |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
86 self.numchanges = numchanges |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
87 print self.tmpl.do_page('changestitle.tmpl', reponame=reponame) |
131 | 88 |
89 def content(self, hi=None): | |
90 cl = [] | |
91 count = self.repo.changelog.count() | |
92 if not hi: | |
93 hi = count | |
94 elif hi < self.numchanges: | |
95 hi = self.numchanges | |
96 | |
97 start = 0 | |
98 if hi - self.numchanges >= 0: | |
99 start = hi - self.numchanges | |
100 | |
101 nav = "Displaying Revisions: %d-%d" % (start, hi-1) | |
102 if start != 0: | |
103 nav = ('<a href="?cmd=changes;hi=%d">Previous %d</a> ' \ | |
104 % (start, self.numchanges)) + nav | |
105 if hi != count: | |
106 if hi + self.numchanges <= count: | |
107 nav += ' <a href="?cmd=changes;hi=%d">Next %d</a>' \ | |
108 % (hi + self.numchanges, self.numchanges) | |
109 else: | |
110 nav += ' <a href="?cmd=changes">Next %d</a>' % \ | |
111 self.numchanges | |
112 | |
113 print '<center>%s</center>' % nav | |
114 | |
115 for i in xrange(start, hi): | |
116 n = self.repo.changelog.node(i) | |
117 cl.append((n, self.repo.changelog.read(n))) | |
118 cl.reverse() | |
119 | |
120 print '<table summary="" width="100%" align="center">' | |
121 for n, ch in cl: | |
122 print '<tr><td>' | |
123 self.change_table(n, ch) | |
124 print '</td></tr>' | |
125 print '</table>' | |
126 | |
127 print '<center>%s</center>' % nav | |
128 | |
129 def change_table(self, nodeid, changes): | |
130 hn = hg.hex(nodeid) | |
131 i = self.repo.changelog.rev(nodeid) | |
132 (h1, h2) = [ hg.hex(x) for x in self.repo.changelog.parents(nodeid) ] | |
133 datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0]))) | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
134 files = [] |
131 | 135 for f in changes[3]: |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
136 files.append('<a href="?cmd=file;cs=%s;fn=%s">%s</a> ' \ |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
137 % (hn, f, cgi.escape(f))) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
138 print self.tmpl.do_page('change_table.tmpl', |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
139 author=obfuscate(changes[1]), |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
140 desc=nl2br(cgi.escape(changes[4])), date=datestr, |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
141 files=''.join(files), revnum=i, revnode=hn) |
131 | 142 |
143 class checkin(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
144 def __init__(self, repo, tmpl_dir, nodestr): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
145 page.__init__(self, tmpl_dir) |
131 | 146 self.repo = repo |
147 self.node = hg.bin(nodestr) | |
148 self.nodestr = nodestr | |
149 print '<h3>Checkin: %s</h3>' % nodestr | |
150 | |
151 def content(self): | |
152 changes = self.repo.changelog.read(self.node) | |
153 i = self.repo.changelog.rev(self.node) | |
154 parents = self.repo.changelog.parents(self.node) | |
155 (h1, h2) = [ hg.hex(x) for x in parents ] | |
156 (i1, i2) = [ self.repo.changelog.rev(x) for x in parents ] | |
157 datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0]))) | |
158 mf = self.repo.manifest.read(changes[0]) | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
159 files = [] |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
160 for f in changes[3]: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
161 files.append('<a href="?cmd=file;nd=%s;fn=%s">%s</a> ' \ |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
162 % (hg.hex(mf[f]), f, cgi.escape(f))) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
163 p2link = h2 |
131 | 164 if i2 != -1: |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
165 p2link = '<a href="?cmd=chkin;nd=%s">%s</a>' % (h2, h2) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
166 |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
167 print self.tmpl.do_page('checkin.tmpl', revnum=i, revnode=self.nodestr, |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
168 p1num=i1, p1node=h1, p2num=i2, p2node=h2, p2link=p2link, |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
169 mfnum=self.repo.manifest.rev(changes[0]), |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
170 mfnode=hg.hex(changes[0]), author=obfuscate(changes[1]), |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
171 desc=nl2br(cgi.escape(changes[4])), date=datestr) |
131 | 172 |
173 (c, a, d) = self.repo.diffrevs(parents[0], self.node) | |
174 change = self.repo.changelog.read(parents[0]) | |
175 mf2 = self.repo.manifest.read(change[0]) | |
176 for f in c: | |
177 self.show_diff(self.repo.file(f).read(mf2[f]), \ | |
178 self.repo.file(f).read(mf[f]), f) | |
179 for f in a: | |
180 self.show_diff('', self.repo.file(f).read(mf[f]), f) | |
181 for f in d: | |
182 self.show_diff(self.repo.file(f).read(mf2[f]), '', f) | |
183 | |
184 class filepage(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
185 def __init__(self, repo, tmpl_dir, fn, node=None, cs=None): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
186 page.__init__(self, tmpl_dir) |
131 | 187 self.repo = repo |
188 self.fn = fn | |
189 if cs: | |
190 chng = self.repo.changelog.read(hg.bin(cs)) | |
191 mf = self.repo.manifest.read(chng[0]) | |
192 self.node = mf[self.fn] | |
193 self.nodestr = hg.hex(self.node) | |
194 else: | |
195 self.nodestr = node | |
196 self.node = hg.bin(node) | |
197 print '<div class="filename">%s (%s)</div>' % \ | |
198 (cgi.escape(self.fn), self.nodestr, ) | |
199 print '<a href="?cmd=hist;fn=%s">history</a><br />' % self.fn | |
200 | |
201 def content(self): | |
202 print '<pre>' | |
203 print cgi.escape(self.repo.file(self.fn).read(self.node)) | |
204 print '</pre>' | |
205 | |
206 class mfpage(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
207 def __init__(self, repo, tmpl_dir, node): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
208 page.__init__(self, tmpl_dir) |
131 | 209 self.repo = repo |
210 self.nodestr = node | |
211 self.node = hg.bin(node) | |
212 | |
213 def content(self): | |
214 mf = self.repo.manifest.read(self.node) | |
215 fns = mf.keys() | |
216 fns.sort() | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
217 print self.tmpl.do_page('mftitle.tmpl', node = self.nodestr) |
131 | 218 for f in fns: |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
219 print self.tmpl.do_page('mfentry.tmpl', fn=f, node=hg.hex(mf[f])) |
131 | 220 |
221 class histpage(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
222 def __init__(self, repo, tmpl_dir, fn): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
223 page.__init__(self, tmpl_dir) |
131 | 224 self.repo = repo |
225 self.fn = fn | |
226 | |
227 def content(self): | |
228 print '<div class="filehist">File History: %s</div>' % self.fn | |
229 r = self.repo.file(self.fn) | |
230 print '<br />' | |
231 print '<table summary="" width="100%" align="center">' | |
232 for i in xrange(r.count()-1, -1, -1): | |
233 print '<tr><td>' | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
234 self.hist_ent(i, r) |
131 | 235 print '</tr></td>' |
236 print '</table>' | |
237 | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
238 def hist_ent(self, i, r): |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
239 n = r.node(i) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
240 (p1, p2) = r.parents(n) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
241 (h, h1, h2) = map(hg.hex, (n, p1, p2)) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
242 (i1, i2) = map(r.rev, (p1, p2)) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
243 ci = r.linkrev(n) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
244 cn = self.repo.changelog.node(ci) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
245 cs = hg.hex(cn) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
246 changes = self.repo.changelog.read(cn) |
131 | 247 datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0]))) |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
248 p2entry = '' |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
249 if i2 != -1: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
250 p2entry = ' %d:<a href="?cmd=file;nd=%s;fn=%s">%s</a>' \ |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
251 % (i2, h2, self.fn, h2 ), |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
252 print self.tmpl.do_page('hist_ent.tmpl', author=obfuscate(changes[1]), |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
253 csnode=cs, desc=nl2br(cgi.escape(changes[4])), |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
254 date = datestr, fn=self.fn, revnode=h, p1num = i1, |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
255 p1node=h1, p2entry=p2entry) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
256 |
132 | 257 class hgweb: |
258 repo_path = "." | |
259 numchanges = 50 | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
260 tmpl_dir = "templates" |
131 | 261 |
132 | 262 def __init__(self): |
263 pass | |
131 | 264 |
132 | 265 def run(self): |
266 | |
267 args = cgi.parse() | |
268 | |
269 ui = hg.ui() | |
270 repo = hg.repository(ui, self.repo_path) | |
131 | 271 |
132 | 272 if not args.has_key('cmd') or args['cmd'][0] == 'changes': |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
273 page = change_list(repo, self.tmpl_dir, 'Mercurial', |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
274 self.numchanges) |
132 | 275 hi = args.get('hi', ( repo.changelog.count(), )) |
276 page.content(hi = int(hi[0])) | |
277 page.endpage() | |
278 | |
279 elif args['cmd'][0] == 'chkin': | |
280 if not args.has_key('nd'): | |
281 page = errpage() | |
282 print '<div class="errmsg">No Node!</div>' | |
283 else: | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
284 page = checkin(repo, self.tmpl_dir, args['nd'][0]) |
132 | 285 page.content() |
286 page.endpage() | |
131 | 287 |
132 | 288 elif args['cmd'][0] == 'file': |
289 if not (args.has_key('nd') and args.has_key('fn')) and \ | |
290 not (args.has_key('cs') and args.has_key('fn')): | |
291 page = errpage() | |
292 print '<div class="errmsg">Invalid Args!</div>' | |
293 else: | |
294 if args.has_key('nd'): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
295 page = filepage(repo, self.tmpl_dir, |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
296 args['fn'][0], node=args['nd'][0]) |
132 | 297 else: |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
298 page = filepage(repo, self.tmpl_dir, |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
299 args['fn'][0], cs=args['cs'][0]) |
132 | 300 page.content() |
301 page.endpage() | |
131 | 302 |
132 | 303 elif args['cmd'][0] == 'mf': |
304 if not args.has_key('nd'): | |
305 page = errpage() | |
306 print '<div class="errmsg">No Node!</div>' | |
307 else: | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
308 page = mfpage(repo, self.tmpl_dir, args['nd'][0]) |
132 | 309 page.content() |
310 page.endpage() | |
131 | 311 |
132 | 312 elif args['cmd'][0] == 'hist': |
313 if not args.has_key('fn'): | |
314 page = errpage() | |
315 print '<div class="errmsg">No Filename!</div>' | |
316 else: | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
317 page = histpage(repo, self.tmpl_dir, args['fn'][0]) |
132 | 318 page.content() |
319 page.endpage() | |
320 | |
321 elif args['cmd'][0] == 'branches': | |
322 httphdr("text/plain") | |
323 nodes = [] | |
324 if args.has_key('nodes'): | |
325 nodes = map(hg.bin, args['nodes'][0].split(" ")) | |
326 for b in repo.branches(nodes): | |
327 print " ".join(map(hg.hex, b)) | |
131 | 328 |
132 | 329 elif args['cmd'][0] == 'between': |
330 httphdr("text/plain") | |
331 nodes = [] | |
332 if args.has_key('pairs'): | |
333 pairs = [ map(hg.bin, p.split("-")) | |
334 for p in args['pairs'][0].split(" ") ] | |
335 for b in repo.between(pairs): | |
336 print " ".join(map(hg.hex, b)) | |
337 | |
338 elif args['cmd'][0] == 'changegroup': | |
339 httphdr("application/hg-changegroup") | |
340 nodes = [] | |
341 if args.has_key('roots'): | |
342 nodes = map(hg.bin, args['roots'][0].split(" ")) | |
131 | 343 |
132 | 344 z = zlib.compressobj() |
345 for chunk in repo.changegroup(nodes): | |
346 sys.stdout.write(z.compress(chunk)) | |
347 | |
348 sys.stdout.write(z.flush()) | |
131 | 349 |
132 | 350 else: |
351 page = errpage() | |
352 print '<div class="errmsg">unknown command: %s</div>' % \ | |
353 cgi.escape(args['cmd'][0]) | |
354 page.endpage() | |
131 | 355 |
132 | 356 if __name__ == "__main__": |
357 hgweb().run() |