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))