comparison mercurial/hgweb.py @ 601:8865eb8ade99

Add globals to templater/fixup RSS -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Add globals to templater/fixup RSS This removes a bunch of duplicate header() and footer() bits and makes url and reponame available to all templates. Fix up RSS bits to use url Fix strftime call manifest hash: 63e616e4c7f517a630d80429336817d64e900b68 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCyLlRywK+sNU5EO8RAj9IAJkBDzMQaOwRmF0q8tRmVRnzHCjShACfSTCj dbfAWg1crv/mUuRZlWL6Tc4= =Z331 -----END PGP SIGNATURE-----
author mpm@selenic.com
date Sun, 03 Jul 2005 20:21:37 -0800
parents 11c379e23ad6
children bc5d058e65e9
comparison
equal deleted inserted replaced
600:11c379e23ad6 601:8865eb8ade99
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),
506 author = name, 489 author = name,
507 file = f, 490 file = f,
508 line = l) 491 line = l)
509 492
510 yield self.t("fileannotate", 493 yield self.t("fileannotate",
511 header = self.header(),
512 footer = self.footer(),
513 repo = self.reponame,
514 file = f, 494 file = f,
515 filenode = node, 495 filenode = node,
516 annotate = annotate, 496 annotate = annotate,
517 path = up(f), 497 path = up(f),
518 rev = changerev, 498 rev = changerev,
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),
593 tag = k, 570 tag = k,
594 node = hex(n)) 571 node = hex(n))
595 parity = 1 - parity 572 parity = 1 - parity
596 573
597 yield self.t("tags", 574 yield self.t("tags",
598 header = self.header(),
599 footer = self.footer(),
600 repo = self.reponame,
601 manifest = hex(mf), 575 manifest = hex(mf),
602 entries = entries) 576 entries = entries)
603 577
604 def filediff(self, file, changeset): 578 def filediff(self, file, changeset):
605 n = bin(changeset) 579 n = bin(changeset)
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'):