comparison mercurial/hgweb.py @ 987:bfe12654764d

hgweb: change startup argument processing - allow passing a repo object instead of a path (if we get a string, we construct a repo object) - hg serve: pass options via repo.ui.setconfig - add --style option - get default name from repo.root rather than getcwd() - remove template argument to hgweb() - reduce create_server from 8 args to 1
author mpm@selenic.com
date Sun, 21 Aug 2005 15:56:14 -0700
parents 2810c625ca98
children 31dcaf9123ba
comparison
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