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