mercurial/hgweb/hgwebdir_mod.py
changeset 25083 ef36536abea3
parent 22634 e48a5d3996c2
child 25399 724d7982b790
equal deleted inserted replaced
25082:e30b66bb7d4d 25083:ef36536abea3
   174 
   174 
   175         return False
   175         return False
   176 
   176 
   177     def run_wsgi(self, req):
   177     def run_wsgi(self, req):
   178         try:
   178         try:
   179             try:
   179             self.refresh()
   180                 self.refresh()
   180 
   181 
   181             virtual = req.env.get("PATH_INFO", "").strip('/')
   182                 virtual = req.env.get("PATH_INFO", "").strip('/')
   182             tmpl = self.templater(req)
   183                 tmpl = self.templater(req)
   183             ctype = tmpl('mimetype', encoding=encoding.encoding)
   184                 ctype = tmpl('mimetype', encoding=encoding.encoding)
   184             ctype = templater.stringify(ctype)
   185                 ctype = templater.stringify(ctype)
   185 
   186 
   186             # a static file
   187                 # a static file
   187             if virtual.startswith('static/') or 'static' in req.form:
   188                 if virtual.startswith('static/') or 'static' in req.form:
   188                 if virtual.startswith('static/'):
   189                     if virtual.startswith('static/'):
   189                     fname = virtual[7:]
   190                         fname = virtual[7:]
   190                 else:
   191                     else:
   191                     fname = req.form['static'][0]
   192                         fname = req.form['static'][0]
   192                 static = self.ui.config("web", "static", None,
   193                     static = self.ui.config("web", "static", None,
   193                                         untrusted=False)
   194                                             untrusted=False)
   194                 if not static:
   195                     if not static:
   195                     tp = self.templatepath or templater.templatepaths()
   196                         tp = self.templatepath or templater.templatepaths()
   196                     if isinstance(tp, str):
   197                         if isinstance(tp, str):
   197                         tp = [tp]
   198                             tp = [tp]
   198                     static = [os.path.join(p, 'static') for p in tp]
   199                         static = [os.path.join(p, 'static') for p in tp]
   199                 staticfile(static, fname, req)
   200                     staticfile(static, fname, req)
   200                 return []
   201                     return []
   201 
   202 
   202             # top-level index
   203                 # top-level index
   203             elif not virtual:
   204                 elif not virtual:
   204                 req.respond(HTTP_OK, ctype)
   205                     req.respond(HTTP_OK, ctype)
   205                 return self.makeindex(req, tmpl)
   206                     return self.makeindex(req, tmpl)
   206 
   207 
   207             # nested indexes and hgwebs
   208                 # nested indexes and hgwebs
   208 
   209 
   209             repos = dict(self.repos)
   210                 repos = dict(self.repos)
   210             virtualrepo = virtual
   211                 virtualrepo = virtual
   211             while virtualrepo:
   212                 while virtualrepo:
   212                 real = repos.get(virtualrepo)
   213                     real = repos.get(virtualrepo)
   213                 if real:
   214                     if real:
   214                     req.env['REPO_NAME'] = virtualrepo
   215                         req.env['REPO_NAME'] = virtualrepo
   215                     try:
   216                         try:
   216                         # ensure caller gets private copy of ui
   217                             # ensure caller gets private copy of ui
   217                         repo = hg.repository(self.ui.copy(), real)
   218                             repo = hg.repository(self.ui.copy(), real)
   218                         return hgweb(repo).run_wsgi(req)
   219                             return hgweb(repo).run_wsgi(req)
   219                     except IOError, inst:
   220                         except IOError, inst:
   220                         msg = inst.strerror
   221                             msg = inst.strerror
   221                         raise ErrorResponse(HTTP_SERVER_ERROR, msg)
   222                             raise ErrorResponse(HTTP_SERVER_ERROR, msg)
   222                     except error.RepoError, inst:
   223                         except error.RepoError, inst:
   223                         raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
   224                             raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
   224 
   225 
   225                 up = virtualrepo.rfind('/')
   226                     up = virtualrepo.rfind('/')
   226                 if up < 0:
   227                     if up < 0:
   227                     break
   228                         break
   228                 virtualrepo = virtualrepo[:up]
   229                     virtualrepo = virtualrepo[:up]
   229 
   230 
   230             # browse subdirectories
   231                 # browse subdirectories
   231             subdir = virtual + '/'
   232                 subdir = virtual + '/'
   232             if [r for r in repos if r.startswith(subdir)]:
   233                 if [r for r in repos if r.startswith(subdir)]:
   233                 req.respond(HTTP_OK, ctype)
   234                     req.respond(HTTP_OK, ctype)
   234                 return self.makeindex(req, tmpl, subdir)
   235                     return self.makeindex(req, tmpl, subdir)
   235 
   236 
   236             # prefixes not found
   237                 # prefixes not found
   237             req.respond(HTTP_NOT_FOUND, ctype)
   238                 req.respond(HTTP_NOT_FOUND, ctype)
   238             return tmpl("notfound", repo=virtual)
   239                 return tmpl("notfound", repo=virtual)
   239 
   240 
   240         except ErrorResponse, err:
   241             except ErrorResponse, err:
   241             req.respond(err, ctype)
   242                 req.respond(err, ctype)
   242             return tmpl('error', error=err.message or '')
   243                 return tmpl('error', error=err.message or '')
       
   244         finally:
   243         finally:
   245             tmpl = None
   244             tmpl = None
   246 
   245 
   247     def makeindex(self, req, tmpl, subdir=""):
   246     def makeindex(self, req, tmpl, subdir=""):
   248 
   247