mercurial/hgweb.py
changeset 601 8865eb8ade99
parent 600 11c379e23ad6
child 603 bc5d058e65e9
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'):