mercurial/hgweb.py
changeset 515 03f27b1381f9
parent 391 5f65a108a559
child 533 b8404005d6d5
child 542 eda4c32c167a
equal deleted inserted replaced
514:874e577e332e 515:03f27b1381f9
    74 
    74 
    75             fl = m.group(2)
    75             fl = m.group(2)
    76             if fl:
    76             if fl:
    77                 for f in fl.split("|")[1:]:
    77                 for f in fl.split("|")[1:]:
    78                     v = filters[f](v)
    78                     v = filters[f](v)
    79                 
    79 
    80             yield v
    80             yield v
    81             tmpl = tmpl[m.end(0):]
    81             tmpl = tmpl[m.end(0):]
    82         else:
    82         else:
    83             yield tmpl
    83             yield tmpl
    84             return
    84             return
    87     def __init__(self, mapfile, filters = {}):
    87     def __init__(self, mapfile, filters = {}):
    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         
    92 
    93         for l in file(mapfile):
    93         for l in file(mapfile):
    94             m = re.match(r'(\S+)\s*=\s*"(.*)"$', l)
    94             m = re.match(r'(\S+)\s*=\s*"(.*)"$', l)
    95             if m:
    95             if m:
    96                 self.cache[m.group(1)] = m.group(2)
    96                 self.cache[m.group(1)] = m.group(2)
    97             else:
    97             else:
   105         try:
   105         try:
   106             tmpl = self.cache[t]
   106             tmpl = self.cache[t]
   107         except KeyError:
   107         except KeyError:
   108             tmpl = self.cache[t] = file(self.map[t]).read()
   108             tmpl = self.cache[t] = file(self.map[t]).read()
   109         return template(tmpl, self.filters, **map)
   109         return template(tmpl, self.filters, **map)
   110         
   110 
   111 class hgweb:
   111 class hgweb:
   112     maxchanges = 10
   112     maxchanges = 10
   113     maxfiles = 10
   113     maxfiles = 10
   114 
   114 
   115     def __init__(self, path, name, templates = ""):
   115     def __init__(self, path, name, templates = ""):
   156             yield self.t(t1, node = node, rev = rev, **args)
   156             yield self.t(t1, node = node, rev = rev, **args)
   157 
   157 
   158     def diff(self, node1, node2, files):
   158     def diff(self, node1, node2, files):
   159         def filterfiles(list, files):
   159         def filterfiles(list, files):
   160             l = [ x for x in list if x in files ]
   160             l = [ x for x in list if x in files ]
   161             
   161 
   162             for f in files:
   162             for f in files:
   163                 if f[-1] != os.sep: f += os.sep
   163                 if f[-1] != os.sep: f += os.sep
   164                 l += [ x for x in list if x.startswith(f) ]
   164                 l += [ x for x in list if x.startswith(f) ]
   165             return l
   165             return l
   166 
   166 
   170                          lines = prettyprintlines(diff),
   170                          lines = prettyprintlines(diff),
   171                          parity = parity[0],
   171                          parity = parity[0],
   172                          file = f,
   172                          file = f,
   173                          filenode = hex(fn or nullid))
   173                          filenode = hex(fn or nullid))
   174             parity[0] = 1 - parity[0]
   174             parity[0] = 1 - parity[0]
   175             
   175 
   176         def prettyprintlines(diff):
   176         def prettyprintlines(diff):
   177             for l in diff.splitlines(1):
   177             for l in diff.splitlines(1):
   178                 if l.startswith('+'):
   178                 if l.startswith('+'):
   179                     yield self.t("difflineplus", line = l)
   179                     yield self.t("difflineplus", line = l)
   180                 elif l.startswith('-'):
   180                 elif l.startswith('-'):
   232                 r = "%d" % f
   232                 r = "%d" % f
   233                 if pos + f < count: l.append(("+" + r, pos + f))
   233                 if pos + f < count: l.append(("+" + r, pos + f))
   234                 if pos - f >= 0: l.insert(0, ("-" + r, pos - f))
   234                 if pos - f >= 0: l.insert(0, ("-" + r, pos - f))
   235 
   235 
   236             yield self.t("naventry", rev = 0, label="(0)")
   236             yield self.t("naventry", rev = 0, label="(0)")
   237                     
   237 
   238             for label, rev in l:
   238             for label, rev in l:
   239                 yield self.t("naventry", label = label, rev = rev)
   239                 yield self.t("naventry", label = label, rev = rev)
   240 
   240 
   241             yield self.t("naventry", label="tip")
   241             yield self.t("naventry", label="tip")
   242 
   242 
   291         cl = self.repo.changelog
   291         cl = self.repo.changelog
   292         changes = cl.read(n)
   292         changes = cl.read(n)
   293         p1, p2 = cl.parents(n)
   293         p1, p2 = cl.parents(n)
   294         p1rev, p2rev = cl.rev(p1), cl.rev(p2)
   294         p1rev, p2rev = cl.rev(p1), cl.rev(p2)
   295         t = float(changes[2].split(' ')[0])
   295         t = float(changes[2].split(' ')[0])
   296         
   296 
   297         files = []
   297         files = []
   298         mf = self.repo.manifest.read(changes[0])
   298         mf = self.repo.manifest.read(changes[0])
   299         for f in changes[3]:
   299         for f in changes[3]:
   300             files.append(self.t("filenodelink",
   300             files.append(self.t("filenodelink",
   301                                 filenode = hex(mf.get(f, nullid)), file = f))
   301                                 filenode = hex(mf.get(f, nullid)), file = f))
   328         count = fl.count()
   328         count = fl.count()
   329 
   329 
   330         def entries():
   330         def entries():
   331             l = []
   331             l = []
   332             parity = (count - 1) & 1
   332             parity = (count - 1) & 1
   333             
   333 
   334             for i in range(count):
   334             for i in range(count):
   335 
   335 
   336                 n = fl.node(i)
   336                 n = fl.node(i)
   337                 lr = fl.linkrev(n)
   337                 lr = fl.linkrev(n)
   338                 cn = cl.node(lr)
   338                 cn = cl.node(lr)
   421             for r, l in fl.annotate(n):
   421             for r, l in fl.annotate(n):
   422                 try:
   422                 try:
   423                     cnode = ncache[r]
   423                     cnode = ncache[r]
   424                 except KeyError:
   424                 except KeyError:
   425                     cnode = ncache[r] = self.repo.changelog.node(r)
   425                     cnode = ncache[r] = self.repo.changelog.node(r)
   426                     
   426 
   427                 try:
   427                 try:
   428                     name = bcache[r]
   428                     name = bcache[r]
   429                 except KeyError:
   429                 except KeyError:
   430                     cl = self.repo.changelog.read(cnode)
   430                     cl = self.repo.changelog.read(cnode)
   431                     name = cl[1]
   431                     name = cl[1]
   472         rev = self.repo.manifest.rev(bin(mnode))
   472         rev = self.repo.manifest.rev(bin(mnode))
   473         node = self.repo.changelog.node(rev)
   473         node = self.repo.changelog.node(rev)
   474         mff=self.repo.manifest.readflags(bin(mnode))
   474         mff=self.repo.manifest.readflags(bin(mnode))
   475 
   475 
   476         files = {}
   476         files = {}
   477  
   477 
   478         p = path[1:]
   478         p = path[1:]
   479         l = len(p)
   479         l = len(p)
   480 
   480 
   481         for f,n in mf.items():
   481         for f,n in mf.items():
   482             if f[:l] != p:
   482             if f[:l] != p:
   499                     yield self.t("manifestfileentry",
   499                     yield self.t("manifestfileentry",
   500                                  file = full,
   500                                  file = full,
   501                                  manifest = mnode,
   501                                  manifest = mnode,
   502                                  filenode = hex(fnode),
   502                                  filenode = hex(fnode),
   503                                  parity = parity,
   503                                  parity = parity,
   504                                  basename = f, 
   504                                  basename = f,
   505                                  permissions = mff[full])
   505                                  permissions = mff[full])
   506                 else:
   506                 else:
   507                     yield self.t("manifestdirentry",
   507                     yield self.t("manifestdirentry",
   508                                  parity = parity,
   508                                  parity = parity,
   509                                  path = os.path.join(path, f),
   509                                  path = os.path.join(path, f),
   548         n = bin(changeset)
   548         n = bin(changeset)
   549         cl = self.repo.changelog
   549         cl = self.repo.changelog
   550         p1 = cl.parents(n)[0]
   550         p1 = cl.parents(n)[0]
   551         cs = cl.read(n)
   551         cs = cl.read(n)
   552         mf = self.repo.manifest.read(cs[0])
   552         mf = self.repo.manifest.read(cs[0])
   553         
   553 
   554         def diff():
   554         def diff():
   555             yield self.diff(p1, n, file)
   555             yield self.diff(p1, n, file)
   556 
   556 
   557         yield self.t("filediff",
   557         yield self.t("filediff",
   558                      header = self.header(),
   558                      header = self.header(),
   563                      node = changeset,
   563                      node = changeset,
   564                      rev = self.repo.changelog.rev(n),
   564                      rev = self.repo.changelog.rev(n),
   565                      p1 = hex(p1),
   565                      p1 = hex(p1),
   566                      p1rev = self.repo.changelog.rev(p1),
   566                      p1rev = self.repo.changelog.rev(p1),
   567                      diff = diff)
   567                      diff = diff)
   568                      
   568 
   569     # add tags to things
   569     # add tags to things
   570     # tags -> list of changesets corresponding to tags
   570     # tags -> list of changesets corresponding to tags
   571     # find tag, changeset, file
   571     # find tag, changeset, file
   572 
   572 
   573     def run(self):
   573     def run(self):
   577         m = os.path.join(self.templates, "map")
   577         m = os.path.join(self.templates, "map")
   578         if args.has_key('style'):
   578         if args.has_key('style'):
   579             b = os.path.basename("map-" + args['style'][0])
   579             b = os.path.basename("map-" + args['style'][0])
   580             p = os.path.join(self.templates, b)
   580             p = os.path.join(self.templates, b)
   581             if os.path.isfile(p): m = p
   581             if os.path.isfile(p): m = p
   582             
   582 
   583         self.t = templater(m, self.filters)
   583         self.t = templater(m, self.filters)
   584 
   584 
   585         if not args.has_key('cmd') or args['cmd'][0] == 'changelog':
   585         if not args.has_key('cmd') or args['cmd'][0] == 'changelog':
   586             hi = self.repo.changelog.count() - 1
   586             hi = self.repo.changelog.count() - 1
   587             if args.has_key('rev'):
   587             if args.has_key('rev'):
   589                 try:
   589                 try:
   590                     hi = self.repo.changelog.rev(self.repo.lookup(hi))
   590                     hi = self.repo.changelog.rev(self.repo.lookup(hi))
   591                 except KeyError: pass
   591                 except KeyError: pass
   592 
   592 
   593             write(self.changelog(hi))
   593             write(self.changelog(hi))
   594             
   594 
   595         elif args['cmd'][0] == 'changeset':
   595         elif args['cmd'][0] == 'changeset':
   596             write(self.changeset(args['node'][0]))
   596             write(self.changeset(args['node'][0]))
   597 
   597 
   598         elif args['cmd'][0] == 'manifest':
   598         elif args['cmd'][0] == 'manifest':
   599             write(self.manifest(args['manifest'][0], args['path'][0]))
   599             write(self.manifest(args['manifest'][0], args['path'][0]))
   672             query = ""
   672             query = ""
   673             p = self.path.find("?")
   673             p = self.path.find("?")
   674             if p:
   674             if p:
   675                 query = self.path[p + 1:]
   675                 query = self.path[p + 1:]
   676                 query = query.replace('+', ' ')
   676                 query = query.replace('+', ' ')
   677         
   677 
   678             env = {}
   678             env = {}
   679             env['GATEWAY_INTERFACE'] = 'CGI/1.1'
   679             env['GATEWAY_INTERFACE'] = 'CGI/1.1'
   680             env['REQUEST_METHOD'] = self.command
   680             env['REQUEST_METHOD'] = self.command
   681             if query:
   681             if query:
   682                 env['QUERY_STRING'] = query
   682                 env['QUERY_STRING'] = query