mercurial/hgweb.py
changeset 1123 457c23af92bd
parent 1122 fb008a1a0a32
child 1129 ee4f60abad93
equal deleted inserted replaced
1122:fb008a1a0a32 1123:457c23af92bd
    66         sys.stdout.write('Content-disposition: attachment; filename=%s\n'
    66         sys.stdout.write('Content-disposition: attachment; filename=%s\n'
    67             % file)
    67             % file)
    68     if size > 0:
    68     if size > 0:
    69         sys.stdout.write('Content-length: %d\n' % size)
    69         sys.stdout.write('Content-length: %d\n' % size)
    70     sys.stdout.write('\n')
    70     sys.stdout.write('\n')
    71 
       
    72 def httpnotfound(filename):
       
    73     sys.stdout.write("Status: 404\r\n\r\n")
       
    74     sys.stdout.write("File not found: (%s)" % (filename, ))
       
    75 
    71 
    76 def write(*things):
    72 def write(*things):
    77     for thing in things:
    73     for thing in things:
    78         if hasattr(thing, "__iter__"):
    74         if hasattr(thing, "__iter__"):
    79             for part in thing:
    75             for part in thing:
   935     def __init__(self, config):
   931     def __init__(self, config):
   936         self.cp = ConfigParser.SafeConfigParser()
   932         self.cp = ConfigParser.SafeConfigParser()
   937         self.cp.read(config)
   933         self.cp.read(config)
   938 
   934 
   939     def run(self):
   935     def run(self):
       
   936         def header(**map):
       
   937             yield tmpl("header", **map)
       
   938 
       
   939         def footer(**map):
       
   940             yield tmpl("footer", **map)
       
   941 
       
   942         templates = templatepath()
       
   943         m = os.path.join(templates, "map")
       
   944         tmpl = templater(m, common_filters,
       
   945                          {"header": header, "footer": footer})
       
   946 
       
   947         def entries(**map):
       
   948             parity = 0
       
   949             l = self.cp.items("paths")
       
   950             l.sort()
       
   951             for v,r in l:
       
   952                 cp2 = ConfigParser.SafeConfigParser()
       
   953                 cp2.read(os.path.join(r, ".hg", "hgrc"))
       
   954 
       
   955                 def get(sec, val, default):
       
   956                     try:
       
   957                         return cp2.get(sec, val)
       
   958                     except:
       
   959                         return default
       
   960 
       
   961                 url = os.environ["REQUEST_URI"] + "/" + v
       
   962                 url = url.replace("//", "/")
       
   963 
       
   964                 yield dict(author=get("web", "author", "unknown"),
       
   965                            name=get("web", "name", v),
       
   966                            url=url,
       
   967                            parity=parity,
       
   968                            shortdesc=get("web", "description", "unknown"),
       
   969                            lastupdate=os.stat(os.path.join(r, ".hg",
       
   970                                                 "00changelog.d")).st_mtime)
       
   971 
       
   972                 parity = 1 - parity
       
   973 
   940         try:
   974         try:
   941             virtual = os.environ["PATH_INFO"]
   975             virtual = os.environ["PATH_INFO"]
   942         except:
   976         except:
   943             virtual = ""
   977             virtual = ""
   944 
   978 
   949                 real = self.cp.get("paths", virtual)
   983                 real = self.cp.get("paths", virtual)
   950                 h = hgweb(real)
   984                 h = hgweb(real)
   951                 h.run()
   985                 h.run()
   952                 return
   986                 return
   953             else:
   987             else:
   954                 httpnotfound(virtual)
   988                 write(tmpl("notfound", repo = virtual))
   955                 return
   989                 return
   956 
   990 
   957         def header(**map):
       
   958             yield tmpl("header", **map)
       
   959 
       
   960         def footer(**map):
       
   961             yield tmpl("footer", **map)
       
   962 
       
   963         templates = templatepath()
       
   964         m = os.path.join(templates, "map")
       
   965         tmpl = templater(m, common_filters,
       
   966                          {"header": header, "footer": footer})
       
   967 
       
   968         def entries(**map):
       
   969             parity = 0
       
   970             l = self.cp.items("paths")
       
   971             l.sort()
       
   972             for v,r in l:
       
   973                 cp2 = ConfigParser.SafeConfigParser()
       
   974                 cp2.read(os.path.join(r, ".hg", "hgrc"))
       
   975 
       
   976                 def get(sec, val, default):
       
   977                     try:
       
   978                         return cp2.get(sec, val)
       
   979                     except:
       
   980                         return default
       
   981 
       
   982                 url = os.environ["REQUEST_URI"] + "/" + v
       
   983                 url = url.replace("//", "/")
       
   984 
       
   985                 yield dict(author=get("web", "author", "unknown"),
       
   986                            name=get("web", "name", v),
       
   987                            url=url,
       
   988                            parity=parity,
       
   989                            shortdesc=get("web", "description", "unknown"),
       
   990                            lastupdate=os.stat(os.path.join(r, ".hg",
       
   991                                                 "00changelog.d")).st_mtime)
       
   992 
       
   993                 parity = 1 - parity
       
   994 
       
   995         write(tmpl("index", entries=entries))
   991         write(tmpl("index", entries=entries))