68 req = wsgirequest(env, respond) |
68 req = wsgirequest(env, respond) |
69 self.run_wsgi(req) |
69 self.run_wsgi(req) |
70 return req |
70 return req |
71 |
71 |
72 def run_wsgi(self, req): |
72 def run_wsgi(self, req): |
73 def header(**map): |
|
74 header_file = cStringIO.StringIO( |
|
75 ''.join(tmpl("header", encoding=util._encoding, **map))) |
|
76 msg = mimetools.Message(header_file, 0) |
|
77 req.header(msg.items()) |
|
78 yield header_file.read() |
|
79 |
|
80 def footer(**map): |
|
81 yield tmpl("footer", **map) |
|
82 |
|
83 def motd(**map): |
|
84 if self.motd is not None: |
|
85 yield self.motd |
|
86 else: |
|
87 yield config('web', 'motd', '') |
|
88 |
|
89 def config(section, name, default=None, untrusted=True): |
|
90 return self.parentui.config(section, name, default, untrusted) |
|
91 |
|
92 url = req.env.get('SCRIPT_NAME', '') |
|
93 if not url.endswith('/'): |
|
94 url += '/' |
|
95 |
|
96 staticurl = config('web', 'staticurl') or url + 'static/' |
|
97 if not staticurl.endswith('/'): |
|
98 staticurl += '/' |
|
99 |
|
100 style = self.style |
|
101 if style is None: |
|
102 style = config('web', 'style', '') |
|
103 if req.form.has_key('style'): |
|
104 style = req.form['style'][0] |
|
105 if self.stripecount is None: |
|
106 self.stripecount = int(config('web', 'stripes', 1)) |
|
107 mapfile = style_map(templater.templatepath(), style) |
|
108 tmpl = templater.templater(mapfile, templater.common_filters, |
|
109 defaults={"header": header, |
|
110 "footer": footer, |
|
111 "motd": motd, |
|
112 "url": url, |
|
113 "staticurl": staticurl}) |
|
114 |
73 |
115 try: |
74 try: |
116 try: |
75 try: |
117 virtual = req.env.get("PATH_INFO", "").strip('/') |
76 virtual = req.env.get("PATH_INFO", "").strip('/') |
118 if virtual.startswith('static/'): |
77 if virtual.startswith('static/'): |
135 raise ErrorResponse(500, str(inst)) |
94 raise ErrorResponse(500, str(inst)) |
136 |
95 |
137 # browse subdirectories |
96 # browse subdirectories |
138 subdir = virtual + '/' |
97 subdir = virtual + '/' |
139 if [r for r in repos if r.startswith(subdir)]: |
98 if [r for r in repos if r.startswith(subdir)]: |
|
99 tmpl = self.templater(req) |
140 self.makeindex(req, tmpl, subdir) |
100 self.makeindex(req, tmpl, subdir) |
141 return |
101 return |
142 |
102 |
143 up = virtual.rfind('/') |
103 up = virtual.rfind('/') |
144 if up < 0: |
104 if up < 0: |
145 break |
105 break |
146 virtual = virtual[:up] |
106 virtual = virtual[:up] |
147 |
107 |
|
108 tmpl = self.templater(req) |
148 req.respond(404, tmpl("notfound", repo=virtual)) |
109 req.respond(404, tmpl("notfound", repo=virtual)) |
149 else: |
110 else: |
150 if req.form.has_key('static'): |
111 if req.form.has_key('static'): |
151 static = os.path.join(templater.templatepath(), "static") |
112 static = os.path.join(templater.templatepath(), "static") |
152 fname = req.form['static'][0] |
113 fname = req.form['static'][0] |
153 req.write(staticfile(static, fname, req)) |
114 req.write(staticfile(static, fname, req)) |
154 else: |
115 else: |
|
116 tmpl = self.templater(req) |
155 self.makeindex(req, tmpl) |
117 self.makeindex(req, tmpl) |
156 except ErrorResponse, err: |
118 except ErrorResponse, err: |
157 req.respond(err.code, tmpl('error', error=err.message or '')) |
119 req.respond(err.code, tmpl('error', error=err.message or '')) |
158 finally: |
120 finally: |
159 tmpl = None |
121 tmpl = None |
257 and "-" or "", column)) |
219 and "-" or "", column)) |
258 for column in sortable] |
220 for column in sortable] |
259 req.write(tmpl("index", entries=entries, subdir=subdir, |
221 req.write(tmpl("index", entries=entries, subdir=subdir, |
260 sortcolumn=sortcolumn, descending=descending, |
222 sortcolumn=sortcolumn, descending=descending, |
261 **dict(sort))) |
223 **dict(sort))) |
|
224 |
|
225 def templater(self, req): |
|
226 |
|
227 def header(**map): |
|
228 header_file = cStringIO.StringIO( |
|
229 ''.join(tmpl("header", encoding=util._encoding, **map))) |
|
230 msg = mimetools.Message(header_file, 0) |
|
231 req.header(msg.items()) |
|
232 yield header_file.read() |
|
233 |
|
234 def footer(**map): |
|
235 yield tmpl("footer", **map) |
|
236 |
|
237 def motd(**map): |
|
238 if self.motd is not None: |
|
239 yield self.motd |
|
240 else: |
|
241 yield config('web', 'motd', '') |
|
242 |
|
243 def config(section, name, default=None, untrusted=True): |
|
244 return self.parentui.config(section, name, default, untrusted) |
|
245 |
|
246 url = req.env.get('SCRIPT_NAME', '') |
|
247 if not url.endswith('/'): |
|
248 url += '/' |
|
249 |
|
250 staticurl = config('web', 'staticurl') or url + 'static/' |
|
251 if not staticurl.endswith('/'): |
|
252 staticurl += '/' |
|
253 |
|
254 style = self.style |
|
255 if style is None: |
|
256 style = config('web', 'style', '') |
|
257 if req.form.has_key('style'): |
|
258 style = req.form['style'][0] |
|
259 if self.stripecount is None: |
|
260 self.stripecount = int(config('web', 'stripes', 1)) |
|
261 mapfile = style_map(templater.templatepath(), style) |
|
262 tmpl = templater.templater(mapfile, templater.common_filters, |
|
263 defaults={"header": header, |
|
264 "footer": footer, |
|
265 "motd": motd, |
|
266 "url": url, |
|
267 "staticurl": staticurl}) |
|
268 return tmpl |