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 |