mercurial/hgweb/hgweb_mod.py
changeset 2436 f910b91dd912
parent 2434 a2df85adface
child 2442 c660691fb45d
equal deleted inserted replaced
2435:ff2bac730b99 2436:f910b91dd912
    35             self.repo = repo
    35             self.repo = repo
    36 
    36 
    37         self.mtime = -1
    37         self.mtime = -1
    38         self.reponame = name
    38         self.reponame = name
    39         self.archives = 'zip', 'gz', 'bz2'
    39         self.archives = 'zip', 'gz', 'bz2'
       
    40         self.templatepath = self.repo.ui.config("web", "templates",
       
    41                                                 templater.templatepath())
    40 
    42 
    41     def refresh(self):
    43     def refresh(self):
    42         mtime = get_mtime(self.repo.root)
    44         mtime = get_mtime(self.repo.root)
    43         if mtime != self.mtime:
    45         if mtime != self.mtime:
    44             self.mtime = mtime
    46             self.mtime = mtime
   642 
   644 
   643     # add tags to things
   645     # add tags to things
   644     # tags -> list of changesets corresponding to tags
   646     # tags -> list of changesets corresponding to tags
   645     # find tag, changeset, file
   647     # find tag, changeset, file
   646 
   648 
       
   649     def cleanpath(self, path):
       
   650         p = util.normpath(path)
       
   651         if p[:2] == "..":
       
   652             raise Exception("suspicious path")
       
   653         return p
       
   654 
   647     def run(self, req=hgrequest()):
   655     def run(self, req=hgrequest()):
   648         def clean(path):
       
   649             p = util.normpath(path)
       
   650             if p[:2] == "..":
       
   651                 raise Exception("suspicious path")
       
   652             return p
       
   653 
       
   654         def header(**map):
   656         def header(**map):
   655             yield self.t("header", **map)
   657             yield self.t("header", **map)
   656 
   658 
   657         def footer(**map):
   659         def footer(**map):
   658             yield self.t("footer",
   660             yield self.t("footer",
   684 
   686 
   685         self.refresh()
   687         self.refresh()
   686 
   688 
   687         expand_form(req.form)
   689         expand_form(req.form)
   688 
   690 
   689         t = self.repo.ui.config("web", "templates", templater.templatepath())
   691         m = os.path.join(self.templatepath, "map")
   690         static = self.repo.ui.config("web", "static", os.path.join(t,"static"))
       
   691         m = os.path.join(t, "map")
       
   692         style = self.repo.ui.config("web", "style", "")
   692         style = self.repo.ui.config("web", "style", "")
   693         if req.form.has_key('style'):
   693         if req.form.has_key('style'):
   694             style = req.form['style'][0]
   694             style = req.form['style'][0]
   695         if style:
   695         if style:
   696             b = os.path.basename("map-" + style)
   696             b = os.path.basename("map-" + style)
   697             p = os.path.join(t, b)
   697             p = os.path.join(self.templatepath, b)
   698             if os.path.isfile(p):
   698             if os.path.isfile(p):
   699                 m = p
   699                 m = p
   700 
   700 
   701         port = req.env["SERVER_PORT"]
   701         port = req.env["SERVER_PORT"]
   702         port = port != "80" and (":" + port) or ""
   702         port = port != "80" and (":" + port) or ""
   717 
   717 
   718         if not req.form.has_key('cmd'):
   718         if not req.form.has_key('cmd'):
   719             req.form['cmd'] = [self.t.cache['default'],]
   719             req.form['cmd'] = [self.t.cache['default'],]
   720 
   720 
   721         cmd = req.form['cmd'][0]
   721         cmd = req.form['cmd'][0]
   722         if cmd == 'changelog':
   722 
   723             hi = self.repo.changelog.count() - 1
   723         method = getattr(self, 'do_' + cmd, None)
   724             if req.form.has_key('rev'):
   724         if method:
   725                 hi = req.form['rev'][0]
   725             method(req)
   726                 try:
       
   727                     hi = self.repo.changelog.rev(self.repo.lookup(hi))
       
   728                 except hg.RepoError:
       
   729                     req.write(self.search(hi)) # XXX redirect to 404 page?
       
   730                     return
       
   731 
       
   732             req.write(self.changelog(hi))
       
   733 
       
   734         elif cmd == 'changeset':
       
   735             req.write(self.changeset(req.form['node'][0]))
       
   736 
       
   737         elif cmd == 'manifest':
       
   738             req.write(self.manifest(req.form['manifest'][0],
       
   739                                     clean(req.form['path'][0])))
       
   740 
       
   741         elif cmd == 'tags':
       
   742             req.write(self.tags())
       
   743 
       
   744         elif cmd == 'summary':
       
   745             req.write(self.summary())
       
   746 
       
   747         elif cmd == 'filediff':
       
   748             req.write(self.filediff(clean(req.form['file'][0]),
       
   749                                     req.form['node'][0]))
       
   750 
       
   751         elif cmd == 'file':
       
   752             req.write(self.filerevision(clean(req.form['file'][0]),
       
   753                                         req.form['filenode'][0]))
       
   754 
       
   755         elif cmd == 'annotate':
       
   756             req.write(self.fileannotate(clean(req.form['file'][0]),
       
   757                                         req.form['filenode'][0]))
       
   758 
       
   759         elif cmd == 'filelog':
       
   760             req.write(self.filelog(clean(req.form['file'][0]),
       
   761                                    req.form['filenode'][0]))
       
   762 
       
   763         elif cmd == 'heads':
       
   764             resp = " ".join(map(hex, self.repo.heads())) + "\n"
       
   765             req.httphdr("application/mercurial-0.1", length=len(resp))
       
   766             req.write(resp)
       
   767 
       
   768         elif cmd == 'branches':
       
   769             nodes = []
       
   770             if req.form.has_key('nodes'):
       
   771                 nodes = map(bin, req.form['nodes'][0].split(" "))
       
   772             resp = cStringIO.StringIO()
       
   773             for b in self.repo.branches(nodes):
       
   774                 resp.write(" ".join(map(hex, b)) + "\n")
       
   775             resp = resp.getvalue()
       
   776             req.httphdr("application/mercurial-0.1", length=len(resp))
       
   777             req.write(resp)
       
   778 
       
   779         elif cmd == 'between':
       
   780             nodes = []
       
   781             if req.form.has_key('pairs'):
       
   782                 pairs = [map(bin, p.split("-"))
       
   783                          for p in req.form['pairs'][0].split(" ")]
       
   784             resp = cStringIO.StringIO()
       
   785             for b in self.repo.between(pairs):
       
   786                 resp.write(" ".join(map(hex, b)) + "\n")
       
   787             resp = resp.getvalue()
       
   788             req.httphdr("application/mercurial-0.1", length=len(resp))
       
   789             req.write(resp)
       
   790 
       
   791         elif cmd == 'changegroup':
       
   792             req.httphdr("application/mercurial-0.1")
       
   793             nodes = []
       
   794             if not self.allowpull:
       
   795                 return
       
   796 
       
   797             if req.form.has_key('roots'):
       
   798                 nodes = map(bin, req.form['roots'][0].split(" "))
       
   799 
       
   800             z = zlib.compressobj()
       
   801             f = self.repo.changegroup(nodes, 'serve')
       
   802             while 1:
       
   803                 chunk = f.read(4096)
       
   804                 if not chunk:
       
   805                     break
       
   806                 req.write(z.compress(chunk))
       
   807 
       
   808             req.write(z.flush())
       
   809 
       
   810         elif cmd == 'archive':
       
   811             changeset = self.repo.lookup(req.form['node'][0])
       
   812             type_ = req.form['type'][0]
       
   813             allowed = self.repo.ui.config("web", "allow_archive", "").split()
       
   814             if (type_ in self.archives and (type_ in allowed or
       
   815                 self.repo.ui.configbool("web", "allow" + type_, False))):
       
   816                 self.archive(req, changeset, type_)
       
   817                 return
       
   818 
       
   819             req.write(self.t("error"))
       
   820 
       
   821         elif cmd == 'static':
       
   822             fname = req.form['file'][0]
       
   823             req.write(staticfile(static, fname)
       
   824                       or self.t("error", error="%r not found" % fname))
       
   825 
       
   826         else:
   726         else:
   827             req.write(self.t("error"))
   727             req.write(self.t("error"))
   828         req.done()
   728         req.done()
       
   729 
       
   730     def do_changelog(self, req):
       
   731         hi = self.repo.changelog.count() - 1
       
   732         if req.form.has_key('rev'):
       
   733             hi = req.form['rev'][0]
       
   734             try:
       
   735                 hi = self.repo.changelog.rev(self.repo.lookup(hi))
       
   736             except hg.RepoError:
       
   737                 req.write(self.search(hi)) # XXX redirect to 404 page?
       
   738                 return
       
   739 
       
   740         req.write(self.changelog(hi))
       
   741 
       
   742     def do_changeset(self, req):
       
   743         req.write(self.changeset(req.form['node'][0]))
       
   744 
       
   745     def do_manifest(self, req):
       
   746         req.write(self.manifest(req.form['manifest'][0],
       
   747                                 self.cleanpath(req.form['path'][0])))
       
   748 
       
   749     def do_tags(self, req):
       
   750         req.write(self.tags())
       
   751 
       
   752     def do_summary(self, req):
       
   753         req.write(self.summary())
       
   754 
       
   755     def do_filediff(self, req):
       
   756         req.write(self.filediff(self.cleanpath(req.form['file'][0]),
       
   757                                 req.form['node'][0]))
       
   758 
       
   759     def do_file(self, req):
       
   760         req.write(self.filerevision(self.cleanpath(req.form['file'][0]),
       
   761                                     req.form['filenode'][0]))
       
   762 
       
   763     def do_annotate(self, req):
       
   764         req.write(self.fileannotate(self.cleanpath(req.form['file'][0]),
       
   765                                     req.form['filenode'][0]))
       
   766 
       
   767     def do_filelog(self, req):
       
   768         req.write(self.filelog(self.cleanpath(req.form['file'][0]),
       
   769                                req.form['filenode'][0]))
       
   770 
       
   771     def do_heads(self, req):
       
   772         resp = " ".join(map(hex, self.repo.heads())) + "\n"
       
   773         req.httphdr("application/mercurial-0.1", length=len(resp))
       
   774         req.write(resp)
       
   775 
       
   776     def do_branches(self, req):
       
   777         nodes = []
       
   778         if req.form.has_key('nodes'):
       
   779             nodes = map(bin, req.form['nodes'][0].split(" "))
       
   780         resp = cStringIO.StringIO()
       
   781         for b in self.repo.branches(nodes):
       
   782             resp.write(" ".join(map(hex, b)) + "\n")
       
   783         resp = resp.getvalue()
       
   784         req.httphdr("application/mercurial-0.1", length=len(resp))
       
   785         req.write(resp)
       
   786 
       
   787     def do_between(self, req):
       
   788         nodes = []
       
   789         if req.form.has_key('pairs'):
       
   790             pairs = [map(bin, p.split("-"))
       
   791                      for p in req.form['pairs'][0].split(" ")]
       
   792         resp = cStringIO.StringIO()
       
   793         for b in self.repo.between(pairs):
       
   794             resp.write(" ".join(map(hex, b)) + "\n")
       
   795         resp = resp.getvalue()
       
   796         req.httphdr("application/mercurial-0.1", length=len(resp))
       
   797         req.write(resp)
       
   798 
       
   799     def do_changegroup(self, req):
       
   800         req.httphdr("application/mercurial-0.1")
       
   801         nodes = []
       
   802         if not self.allowpull:
       
   803             return
       
   804 
       
   805         if req.form.has_key('roots'):
       
   806             nodes = map(bin, req.form['roots'][0].split(" "))
       
   807 
       
   808         z = zlib.compressobj()
       
   809         f = self.repo.changegroup(nodes, 'serve')
       
   810         while 1:
       
   811             chunk = f.read(4096)
       
   812             if not chunk:
       
   813                 break
       
   814             req.write(z.compress(chunk))
       
   815 
       
   816         req.write(z.flush())
       
   817 
       
   818     def do_archive(self, req):
       
   819         changeset = self.repo.lookup(req.form['node'][0])
       
   820         type_ = req.form['type'][0]
       
   821         allowed = self.repo.ui.config("web", "allow_archive", "").split()
       
   822         if (type_ in self.archives and (type_ in allowed or
       
   823             self.repo.ui.configbool("web", "allow" + type_, False))):
       
   824             self.archive(req, changeset, type_)
       
   825             return
       
   826 
       
   827         req.write(self.t("error"))
       
   828 
       
   829     def do_static(self, req):
       
   830         fname = req.form['file'][0]
       
   831         static = self.repo.ui.config("web", "static",
       
   832                                      os.path.join(self.templatepath,
       
   833                                                   "static"))
       
   834         req.write(staticfile(static, fname)
       
   835                   or self.t("error", error="%r not found" % fname))