Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/hgweb.py @ 134:13d609f8d830
fix problem with non wrapping file list
fix file list not appearing in checkin
author | jake@edge2.net |
---|---|
date | Sat, 21 May 2005 16:21:16 -0700 |
parents | fb84d3e71042 |
children | c0faf50822ea |
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, |
134 | 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]), |
134 | 171 desc=nl2br(cgi.escape(changes[4])), date=datestr, |
172 files=' '.join(files)) | |
131 | 173 |
174 (c, a, d) = self.repo.diffrevs(parents[0], self.node) | |
175 change = self.repo.changelog.read(parents[0]) | |
176 mf2 = self.repo.manifest.read(change[0]) | |
177 for f in c: | |
178 self.show_diff(self.repo.file(f).read(mf2[f]), \ | |
179 self.repo.file(f).read(mf[f]), f) | |
180 for f in a: | |
181 self.show_diff('', self.repo.file(f).read(mf[f]), f) | |
182 for f in d: | |
183 self.show_diff(self.repo.file(f).read(mf2[f]), '', f) | |
184 | |
185 class filepage(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
186 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
|
187 page.__init__(self, tmpl_dir) |
131 | 188 self.repo = repo |
189 self.fn = fn | |
190 if cs: | |
191 chng = self.repo.changelog.read(hg.bin(cs)) | |
192 mf = self.repo.manifest.read(chng[0]) | |
193 self.node = mf[self.fn] | |
194 self.nodestr = hg.hex(self.node) | |
195 else: | |
196 self.nodestr = node | |
197 self.node = hg.bin(node) | |
198 print '<div class="filename">%s (%s)</div>' % \ | |
199 (cgi.escape(self.fn), self.nodestr, ) | |
200 print '<a href="?cmd=hist;fn=%s">history</a><br />' % self.fn | |
201 | |
202 def content(self): | |
203 print '<pre>' | |
204 print cgi.escape(self.repo.file(self.fn).read(self.node)) | |
205 print '</pre>' | |
206 | |
207 class mfpage(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
208 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
|
209 page.__init__(self, tmpl_dir) |
131 | 210 self.repo = repo |
211 self.nodestr = node | |
212 self.node = hg.bin(node) | |
213 | |
214 def content(self): | |
215 mf = self.repo.manifest.read(self.node) | |
216 fns = mf.keys() | |
217 fns.sort() | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
218 print self.tmpl.do_page('mftitle.tmpl', node = self.nodestr) |
131 | 219 for f in fns: |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
220 print self.tmpl.do_page('mfentry.tmpl', fn=f, node=hg.hex(mf[f])) |
131 | 221 |
222 class histpage(page): | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
223 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
|
224 page.__init__(self, tmpl_dir) |
131 | 225 self.repo = repo |
226 self.fn = fn | |
227 | |
228 def content(self): | |
229 print '<div class="filehist">File History: %s</div>' % self.fn | |
230 r = self.repo.file(self.fn) | |
231 print '<br />' | |
232 print '<table summary="" width="100%" align="center">' | |
233 for i in xrange(r.count()-1, -1, -1): | |
234 print '<tr><td>' | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
235 self.hist_ent(i, r) |
131 | 236 print '</tr></td>' |
237 print '</table>' | |
238 | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
239 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
|
240 n = r.node(i) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
241 (p1, p2) = r.parents(n) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
242 (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
|
243 (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
|
244 ci = r.linkrev(n) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
245 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
|
246 cs = hg.hex(cn) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
247 changes = self.repo.changelog.read(cn) |
131 | 248 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
|
249 p2entry = '' |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
250 if i2 != -1: |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
251 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
|
252 % (i2, h2, self.fn, h2 ), |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
253 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
|
254 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
|
255 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
|
256 p1node=h1, p2entry=p2entry) |
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
257 |
132 | 258 class hgweb: |
259 repo_path = "." | |
260 numchanges = 50 | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
261 tmpl_dir = "templates" |
131 | 262 |
132 | 263 def __init__(self): |
264 pass | |
131 | 265 |
132 | 266 def run(self): |
267 | |
268 args = cgi.parse() | |
269 | |
270 ui = hg.ui() | |
271 repo = hg.repository(ui, self.repo_path) | |
131 | 272 |
132 | 273 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
|
274 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
|
275 self.numchanges) |
132 | 276 hi = args.get('hi', ( repo.changelog.count(), )) |
277 page.content(hi = int(hi[0])) | |
278 page.endpage() | |
279 | |
280 elif args['cmd'][0] == 'chkin': | |
281 if not args.has_key('nd'): | |
282 page = errpage() | |
283 print '<div class="errmsg">No Node!</div>' | |
284 else: | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
285 page = checkin(repo, self.tmpl_dir, args['nd'][0]) |
132 | 286 page.content() |
287 page.endpage() | |
131 | 288 |
132 | 289 elif args['cmd'][0] == 'file': |
290 if not (args.has_key('nd') and args.has_key('fn')) and \ | |
291 not (args.has_key('cs') and args.has_key('fn')): | |
292 page = errpage() | |
293 print '<div class="errmsg">Invalid Args!</div>' | |
294 else: | |
295 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
|
296 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
|
297 args['fn'][0], node=args['nd'][0]) |
132 | 298 else: |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
299 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
|
300 args['fn'][0], cs=args['cs'][0]) |
132 | 301 page.content() |
302 page.endpage() | |
131 | 303 |
132 | 304 elif args['cmd'][0] == 'mf': |
305 if not args.has_key('nd'): | |
306 page = errpage() | |
307 print '<div class="errmsg">No Node!</div>' | |
308 else: | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
309 page = mfpage(repo, self.tmpl_dir, args['nd'][0]) |
132 | 310 page.content() |
311 page.endpage() | |
131 | 312 |
132 | 313 elif args['cmd'][0] == 'hist': |
314 if not args.has_key('fn'): | |
315 page = errpage() | |
316 print '<div class="errmsg">No Filename!</div>' | |
317 else: | |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
318 page = histpage(repo, self.tmpl_dir, args['fn'][0]) |
132 | 319 page.content() |
320 page.endpage() | |
321 | |
322 elif args['cmd'][0] == 'branches': | |
323 httphdr("text/plain") | |
324 nodes = [] | |
325 if args.has_key('nodes'): | |
326 nodes = map(hg.bin, args['nodes'][0].split(" ")) | |
327 for b in repo.branches(nodes): | |
328 print " ".join(map(hg.hex, b)) | |
131 | 329 |
132 | 330 elif args['cmd'][0] == 'between': |
331 httphdr("text/plain") | |
332 nodes = [] | |
333 if args.has_key('pairs'): | |
334 pairs = [ map(hg.bin, p.split("-")) | |
335 for p in args['pairs'][0].split(" ") ] | |
336 for b in repo.between(pairs): | |
337 print " ".join(map(hg.hex, b)) | |
338 | |
339 elif args['cmd'][0] == 'changegroup': | |
340 httphdr("application/hg-changegroup") | |
341 nodes = [] | |
342 if args.has_key('roots'): | |
343 nodes = map(hg.bin, args['roots'][0].split(" ")) | |
131 | 344 |
132 | 345 z = zlib.compressobj() |
346 for chunk in repo.changegroup(nodes): | |
347 sys.stdout.write(z.compress(chunk)) | |
348 | |
349 sys.stdout.write(z.flush()) | |
131 | 350 |
132 | 351 else: |
352 page = errpage() | |
353 print '<div class="errmsg">unknown command: %s</div>' % \ | |
354 cgi.escape(args['cmd'][0]) | |
355 page.endpage() | |
131 | 356 |
132 | 357 if __name__ == "__main__": |
358 hgweb().run() |