Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/hgweb.py @ 1584:b3e94785ab69
merge with crew
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Sun, 11 Dec 2005 15:38:42 -0800 |
parents | 59b3639df0a9 |
children | 385b8872b8e3 |
comparison
equal
deleted
inserted
replaced
1583:32a4e6802864 | 1584:b3e94785ab69 |
---|---|
69 if os.path.exists(os.path.join(cl_path)): | 69 if os.path.exists(os.path.join(cl_path)): |
70 return os.stat(cl_path).st_mtime | 70 return os.stat(cl_path).st_mtime |
71 else: | 71 else: |
72 return os.stat(hg_path).st_mtime | 72 return os.stat(hg_path).st_mtime |
73 | 73 |
74 class hgrequest: | 74 class hgrequest(object): |
75 def __init__(self, inp=None, out=None, env=None): | 75 def __init__(self, inp=None, out=None, env=None): |
76 self.inp = inp or sys.stdin | 76 self.inp = inp or sys.stdin |
77 self.out = out or sys.stdout | 77 self.out = out or sys.stdout |
78 self.env = env or os.environ | 78 self.env = env or os.environ |
79 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) | 79 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) |
102 headers.append(('Content-disposition', 'attachment; filename=%s' % file)) | 102 headers.append(('Content-disposition', 'attachment; filename=%s' % file)) |
103 if size > 0: | 103 if size > 0: |
104 headers.append(('Content-length', str(size))) | 104 headers.append(('Content-length', str(size))) |
105 self.header(headers) | 105 self.header(headers) |
106 | 106 |
107 class templater: | 107 class templater(object): |
108 def __init__(self, mapfile, filters={}, defaults={}): | 108 def __init__(self, mapfile, filters={}, defaults={}): |
109 self.cache = {} | 109 self.cache = {} |
110 self.map = {} | 110 self.map = {} |
111 self.base = os.path.dirname(mapfile) | 111 self.base = os.path.dirname(mapfile) |
112 self.filters = filters | 112 self.filters = filters |
163 return | 163 return |
164 | 164 |
165 common_filters = { | 165 common_filters = { |
166 "escape": cgi.escape, | 166 "escape": cgi.escape, |
167 "strip": lambda x: x.strip(), | 167 "strip": lambda x: x.strip(), |
168 "rstrip": lambda x: x.rstrip(), | |
169 "age": age, | 168 "age": age, |
170 "date": lambda x: util.datestr(x), | 169 "date": lambda x: util.datestr(x), |
171 "addbreaks": nl2br, | 170 "addbreaks": nl2br, |
172 "obfuscate": obfuscate, | 171 "obfuscate": obfuscate, |
173 "short": (lambda x: x[:12]), | 172 "short": (lambda x: x[:12]), |
174 "firstline": (lambda x: x.splitlines(1)[0]), | 173 "firstline": (lambda x: x.splitlines(1)[0]), |
175 "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"), | 174 "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"), |
176 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"), | 175 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"), |
177 } | 176 } |
178 | 177 |
179 class hgweb: | 178 class hgweb(object): |
180 def __init__(self, repo, name=None): | 179 def __init__(self, repo, name=None): |
181 if type(repo) == type(""): | 180 if type(repo) == type(""): |
182 self.repo = hg.repository(ui.ui(), repo) | 181 self.repo = hg.repository(ui.ui(), repo) |
183 else: | 182 else: |
184 self.repo = repo | 183 self.repo = repo |
950 if use_ipv6: | 949 if use_ipv6: |
951 return IPv6HTTPServer((address, port), hgwebhandler) | 950 return IPv6HTTPServer((address, port), hgwebhandler) |
952 else: | 951 else: |
953 return BaseHTTPServer.HTTPServer((address, port), hgwebhandler) | 952 return BaseHTTPServer.HTTPServer((address, port), hgwebhandler) |
954 | 953 |
955 def server(path, name, templates, address, port, use_ipv6=False, | |
956 accesslog=sys.stdout, errorlog=sys.stderr): | |
957 httpd = create_server(path, name, templates, address, port, use_ipv6, | |
958 accesslog, errorlog) | |
959 httpd.serve_forever() | |
960 | |
961 # This is a stopgap | 954 # This is a stopgap |
962 class hgwebdir: | 955 class hgwebdir(object): |
963 def __init__(self, config): | 956 def __init__(self, config): |
964 def cleannames(items): | 957 def cleannames(items): |
965 return [(name.strip('/'), path) for name, path in items] | 958 return [(name.strip('/'), path) for name, path in items] |
966 | 959 |
967 if type(config) == type([]): | 960 if type(config) == type([]): |
998 | 991 |
999 url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name]) | 992 url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name]) |
1000 .replace("//", "/")) | 993 .replace("//", "/")) |
1001 | 994 |
1002 # update time with local timezone | 995 # update time with local timezone |
1003 d = (get_mtime(path), util.makedate()[1]) | 996 try: |
997 d = (get_mtime(path), util.makedate()[1]) | |
998 except OSError: | |
999 continue | |
1004 | 1000 |
1005 yield dict(contact=(get("ui", "username") or # preferred | 1001 yield dict(contact=(get("ui", "username") or # preferred |
1006 get("web", "contact") or # deprecated | 1002 get("web", "contact") or # deprecated |
1007 get("web", "author", "unknown")), # also | 1003 get("web", "author", "unknown")), # also |
1008 name=get("web", "name", name), | 1004 name=get("web", "name", name), |
1015 | 1011 |
1016 virtual = req.env.get("PATH_INFO", "").strip('/') | 1012 virtual = req.env.get("PATH_INFO", "").strip('/') |
1017 if virtual: | 1013 if virtual: |
1018 real = dict(self.repos).get(virtual) | 1014 real = dict(self.repos).get(virtual) |
1019 if real: | 1015 if real: |
1020 hgweb(real).run(req) | 1016 try: |
1017 hgweb(real).run(req) | |
1018 except IOError, inst: | |
1019 req.write(tmpl("error", error=inst.strerror)) | |
1020 except hg.RepoError, inst: | |
1021 req.write(tmpl("error", error=str(inst))) | |
1021 else: | 1022 else: |
1022 req.write(tmpl("notfound", repo=virtual)) | 1023 req.write(tmpl("notfound", repo=virtual)) |
1023 else: | 1024 else: |
1024 req.write(tmpl("index", entries=entries)) | 1025 req.write(tmpl("index", entries=entries)) |