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