82 else: |
82 else: |
83 yield tmpl |
83 yield tmpl |
84 return |
84 return |
85 |
85 |
86 class templater: |
86 class templater: |
87 def __init__(self, mapfile, filters = {}): |
87 def __init__(self, mapfile, filters = {}, defaults = {}): |
88 self.cache = {} |
88 self.cache = {} |
89 self.map = {} |
89 self.map = {} |
90 self.base = os.path.dirname(mapfile) |
90 self.base = os.path.dirname(mapfile) |
91 self.filters = filters |
91 self.filters = filters |
|
92 self.defaults = defaults |
92 |
93 |
93 for l in file(mapfile): |
94 for l in file(mapfile): |
94 m = re.match(r'(\S+)\s*=\s*"(.*)"$', l) |
95 m = re.match(r'(\S+)\s*=\s*"(.*)"$', l) |
95 if m: |
96 if m: |
96 self.cache[m.group(1)] = m.group(2) |
97 self.cache[m.group(1)] = m.group(2) |
100 self.map[m.group(1)] = os.path.join(self.base, m.group(2)) |
101 self.map[m.group(1)] = os.path.join(self.base, m.group(2)) |
101 else: |
102 else: |
102 raise "unknown map entry '%s'" % l |
103 raise "unknown map entry '%s'" % l |
103 |
104 |
104 def __call__(self, t, **map): |
105 def __call__(self, t, **map): |
|
106 m = self.defaults.copy() |
|
107 m.update(map) |
105 try: |
108 try: |
106 tmpl = self.cache[t] |
109 tmpl = self.cache[t] |
107 except KeyError: |
110 except KeyError: |
108 tmpl = self.cache[t] = file(self.map[t]).read() |
111 tmpl = self.cache[t] = file(self.map[t]).read() |
109 return template(tmpl, self.filters, **map) |
112 return template(tmpl, self.filters, **m) |
110 |
113 |
111 def rfc822date(x): |
114 def rfc822date(x): |
112 return strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(x)) |
115 return time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(x)) |
113 |
116 |
114 class hgweb: |
117 class hgweb: |
115 maxchanges = 10 |
118 maxchanges = 10 |
116 maxfiles = 10 |
119 maxfiles = 10 |
117 |
120 |
219 to = r.file(f).read(mmap1[f]) |
222 to = r.file(f).read(mmap1[f]) |
220 tn = None |
223 tn = None |
221 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f), f, tn) |
224 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f), f, tn) |
222 |
225 |
223 def header(self): |
226 def header(self): |
224 port = os.environ["SERVER_PORT"] |
227 yield self.t("header") |
225 port = port != "80" and (":" + port) or "" |
|
226 self.url = "http://%s%s%s" % \ |
|
227 (os.environ["SERVER_NAME"], port, os.environ["REQUEST_URI"]) |
|
228 |
|
229 yield self.t("header", repo = self.reponame, url = self.url) |
|
230 |
228 |
231 def footer(self): |
229 def footer(self): |
232 yield self.t("footer", repo = self.reponame) |
230 yield self.t("footer") |
233 |
231 |
234 def changelog(self, pos): |
232 def changelog(self, pos): |
235 def changenav(): |
233 def changenav(): |
236 def seq(factor = 1): |
234 def seq(factor = 1): |
237 yield 1 * factor |
235 yield 1 * factor |
288 start = max(0, pos - self.maxchanges + 1) |
286 start = max(0, pos - self.maxchanges + 1) |
289 end = min(count, start + self.maxchanges) |
287 end = min(count, start + self.maxchanges) |
290 pos = end - 1 |
288 pos = end - 1 |
291 |
289 |
292 yield self.t('changelog', |
290 yield self.t('changelog', |
293 header = self.header(), |
|
294 footer = self.footer(), |
|
295 repo = self.reponame, |
|
296 changenav = changenav, |
291 changenav = changenav, |
297 manifest = hex(mf), |
292 manifest = hex(mf), |
298 rev = pos, changesets = count, entries = changelist) |
293 rev = pos, changesets = count, entries = changelist) |
299 |
294 |
300 def search(self, query): |
295 def search(self, query): |
346 |
341 |
347 cl = self.repo.changelog |
342 cl = self.repo.changelog |
348 mf = cl.read(cl.tip())[0] |
343 mf = cl.read(cl.tip())[0] |
349 |
344 |
350 yield self.t('search', |
345 yield self.t('search', |
351 header = self.header(), |
|
352 footer = self.footer(), |
|
353 query = query, |
346 query = query, |
354 repo = self.reponame, |
|
355 manifest = hex(mf), |
347 manifest = hex(mf), |
356 entries = changelist) |
348 entries = changelist) |
357 |
349 |
358 def changeset(self, nodeid): |
350 def changeset(self, nodeid): |
359 n = bin(nodeid) |
351 n = bin(nodeid) |
370 |
362 |
371 def diff(): |
363 def diff(): |
372 yield self.diff(p1, n, changes[3]) |
364 yield self.diff(p1, n, changes[3]) |
373 |
365 |
374 yield self.t('changeset', |
366 yield self.t('changeset', |
375 header = self.header(), |
|
376 footer = self.footer(), |
|
377 repo = self.reponame, |
|
378 diff = diff, |
367 diff = diff, |
379 rev = cl.rev(n), |
368 rev = cl.rev(n), |
380 node = nodeid, |
369 node = nodeid, |
381 parent = self.parents("changesetparent", |
370 parent = self.parents("changesetparent", |
382 cl.parents(n), cl.rev), |
371 cl.parents(n), cl.rev), |
418 parity = 1 - parity |
407 parity = 1 - parity |
419 |
408 |
420 yield l |
409 yield l |
421 |
410 |
422 yield self.t("filelog", |
411 yield self.t("filelog", |
423 header = self.header(), |
|
424 footer = self.footer(), |
|
425 repo = self.reponame, |
|
426 file = f, |
412 file = f, |
427 filenode = filenode, |
413 filenode = filenode, |
428 entries = entries) |
414 entries = entries) |
429 |
415 |
430 def filerevision(self, f, node): |
416 def filerevision(self, f, node): |
443 yield self.t("fileline", line = t, |
429 yield self.t("fileline", line = t, |
444 linenumber = "% 6d" % (l + 1), |
430 linenumber = "% 6d" % (l + 1), |
445 parity = l & 1) |
431 parity = l & 1) |
446 |
432 |
447 yield self.t("filerevision", file = f, |
433 yield self.t("filerevision", file = f, |
448 header = self.header(), |
|
449 footer = self.footer(), |
|
450 repo = self.reponame, |
|
451 filenode = node, |
434 filenode = node, |
452 path = up(f), |
435 path = up(f), |
453 text = lines(), |
436 text = lines(), |
454 rev = changerev, |
437 rev = changerev, |
455 node = hex(cn), |
438 node = hex(cn), |
566 path = os.path.join(path, f), |
546 path = os.path.join(path, f), |
567 manifest = mnode, basename = f[:-1]) |
547 manifest = mnode, basename = f[:-1]) |
568 parity = 1 - parity |
548 parity = 1 - parity |
569 |
549 |
570 yield self.t("manifest", |
550 yield self.t("manifest", |
571 header = self.header(), |
|
572 footer = self.footer(), |
|
573 repo = self.reponame, |
|
574 manifest = mnode, |
551 manifest = mnode, |
575 rev = rev, |
552 rev = rev, |
576 node = hex(node), |
553 node = hex(node), |
577 path = path, |
554 path = path, |
578 up = up(path), |
555 up = up(path), |
610 |
584 |
611 def diff(): |
585 def diff(): |
612 yield self.diff(p1, n, file) |
586 yield self.diff(p1, n, file) |
613 |
587 |
614 yield self.t("filediff", |
588 yield self.t("filediff", |
615 header = self.header(), |
|
616 footer = self.footer(), |
|
617 repo = self.reponame, |
|
618 file = file, |
589 file = file, |
619 filenode = hex(mf.get(file, nullid)), |
590 filenode = hex(mf.get(file, nullid)), |
620 node = changeset, |
591 node = changeset, |
621 rev = self.repo.changelog.rev(n), |
592 rev = self.repo.changelog.rev(n), |
622 parent = self.parents("filediffparent", |
593 parent = self.parents("filediffparent", |
635 if args.has_key('style'): |
606 if args.has_key('style'): |
636 b = os.path.basename("map-" + args['style'][0]) |
607 b = os.path.basename("map-" + args['style'][0]) |
637 p = os.path.join(self.templates, b) |
608 p = os.path.join(self.templates, b) |
638 if os.path.isfile(p): m = p |
609 if os.path.isfile(p): m = p |
639 |
610 |
640 self.t = templater(m, self.filters) |
611 port = os.environ["SERVER_PORT"] |
|
612 port = port != "80" and (":" + port) or "" |
|
613 url = "http://%s%s%s" % \ |
|
614 (os.environ["SERVER_NAME"], port, os.environ["REQUEST_URI"]) |
|
615 |
|
616 self.t = templater(m, self.filters, |
|
617 {"url":url, |
|
618 "repo":self.reponame, |
|
619 "header":self.header(), |
|
620 "footer":self.footer(), |
|
621 }) |
641 |
622 |
642 if not args.has_key('cmd') or args['cmd'][0] == 'changelog': |
623 if not args.has_key('cmd') or args['cmd'][0] == 'changelog': |
643 c = self.repo.changelog.count() - 1 |
624 c = self.repo.changelog.count() - 1 |
644 hi = c |
625 hi = c |
645 if args.has_key('rev'): |
626 if args.has_key('rev'): |