Show More
@@ -20,7 +20,8 b' class hgwebdir(object):' | |||
|
20 | 20 | return [(util.pconvert(name).strip('/'), path) |
|
21 | 21 | for name, path in items] |
|
22 | 22 | |
|
23 | self.parentui = parentui | |
|
23 | self.parentui = parentui or ui.ui(report_untrusted=False, | |
|
24 | interactive = False) | |
|
24 | 25 | self.motd = None |
|
25 | 26 | self.style = None |
|
26 | 27 | self.stripecount = None |
@@ -85,11 +86,8 b' class hgwebdir(object):' | |||
|
85 | 86 | else: |
|
86 | 87 | yield config('web', 'motd', '') |
|
87 | 88 | |
|
88 | parentui = self.parentui or ui.ui(report_untrusted=False, | |
|
89 | interactive=False) | |
|
90 | ||
|
91 | 89 | def config(section, name, default=None, untrusted=True): |
|
92 | return parentui.config(section, name, default, untrusted) | |
|
90 | return self.parentui.config(section, name, default, untrusted) | |
|
93 | 91 | |
|
94 | 92 | url = req.env.get('SCRIPT_NAME', '') |
|
95 | 93 | if not url.endswith('/'): |
@@ -114,6 +112,54 b' class hgwebdir(object):' | |||
|
114 | 112 | "url": url, |
|
115 | 113 | "staticurl": staticurl}) |
|
116 | 114 | |
|
115 | try: | |
|
116 | try: | |
|
117 | virtual = req.env.get("PATH_INFO", "").strip('/') | |
|
118 | if virtual.startswith('static/'): | |
|
119 | static = os.path.join(templater.templatepath(), 'static') | |
|
120 | fname = virtual[7:] | |
|
121 | req.write(staticfile(static, fname, req)) | |
|
122 | elif virtual: | |
|
123 | repos = dict(self.repos) | |
|
124 | while virtual: | |
|
125 | real = repos.get(virtual) | |
|
126 | if real: | |
|
127 | req.env['REPO_NAME'] = virtual | |
|
128 | try: | |
|
129 | repo = hg.repository(self.parentui, real) | |
|
130 | hgweb(repo).run_wsgi(req) | |
|
131 | return | |
|
132 | except IOError, inst: | |
|
133 | raise ErrorResponse(500, inst.strerror) | |
|
134 | except hg.RepoError, inst: | |
|
135 | raise ErrorResponse(500, str(inst)) | |
|
136 | ||
|
137 | # browse subdirectories | |
|
138 | subdir = virtual + '/' | |
|
139 | if [r for r in repos if r.startswith(subdir)]: | |
|
140 | self.makeindex(req, tmpl, subdir) | |
|
141 | return | |
|
142 | ||
|
143 | up = virtual.rfind('/') | |
|
144 | if up < 0: | |
|
145 | break | |
|
146 | virtual = virtual[:up] | |
|
147 | ||
|
148 | req.respond(404, tmpl("notfound", repo=virtual)) | |
|
149 | else: | |
|
150 | if req.form.has_key('static'): | |
|
151 | static = os.path.join(templater.templatepath(), "static") | |
|
152 | fname = req.form['static'][0] | |
|
153 | req.write(staticfile(static, fname, req)) | |
|
154 | else: | |
|
155 | self.makeindex(req, tmpl) | |
|
156 | except ErrorResponse, err: | |
|
157 | req.respond(err.code, tmpl('error', error=err.message or '')) | |
|
158 | finally: | |
|
159 | tmpl = None | |
|
160 | ||
|
161 | def makeindex(self, req, tmpl, subdir=""): | |
|
162 | ||
|
117 | 163 | def archivelist(ui, nodeid, url): |
|
118 | 164 | allowed = ui.configlist("web", "allow_archive", untrusted=True) |
|
119 | 165 | for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]: |
@@ -142,7 +188,7 b' class hgwebdir(object):' | |||
|
142 | 188 | continue |
|
143 | 189 | name = name[len(subdir):] |
|
144 | 190 | |
|
145 | u = ui.ui(parentui=parentui) | |
|
191 | u = ui.ui(parentui=self.parentui) | |
|
146 | 192 | try: |
|
147 | 193 | u.readconfig(os.path.join(path, '.hg', 'hgrc')) |
|
148 | 194 | except Exception, e: |
@@ -196,67 +242,20 b' class hgwebdir(object):' | |||
|
196 | 242 | row['parity'] = parity.next() |
|
197 | 243 | yield row |
|
198 | 244 | |
|
199 | def makeindex(req, subdir=""): | |
|
200 | sortable = ["name", "description", "contact", "lastchange"] | |
|
201 | sortcolumn, descending = self.repos_sorted | |
|
202 |
|
|
|
203 | sortcolumn = req.form['sort'][0] | |
|
204 | descending = sortcolumn.startswith('-') | |
|
205 | if descending: | |
|
206 |
|
|
|
207 |
|
|
|
208 | sortcolumn = "" | |
|
209 | ||
|
210 | sort = [("sort_%s" % column, | |
|
211 | "%s%s" % ((not descending and column == sortcolumn) | |
|
212 | and "-" or "", column)) | |
|
213 | for column in sortable] | |
|
214 | req.write(tmpl("index", entries=entries, subdir=subdir, | |
|
215 | sortcolumn=sortcolumn, descending=descending, | |
|
216 | **dict(sort))) | |
|
245 | sortable = ["name", "description", "contact", "lastchange"] | |
|
246 | sortcolumn, descending = self.repos_sorted | |
|
247 | if req.form.has_key('sort'): | |
|
248 | sortcolumn = req.form['sort'][0] | |
|
249 | descending = sortcolumn.startswith('-') | |
|
250 | if descending: | |
|
251 | sortcolumn = sortcolumn[1:] | |
|
252 | if sortcolumn not in sortable: | |
|
253 | sortcolumn = "" | |
|
217 | 254 | |
|
218 | try: | |
|
219 | try: | |
|
220 | virtual = req.env.get("PATH_INFO", "").strip('/') | |
|
221 | if virtual.startswith('static/'): | |
|
222 | static = os.path.join(templater.templatepath(), 'static') | |
|
223 | fname = virtual[7:] | |
|
224 | req.write(staticfile(static, fname, req)) | |
|
225 | elif virtual: | |
|
226 | repos = dict(self.repos) | |
|
227 | while virtual: | |
|
228 | real = repos.get(virtual) | |
|
229 | if real: | |
|
230 | req.env['REPO_NAME'] = virtual | |
|
231 | try: | |
|
232 | repo = hg.repository(parentui, real) | |
|
233 | hgweb(repo).run_wsgi(req) | |
|
234 | return | |
|
235 | except IOError, inst: | |
|
236 | raise ErrorResponse(500, inst.strerror) | |
|
237 | except hg.RepoError, inst: | |
|
238 | raise ErrorResponse(500, str(inst)) | |
|
239 | ||
|
240 | # browse subdirectories | |
|
241 | subdir = virtual + '/' | |
|
242 | if [r for r in repos if r.startswith(subdir)]: | |
|
243 | makeindex(req, subdir) | |
|
244 | return | |
|
245 | ||
|
246 | up = virtual.rfind('/') | |
|
247 | if up < 0: | |
|
248 | break | |
|
249 | virtual = virtual[:up] | |
|
250 | ||
|
251 | req.respond(404, tmpl("notfound", repo=virtual)) | |
|
252 | else: | |
|
253 | if req.form.has_key('static'): | |
|
254 | static = os.path.join(templater.templatepath(), "static") | |
|
255 | fname = req.form['static'][0] | |
|
256 | req.write(staticfile(static, fname, req)) | |
|
257 | else: | |
|
258 | makeindex(req) | |
|
259 | except ErrorResponse, err: | |
|
260 | req.respond(err.code, tmpl('error', error=err.message or '')) | |
|
261 | finally: | |
|
262 | tmpl = None | |
|
255 | sort = [("sort_%s" % column, | |
|
256 | "%s%s" % ((not descending and column == sortcolumn) | |
|
257 | and "-" or "", column)) | |
|
258 | for column in sortable] | |
|
259 | req.write(tmpl("index", entries=entries, subdir=subdir, | |
|
260 | sortcolumn=sortcolumn, descending=descending, | |
|
261 | **dict(sort))) |
@@ -27,7 +27,7 b' b=$root/b' | |||
|
27 | 27 | EOF |
|
28 | 28 | |
|
29 | 29 | hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \ |
|
30 | -A access-paths.log -E error-paths.log | |
|
30 | -A access-paths.log -E error-paths-1.log | |
|
31 | 31 | cat hg.pid >> $DAEMON_PIDS |
|
32 | 32 | |
|
33 | 33 | echo % should give a 404 - file does not exist |
@@ -48,7 +48,7 b' b=$root/b' | |||
|
48 | 48 | EOF |
|
49 | 49 | |
|
50 | 50 | hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \ |
|
51 | -A access-paths.log -E error-paths.log | |
|
51 | -A access-paths.log -E error-paths-2.log | |
|
52 | 52 | cat hg.pid >> $DAEMON_PIDS |
|
53 | 53 | |
|
54 | 54 | echo % should succeed, slashy names |
@@ -75,3 +75,10 b' echo % should succeed' | |||
|
75 | 75 | "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/file/tip/a?style=raw' |
|
76 | 76 | "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/b/file/tip/b?style=raw' |
|
77 | 77 | "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/c/file/tip/c?style=raw' |
|
78 | ||
|
79 | echo % paths errors 1 | |
|
80 | cat error-paths-1.log | |
|
81 | echo % paths errors 2 | |
|
82 | cat error-paths-2.log | |
|
83 | echo % collections errors | |
|
84 | cat error-collections.log |
General Comments 0
You need to be logged in to leave comments.
Login now