mercurial/hgweb.py
changeset 987 bfe12654764d
parent 986 2810c625ca98
child 1022 31dcaf9123ba
equal deleted inserted replaced
986:2810c625ca98 987:bfe12654764d
   136     "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"),
   136     "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"),
   137     "rfc822date": rfc822date,
   137     "rfc822date": rfc822date,
   138     }
   138     }
   139 
   139 
   140 class hgweb:
   140 class hgweb:
   141 
   141     def __init__(self, repo, name=None):
   142     def __init__(self, path, name=None, templates=""):
   142         if type(repo) == type(""):
   143         self.templates = templates
   143             self.repo = repository(ui(), repo)
   144         self.reponame = name
   144         else:
   145         self.path = path
   145             self.repo = repo
       
   146 
   146         self.mtime = -1
   147         self.mtime = -1
   147         self.viewonly = 0
   148         self.reponame = name or self.repo.ui.config("web", "name",
       
   149                                                     self.repo.root)
   148 
   150 
   149     def refresh(self):
   151     def refresh(self):
   150         s = os.stat(os.path.join(self.path, ".hg", "00changelog.i"))
   152         s = os.stat(os.path.join(self.repo.root, ".hg", "00changelog.i"))
   151         if s.st_mtime != self.mtime:
   153         if s.st_mtime != self.mtime:
   152             self.mtime = s.st_mtime
   154             self.mtime = s.st_mtime
   153             self.repo = repository(ui(), self.path)
   155             self.repo = repository(self.repo.ui, self.repo.root)
   154             self.maxchanges = self.repo.ui.config("web", "maxchanges", 10)
   156             self.maxchanges = self.repo.ui.config("web", "maxchanges", 10)
   155             self.maxfiles = self.repo.ui.config("web", "maxchanges", 10)
   157             self.maxfiles = self.repo.ui.config("web", "maxchanges", 10)
   156             self.allowpull = self.repo.ui.configbool("web", "allowpull", True)
   158             self.allowpull = self.repo.ui.configbool("web", "allowpull", True)
   157 
   159 
   158     def date(self, cs):
   160     def date(self, cs):
   621             yield self.t("footer", **map)
   623             yield self.t("footer", **map)
   622 
   624 
   623         self.refresh()
   625         self.refresh()
   624         args = cgi.parse()
   626         args = cgi.parse()
   625 
   627 
   626         t = self.templates or self.repo.ui.config("web", "templates",
   628         t = self.repo.ui.config("web", "templates", templatepath())
   627                                                   templatepath())
       
   628         m = os.path.join(t, "map")
   629         m = os.path.join(t, "map")
   629         style = self.repo.ui.config("web", "style", "")
   630         style = self.repo.ui.config("web", "style", "")
   630         if args.has_key('style'):
   631         if args.has_key('style'):
   631             style = args['style'][0]
   632             style = args['style'][0]
   632         if style:
   633         if style:
   638         port = port != "80" and (":" + port) or ""
   639         port = port != "80" and (":" + port) or ""
   639         uri = os.environ["REQUEST_URI"]
   640         uri = os.environ["REQUEST_URI"]
   640         if "?" in uri: uri = uri.split("?")[0]
   641         if "?" in uri: uri = uri.split("?")[0]
   641         url = "http://%s%s%s" % (os.environ["SERVER_NAME"], port, uri)
   642         url = "http://%s%s%s" % (os.environ["SERVER_NAME"], port, uri)
   642 
   643 
   643         name = self.reponame or self.repo.ui.config("web", "name", os.getcwd())
       
   644 
       
   645         self.t = templater(m, common_filters,
   644         self.t = templater(m, common_filters,
   646                            {"url":url,
   645                            {"url":url,
   647                             "repo":name,
   646                             "repo":self.reponame,
   648                             "header":header,
   647                             "header":header,
   649                             "footer":footer,
   648                             "footer":footer,
   650                             })
   649                             })
   651 
   650 
   652         if not args.has_key('cmd'):
   651         if not args.has_key('cmd'):
   727             sys.stdout.write(z.flush())
   726             sys.stdout.write(z.flush())
   728 
   727 
   729         else:
   728         else:
   730             write(self.t("error"))
   729             write(self.t("error"))
   731 
   730 
   732 def create_server(path, name, templates, address, port, use_ipv6 = False,
   731 def create_server(repo):
   733                   accesslog = sys.stdout, errorlog = sys.stderr):
       
   734 
   732 
   735     def openlog(opt, default):
   733     def openlog(opt, default):
   736         if opt and opt != '-':
   734         if opt and opt != '-':
   737             return open(opt, 'w')
   735             return open(opt, 'w')
   738         return default
   736         return default
   739 
   737 
   740     u = ui()
   738     address = repo.ui.config("web", "address", "")
   741     repo = repository(u, path)
   739     port = int(repo.ui.config("web", "port", 8000))
   742     if not address:
   740     use_ipv6 = repo.ui.configbool("web", "ipv6")
   743         address = u.config("web", "address", "")
   741     accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout)
   744     if not port:
   742     errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr)
   745         port = int(u.config("web", "port", 8000))
       
   746     if not use_ipv6:
       
   747         use_ipv6 = u.configbool("web", "ipv6")
       
   748 
       
   749     accesslog = openlog(accesslog or u.config("web", "accesslog", "-"),
       
   750                         sys.stdout)
       
   751     errorlog = openlog(errorlog or u.config("web", "errorlog", "-"),
       
   752                        sys.stderr)
       
   753 
   743 
   754     import BaseHTTPServer
   744     import BaseHTTPServer
   755 
   745 
   756     class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
   746     class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
   757         address_family = getattr(socket, 'AF_INET6', None)
   747         address_family = getattr(socket, 'AF_INET6', None)
   828                 self.send_response(200, "Script output follows")
   818                 self.send_response(200, "Script output follows")
   829                 hg.run()
   819                 hg.run()
   830             finally:
   820             finally:
   831                 sys.argv, sys.stdin, sys.stdout, sys.stderr = save
   821                 sys.argv, sys.stdin, sys.stdout, sys.stderr = save
   832 
   822 
   833     hg = hgweb(path, name, templates)
   823     hg = hgweb(repo)
   834     if use_ipv6:
   824     if use_ipv6:
   835         return IPv6HTTPServer((address, port), hgwebhandler)
   825         return IPv6HTTPServer((address, port), hgwebhandler)
   836     else:
   826     else:
   837         return BaseHTTPServer.HTTPServer((address, port), hgwebhandler)
   827         return BaseHTTPServer.HTTPServer((address, port), hgwebhandler)
   838 
   828