Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/hgweb/hgwebdir_mod.py @ 36906:219b23359f4c
hgweb: support constructing URLs from an alternate base URL
The web.baseurl config option allows server operators to define a
custom URL for hosted content.
The way it works today is that hgwebdir parses this config
option into URL components then updates the appropriate
WSGI environment variables so the request "lies" about its
details. For example, SERVER_NAME is updated to reflect the
alternate base URL's hostname.
The WSGI environment should not be modified because WSGI
applications may want to know the original request details (for
debugging, etc).
This commit teaches our request parser about the existence of
an alternate base URL. If defined, the advertised URL and other
self-reflected paths will take the alternate base URL into account.
The hgweb WSGI application didn't use web.baseurl. But hgwebdir
did. We update hgwebdir to alter the environment parsing
accordingly. The old code around environment manipulation
has been removed.
With this change, parserequestfromenv() has grown to a bit
unwieldy. Now that practically everyone is using it, it is
obvious that there is some unused features that can be trimmed.
So look for this in follow-up commits.
Differential Revision: https://phab.mercurial-scm.org/D2822
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sun, 11 Mar 2018 15:33:56 -0700 |
parents | d7fd203e36cc |
children | 006165d4d7e2 |
rev | line source |
---|---|
2391
d351a3be3371
Fixing up comment headers for split up code.
Eric Hopper <hopper@omnifarious.org>
parents:
2360
diff
changeset
|
1 # hgweb/hgwebdir_mod.py - Web interface for a directory of repositories. |
131 | 2 # |
238
3b92f8fe47ae
hgweb.py: kill #! line, clean up copyright notice
mpm@selenic.com
parents:
222
diff
changeset
|
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> |
2859 | 4 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> |
131 | 5 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8216
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
131 | 8 |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
9 from __future__ import absolute_import |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
10 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
11 import os |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
12 import re |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
13 import time |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
14 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
15 from ..i18n import _ |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
16 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
17 from .common import ( |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
18 ErrorResponse, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
19 HTTP_NOT_FOUND, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
20 HTTP_OK, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
21 HTTP_SERVER_ERROR, |
30766
d7bf7d2bd5ab
hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30749
diff
changeset
|
22 cspvalues, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
23 get_contact, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
24 get_mtime, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
25 ismember, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
26 paritygen, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
27 staticfile, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
28 ) |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
29 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
30 from .. import ( |
34251
fe5202bef5ce
configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents:
34250
diff
changeset
|
31 configitems, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
32 encoding, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
33 error, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
34 hg, |
29798
80df04266a16
hgweb: profile HTTP requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29797
diff
changeset
|
35 profiling, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
36 scmutil, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
37 templater, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
38 ui as uimod, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
39 util, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
40 ) |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
41 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
42 from . import ( |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
43 hgweb_mod, |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
44 request as requestmod, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
45 webutil, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
46 wsgicgi, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27045
diff
changeset
|
47 ) |
36636
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
34703
diff
changeset
|
48 from ..utils import dateutil |
138 | 49 |
8215
227707c90548
hgweb: some cleanups in hgwebdir, remove double defaults
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8209
diff
changeset
|
50 def cleannames(items): |
227707c90548
hgweb: some cleanups in hgwebdir, remove double defaults
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8209
diff
changeset
|
51 return [(util.pconvert(name).strip('/'), path) for name, path in items] |
1181
4f5001f5b4c3
Make sure the repository names don't have slashes at the at or else in some
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1180
diff
changeset
|
52 |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
53 def findrepos(paths): |
9723
a235644a0b93
hgweb: use a tuple-list instead of dictionary for append-only store
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9363
diff
changeset
|
54 repos = [] |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
55 for prefix, root in cleannames(paths): |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
56 roothead, roottail = os.path.split(root) |
17104
5a9acb0b2086
help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents:
16754
diff
changeset
|
57 # "foo = /bar/*" or "foo = /bar/**" lets every repo /bar/N in or below |
5a9acb0b2086
help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents:
16754
diff
changeset
|
58 # /bar/ be served as as foo/N . |
5a9acb0b2086
help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents:
16754
diff
changeset
|
59 # '*' will not search inside dirs with .hg (except .hg/patches), |
5a9acb0b2086
help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents:
16754
diff
changeset
|
60 # '**' will search inside dirs with .hg (and thus also find subrepos). |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
61 try: |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
62 recurse = {'*': False, '**': True}[roottail] |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
63 except KeyError: |
9723
a235644a0b93
hgweb: use a tuple-list instead of dictionary for append-only store
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9363
diff
changeset
|
64 repos.append((prefix, root)) |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
65 continue |
11677
8f8a7976f4bc
hgwebdir: allow pure relative globs in paths
Mads Kiilerich <mads@kiilerich.com>
parents:
11649
diff
changeset
|
66 roothead = os.path.normpath(os.path.abspath(roothead)) |
13975
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13964
diff
changeset
|
67 paths = scmutil.walkrepos(roothead, followsym=True, recurse=recurse) |
13402
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
68 repos.extend(urlrepos(prefix, roothead, paths)) |
9723
a235644a0b93
hgweb: use a tuple-list instead of dictionary for append-only store
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9363
diff
changeset
|
69 return repos |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
70 |
13402
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
71 def urlrepos(prefix, roothead, paths): |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
72 """yield url paths and filesystem paths from a list of repo paths |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
73 |
13538
d24e97fd52a9
test-doctest: handle unix/windows path discrepancies
Patrick Mezard <pmezard@gmail.com>
parents:
13436
diff
changeset
|
74 >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq] |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34040
diff
changeset
|
75 >>> conv(urlrepos(b'hg', b'/opt', [b'/opt/r', b'/opt/r/r', b'/opt'])) |
13403
8ed91088acbb
hgweb: make paths wildcards expanding in a repo root match repo correctly
Mads Kiilerich <mads@kiilerich.com>
parents:
13402
diff
changeset
|
76 [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')] |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34040
diff
changeset
|
77 >>> conv(urlrepos(b'', b'/opt', [b'/opt/r', b'/opt/r/r', b'/opt'])) |
13402
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
78 [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')] |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
79 """ |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
80 for path in paths: |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
81 path = os.path.normpath(path) |
13403
8ed91088acbb
hgweb: make paths wildcards expanding in a repo root match repo correctly
Mads Kiilerich <mads@kiilerich.com>
parents:
13402
diff
changeset
|
82 yield (prefix + '/' + |
8ed91088acbb
hgweb: make paths wildcards expanding in a repo root match repo correctly
Mads Kiilerich <mads@kiilerich.com>
parents:
13402
diff
changeset
|
83 util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'), path |
13402
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
84 |
36896
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
85 def readallowed(ui, req): |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
86 """Check allow_read and deny_read config options of a repo's ui object |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
87 to determine user permissions. By default, with neither option set (or |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
88 both empty), allow all users to read the repo. There are two ways a |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
89 user can be denied read access: (1) deny_read is not empty, and the |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
90 user is unauthenticated or deny_read contains user (or *), and (2) |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
91 allow_read is not empty and the user is not in allow_read. Return True |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
92 if user is allowed to read the repo, else return False.""" |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
93 |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
94 user = req.remoteuser |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
95 |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
96 deny_read = ui.configlist('web', 'deny_read', untrusted=True) |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
97 if deny_read and (not user or ismember(ui, user, deny_read)): |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
98 return False |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
99 |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
100 allow_read = ui.configlist('web', 'allow_read', untrusted=True) |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
101 # by default, allow reading if no allow_read option has been set |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
102 if not allow_read or ismember(ui, user, allow_read): |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
103 return True |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
104 |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
105 return False |
f8d6d9b29b39
hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36895
diff
changeset
|
106 |
36897
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
107 def archivelist(ui, nodeid, url): |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
108 allowed = ui.configlist('web', 'allow_archive', untrusted=True) |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
109 archives = [] |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
110 |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
111 for typ, spec in hgweb_mod.archivespecs.iteritems(): |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
112 if typ in allowed or ui.configbool('web', 'allow' + typ, |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
113 untrusted=True): |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
114 archives.append({ |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
115 'type': typ, |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
116 'extension': spec[2], |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
117 'node': nodeid, |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
118 'url': url, |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
119 }) |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
120 |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
121 return archives |
04af43e0a997
hgweb: move archivelist to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36896
diff
changeset
|
122 |
36900
ee395147bb28
hgweb: remove unused **map argument
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36899
diff
changeset
|
123 def rawindexentries(ui, repos, wsgireq, req, subdir=''): |
36898
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
124 descend = ui.configbool('web', 'descend') |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
125 collapse = ui.configbool('web', 'collapse') |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
126 seenrepos = set() |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
127 seendirs = set() |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
128 for name, path in repos: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
129 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
130 if not name.startswith(subdir): |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
131 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
132 name = name[len(subdir):] |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
133 directory = False |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
134 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
135 if '/' in name: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
136 if not descend: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
137 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
138 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
139 nameparts = name.split('/') |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
140 rootname = nameparts[0] |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
141 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
142 if not collapse: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
143 pass |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
144 elif rootname in seendirs: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
145 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
146 elif rootname in seenrepos: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
147 pass |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
148 else: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
149 directory = True |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
150 name = rootname |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
151 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
152 # redefine the path to refer to the directory |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
153 discarded = '/'.join(nameparts[1:]) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
154 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
155 # remove name parts plus accompanying slash |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
156 path = path[:-len(discarded) - 1] |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
157 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
158 try: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
159 r = hg.repository(ui, path) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
160 directory = False |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
161 except (IOError, error.RepoError): |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
162 pass |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
163 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
164 parts = [name] |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
165 parts.insert(0, '/' + subdir.rstrip('/')) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
166 if wsgireq.env['SCRIPT_NAME']: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
167 parts.insert(0, wsgireq.env['SCRIPT_NAME']) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
168 url = re.sub(r'/+', '/', '/'.join(parts) + '/') |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
169 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
170 # show either a directory entry or a repository |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
171 if directory: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
172 # get the directory's time information |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
173 try: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
174 d = (get_mtime(path), dateutil.makedate()[1]) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
175 except OSError: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
176 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
177 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
178 # add '/' to the name to make it obvious that |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
179 # the entry is a directory, not a regular repository |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
180 row = {'contact': "", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
181 'contact_sort': "", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
182 'name': name + '/', |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
183 'name_sort': name, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
184 'url': url, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
185 'description': "", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
186 'description_sort': "", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
187 'lastchange': d, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
188 'lastchange_sort': d[1] - d[0], |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
189 'archives': [], |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
190 'isdirectory': True, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
191 'labels': [], |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
192 } |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
193 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
194 seendirs.add(name) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
195 yield row |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
196 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
197 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
198 u = ui.copy() |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
199 try: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
200 u.readconfig(os.path.join(path, '.hg', 'hgrc')) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
201 except Exception as e: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
202 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
203 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
204 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
205 def get(section, name, default=uimod._unset): |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
206 return u.config(section, name, default, untrusted=True) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
207 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
208 if u.configbool("web", "hidden", untrusted=True): |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
209 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
210 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
211 if not readallowed(u, req): |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
212 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
213 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
214 # update time with local timezone |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
215 try: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
216 r = hg.repository(ui, path) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
217 except IOError: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
218 u.warn(_('error accessing repository at %s\n') % path) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
219 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
220 except error.RepoError: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
221 u.warn(_('error accessing repository at %s\n') % path) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
222 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
223 try: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
224 d = (get_mtime(r.spath), dateutil.makedate()[1]) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
225 except OSError: |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
226 continue |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
227 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
228 contact = get_contact(get) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
229 description = get("web", "description") |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
230 seenrepos.add(name) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
231 name = get("web", "name", name) |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
232 row = {'contact': contact or "unknown", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
233 'contact_sort': contact.upper() or "unknown", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
234 'name': name, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
235 'name_sort': name, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
236 'url': url, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
237 'description': description or "unknown", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
238 'description_sort': description.upper() or "unknown", |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
239 'lastchange': d, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
240 'lastchange_sort': d[1] - d[0], |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
241 'archives': archivelist(u, "tip", url), |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
242 'isdirectory': None, |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
243 'labels': u.configlist('web', 'labels', untrusted=True), |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
244 } |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
245 |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
246 yield row |
f370f1b4f12c
hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36897
diff
changeset
|
247 |
36899
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
248 def indexentries(ui, repos, wsgireq, req, stripecount, sortcolumn='', |
36900
ee395147bb28
hgweb: remove unused **map argument
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36899
diff
changeset
|
249 descending=False, subdir=''): |
36899
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
250 |
36900
ee395147bb28
hgweb: remove unused **map argument
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36899
diff
changeset
|
251 rows = rawindexentries(ui, repos, wsgireq, req, subdir=subdir) |
36899
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
252 |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
253 sortdefault = None, False |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
254 |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
255 if sortcolumn and sortdefault != (sortcolumn, descending): |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
256 sortkey = '%s_sort' % sortcolumn |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
257 rows = sorted(rows, key=lambda x: x[sortkey], |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
258 reverse=descending) |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
259 |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
260 for row, parity in zip(rows, paritygen(stripecount)): |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
261 row['parity'] = parity |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
262 yield row |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
263 |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1554
diff
changeset
|
264 class hgwebdir(object): |
26132
9df8c729e2e7
hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26072
diff
changeset
|
265 """HTTP server for multiple repositories. |
9df8c729e2e7
hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26072
diff
changeset
|
266 |
9df8c729e2e7
hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26072
diff
changeset
|
267 Given a configuration, different repositories will be served depending |
9df8c729e2e7
hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26072
diff
changeset
|
268 on the request path. |
9df8c729e2e7
hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26072
diff
changeset
|
269 |
9df8c729e2e7
hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26072
diff
changeset
|
270 Instances are typically used as WSGI applications. |
9df8c729e2e7
hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26072
diff
changeset
|
271 """ |
8191
35604226d712
hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
272 def __init__(self, conf, baseui=None): |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
273 self.conf = conf |
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
274 self.baseui = baseui |
26072
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
275 self.ui = None |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
276 self.lastrefresh = 0 |
9903
5d748045c2ae
Do not overwrite motd attribute of hgwebdir instances on refresh.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
9842
diff
changeset
|
277 self.motd = None |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
278 self.refresh() |
1181
4f5001f5b4c3
Make sure the repository names don't have slashes at the at or else in some
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1180
diff
changeset
|
279 |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
280 def refresh(self): |
26072
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
281 if self.ui: |
34251
fe5202bef5ce
configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents:
34250
diff
changeset
|
282 refreshinterval = self.ui.configint('web', 'refreshinterval') |
fe5202bef5ce
configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents:
34250
diff
changeset
|
283 else: |
fe5202bef5ce
configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents:
34250
diff
changeset
|
284 item = configitems.coreitems['web']['refreshinterval'] |
fe5202bef5ce
configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents:
34250
diff
changeset
|
285 refreshinterval = item.default |
26072
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
286 |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
287 # refreshinterval <= 0 means to always refresh. |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
288 if (refreshinterval > 0 and |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
289 self.lastrefresh + refreshinterval > time.time()): |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
290 return |
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
291 |
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
292 if self.baseui: |
11239
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
293 u = self.baseui.copy() |
1143
4fffb3d84b7c
Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1142
diff
changeset
|
294 else: |
30564
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
29798
diff
changeset
|
295 u = uimod.ui.load() |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20677
diff
changeset
|
296 u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir') |
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20677
diff
changeset
|
297 u.setconfig('ui', 'nontty', 'true', 'hgwebdir') |
25488
89ce95f907bd
hgewb: disable progress when serving (issue4582)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25427
diff
changeset
|
298 # displaying bundling progress bar while serving feels wrong and may |
89ce95f907bd
hgewb: disable progress when serving (issue4582)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25427
diff
changeset
|
299 # break some wsgi implementations. |
89ce95f907bd
hgewb: disable progress when serving (issue4582)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25427
diff
changeset
|
300 u.setconfig('progress', 'disable', 'true', 'hgweb') |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
7966
diff
changeset
|
301 |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
302 if not isinstance(self.conf, (dict, list, tuple)): |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
303 map = {'paths': 'hgweb-paths'} |
13214
5bcb6c9d16db
hgweb: abort if config file isn't found
Matt Mackall <mpm@selenic.com>
parents:
13066
diff
changeset
|
304 if not os.path.exists(self.conf): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
305 raise error.Abort(_('config file %s not found!') % self.conf) |
11239
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
306 u.readconfig(self.conf, remap=map, trust=True) |
13667
8cbb59124e67
hgweb: support multiple directories for the same path
timeless <timeless@gmail.com>
parents:
13538
diff
changeset
|
307 paths = [] |
8cbb59124e67
hgweb: support multiple directories for the same path
timeless <timeless@gmail.com>
parents:
13538
diff
changeset
|
308 for name, ignored in u.configitems('hgweb-paths'): |
8cbb59124e67
hgweb: support multiple directories for the same path
timeless <timeless@gmail.com>
parents:
13538
diff
changeset
|
309 for path in u.configlist('hgweb-paths', name): |
8cbb59124e67
hgweb: support multiple directories for the same path
timeless <timeless@gmail.com>
parents:
13538
diff
changeset
|
310 paths.append((name, path)) |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
311 elif isinstance(self.conf, (list, tuple)): |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
312 paths = self.conf |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
313 elif isinstance(self.conf, dict): |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
314 paths = self.conf.items() |
8345
dcebff8a25dd
hgwebdir: read --webdir-conf as actual configuration to ui (issue1586)
Alexander Solovyov <piranha@piranha.org.ua>
parents:
8225
diff
changeset
|
315 |
11239
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
316 repos = findrepos(paths) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
317 for prefix, root in u.configitems('collections'): |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
318 prefix = util.pconvert(prefix) |
13975
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13964
diff
changeset
|
319 for path in scmutil.walkrepos(root, followsym=True): |
11239
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
320 repo = os.path.normpath(path) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
321 name = util.pconvert(repo) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
322 if name.startswith(prefix): |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
323 name = name[len(prefix):] |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
324 repos.append((name.lstrip('/'), repo)) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
325 |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
326 self.repos = repos |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
327 self.ui = u |
34246
344fd1fe237b
configitems: register the 'web.encoding' config
Boris Feld <boris.feld@octobus.net>
parents:
34245
diff
changeset
|
328 encoding.encoding = self.ui.config('web', 'encoding') |
34253
db63872e10cc
configitems: register the 'web.style' config
Boris Feld <boris.feld@octobus.net>
parents:
34252
diff
changeset
|
329 self.style = self.ui.config('web', 'style') |
34255
b59620c52eec
hgwebdir: read 'web.template' untrusted
Boris Feld <boris.feld@octobus.net>
parents:
34254
diff
changeset
|
330 self.templatepath = self.ui.config('web', 'templates', untrusted=False) |
34252
945c9816ec1d
configitems: register the 'web.stripes' config
Boris Feld <boris.feld@octobus.net>
parents:
34251
diff
changeset
|
331 self.stripecount = self.ui.config('web', 'stripes') |
8621
13613221caf1
hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8537
diff
changeset
|
332 if self.stripecount: |
13613221caf1
hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8537
diff
changeset
|
333 self.stripecount = int(self.stripecount) |
34250
d24816dfdcff
configitems: register the 'web.prefix' config
Boris Feld <boris.feld@octobus.net>
parents:
34246
diff
changeset
|
334 prefix = self.ui.config('web', 'prefix') |
18515
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
335 if prefix.startswith('/'): |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
336 prefix = prefix[1:] |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
337 if prefix.endswith('/'): |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
338 prefix = prefix[:-1] |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
339 self.prefix = prefix |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
340 self.lastrefresh = time.time() |
941 | 341 |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
342 def run(self): |
30641
f1c9fafcbf46
py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30564
diff
changeset
|
343 if not encoding.environ.get('GATEWAY_INTERFACE', |
f1c9fafcbf46
py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30564
diff
changeset
|
344 '').startswith("CGI/1."): |
8663
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8621
diff
changeset
|
345 raise RuntimeError("This function is only intended to be " |
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8621
diff
changeset
|
346 "called while running as a CGI script.") |
5566
d74fc8dec2b4
Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5561
diff
changeset
|
347 wsgicgi.launch(self) |
d74fc8dec2b4
Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5561
diff
changeset
|
348 |
d74fc8dec2b4
Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5561
diff
changeset
|
349 def __call__(self, env, respond): |
36906
219b23359f4c
hgweb: support constructing URLs from an alternate base URL
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36903
diff
changeset
|
350 baseurl = self.ui.config('web', 'baseurl') |
219b23359f4c
hgweb: support constructing URLs from an alternate base URL
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36903
diff
changeset
|
351 wsgireq = requestmod.wsgirequest(env, respond, altbaseurl=baseurl) |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
352 return self.run_wsgi(wsgireq) |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
353 |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
354 def run_wsgi(self, wsgireq): |
32808
eede022fc142
profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32004
diff
changeset
|
355 profile = self.ui.configbool('profiling', 'enabled') |
eede022fc142
profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32004
diff
changeset
|
356 with profiling.profile(self.ui, enabled=profile): |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
357 for r in self._runwsgi(wsgireq): |
29798
80df04266a16
hgweb: profile HTTP requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29797
diff
changeset
|
358 yield r |
29797
fc2442492606
hgweb: abstract call to hgwebdir wsgi function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29471
diff
changeset
|
359 |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
360 def _runwsgi(self, wsgireq): |
36871
3d60a22e27f5
hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36869
diff
changeset
|
361 req = wsgireq.req |
36879
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
362 res = wsgireq.res |
36871
3d60a22e27f5
hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36869
diff
changeset
|
363 |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
364 try: |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
365 self.refresh() |
5603
74f65f44a9aa
hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5602
diff
changeset
|
366 |
30766
d7bf7d2bd5ab
hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30749
diff
changeset
|
367 csp, nonce = cspvalues(self.ui) |
d7bf7d2bd5ab
hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30749
diff
changeset
|
368 if csp: |
36879
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
369 res.headers['Content-Security-Policy'] = csp |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
370 wsgireq.headers.append(('Content-Security-Policy', csp)) |
30766
d7bf7d2bd5ab
hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30749
diff
changeset
|
371 |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
372 virtual = wsgireq.env.get("PATH_INFO", "").strip('/') |
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
373 tmpl = self.templater(wsgireq, nonce) |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
374 ctype = tmpl('mimetype', encoding=encoding.encoding) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
375 ctype = templater.stringify(ctype) |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5603
diff
changeset
|
376 |
36879
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
377 # Global defaults. These can be overridden by any handler. |
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
378 res.status = '200 Script output follows' |
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
379 res.headers['Content-Type'] = ctype |
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
380 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
381 # a static file |
36871
3d60a22e27f5
hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36869
diff
changeset
|
382 if virtual.startswith('static/') or 'static' in req.qsparams: |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
383 if virtual.startswith('static/'): |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
384 fname = virtual[7:] |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
385 else: |
36871
3d60a22e27f5
hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36869
diff
changeset
|
386 fname = req.qsparams['static'] |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
387 static = self.ui.config("web", "static", None, |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
388 untrusted=False) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
389 if not static: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
390 tp = self.templatepath or templater.templatepaths() |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
391 if isinstance(tp, str): |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
392 tp = [tp] |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
393 static = [os.path.join(p, 'static') for p in tp] |
36879
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
394 |
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
395 staticfile(static, fname, res) |
98baf8dea553
hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36871
diff
changeset
|
396 return res.sendresponse() |
5603
74f65f44a9aa
hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5602
diff
changeset
|
397 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
398 # top-level index |
31489
da7d19324b1e
hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents:
30766
diff
changeset
|
399 |
da7d19324b1e
hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents:
30766
diff
changeset
|
400 repos = dict(self.repos) |
da7d19324b1e
hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents:
30766
diff
changeset
|
401 |
32004
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
402 if (not virtual or virtual == 'index') and virtual not in repos: |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
403 wsgireq.respond(HTTP_OK, ctype) |
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
404 return self.makeindex(wsgireq, tmpl) |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
405 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
406 # nested indexes and hgwebs |
6210
942287cb1f57
Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6046
diff
changeset
|
407 |
31489
da7d19324b1e
hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents:
30766
diff
changeset
|
408 if virtual.endswith('/index') and virtual not in repos: |
da7d19324b1e
hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents:
30766
diff
changeset
|
409 subdir = virtual[:-len('index')] |
da7d19324b1e
hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents:
30766
diff
changeset
|
410 if any(r.startswith(subdir) for r in repos): |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
411 wsgireq.respond(HTTP_OK, ctype) |
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
412 return self.makeindex(wsgireq, tmpl, subdir) |
31489
da7d19324b1e
hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents:
30766
diff
changeset
|
413 |
32004
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
414 def _virtualdirs(): |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
415 # Check the full virtual path, each parent, and the root ('') |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
416 if virtual != '': |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
417 yield virtual |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
418 |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
419 for p in util.finddirs(virtual): |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
420 yield p |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
421 |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
422 yield '' |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
423 |
bd3cb917761a
hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents:
31489
diff
changeset
|
424 for virtualrepo in _virtualdirs(): |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
425 real = repos.get(virtualrepo) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
426 if real: |
36903
d7fd203e36cc
hgweb: refactor repository name URL parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36901
diff
changeset
|
427 # Re-parse the WSGI environment to take into account our |
d7fd203e36cc
hgweb: refactor repository name URL parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36901
diff
changeset
|
428 # repository path component. |
36863
da4e2f87167d
hgweb: expose input stream on parsed WSGI request object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36862
diff
changeset
|
429 wsgireq.req = requestmod.parserequestfromenv( |
36906
219b23359f4c
hgweb: support constructing URLs from an alternate base URL
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36903
diff
changeset
|
430 wsgireq.env, wsgireq.req.bodyfh, reponame=virtualrepo, |
219b23359f4c
hgweb: support constructing URLs from an alternate base URL
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36903
diff
changeset
|
431 altbaseurl=self.ui.config('web', 'baseurl')) |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
432 try: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
433 # ensure caller gets private copy of ui |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
434 repo = hg.repository(self.ui.copy(), real) |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
435 return hgweb_mod.hgweb(repo).run_wsgi(wsgireq) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25488
diff
changeset
|
436 except IOError as inst: |
34040
d5b2beca16c0
python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents:
33328
diff
changeset
|
437 msg = encoding.strtolocal(inst.strerror) |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
438 raise ErrorResponse(HTTP_SERVER_ERROR, msg) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25488
diff
changeset
|
439 except error.RepoError as inst: |
34359
8cbcee0b923d
py3: remove use of str() in hgwebdir
Yuya Nishihara <yuya@tcha.org>
parents:
34264
diff
changeset
|
440 raise ErrorResponse(HTTP_SERVER_ERROR, bytes(inst)) |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
441 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
442 # browse subdirectories |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
443 subdir = virtual + '/' |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
444 if [r for r in repos if r.startswith(subdir)]: |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
445 wsgireq.respond(HTTP_OK, ctype) |
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
446 return self.makeindex(wsgireq, tmpl, subdir) |
5603
74f65f44a9aa
hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5602
diff
changeset
|
447 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
448 # prefixes not found |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
449 wsgireq.respond(HTTP_NOT_FOUND, ctype) |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
450 return tmpl("notfound", repo=virtual) |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5603
diff
changeset
|
451 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25488
diff
changeset
|
452 except ErrorResponse as err: |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
453 wsgireq.respond(err, ctype) |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
454 return tmpl('error', error=err.message or '') |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
455 finally: |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
456 tmpl = None |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
457 |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
458 def makeindex(self, wsgireq, tmpl, subdir=""): |
36895
fc4e31297ffb
hgweb: remove some use of wsgireq in hgwebdir
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36894
diff
changeset
|
459 req = wsgireq.req |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
460 |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
461 self.refresh() |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
462 sortable = ["name", "description", "contact", "lastchange"] |
36899
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
463 sortcolumn, descending = None, False |
36895
fc4e31297ffb
hgweb: remove some use of wsgireq in hgwebdir
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36894
diff
changeset
|
464 if 'sort' in req.qsparams: |
fc4e31297ffb
hgweb: remove some use of wsgireq in hgwebdir
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36894
diff
changeset
|
465 sortcolumn = req.qsparams['sort'] |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
466 descending = sortcolumn.startswith('-') |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
467 if descending: |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
468 sortcolumn = sortcolumn[1:] |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
469 if sortcolumn not in sortable: |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
470 sortcolumn = "" |
4841
9b0ebb5e0f94
hgweb: let hgwebdir browse subdirectories
Brendan Cully <brendan@kublai.com>
parents:
4709
diff
changeset
|
471 |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
472 sort = [("sort_%s" % column, |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
473 "%s%s" % ((not descending and column == sortcolumn) |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
474 and "-" or "", column)) |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
475 for column in sortable] |
5928
3340aa5a64f7
hgweb: move HTTP content types out of header templates
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5915
diff
changeset
|
476 |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
477 self.refresh() |
6221
2eb18c780287
Support web.baseurl in hgwebdir, overriding SCRIPT_NAME
Brendan Cully <brendan@kublai.com>
parents:
6217
diff
changeset
|
478 |
36899
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
479 entries = indexentries(self.ui, self.repos, wsgireq, req, |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
480 self.stripecount, sortcolumn=sortcolumn, |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
481 descending=descending, subdir=subdir) |
455918512ed2
hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36898
diff
changeset
|
482 |
5965
abe373e16fe6
hgweb: forgot to centralize the req.write() calls in hgwebdir
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5928
diff
changeset
|
483 return tmpl("index", entries=entries, subdir=subdir, |
27043
ccdc95c6841e
hgweb: do not import hgweb_mod.hgweb and .makebreadcrumb as symbol
Yuya Nishihara <yuya@tcha.org>
parents:
27007
diff
changeset
|
484 pathdef=hgweb_mod.makebreadcrumb('/' + subdir, self.prefix), |
5965
abe373e16fe6
hgweb: forgot to centralize the req.write() calls in hgwebdir
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5928
diff
changeset
|
485 sortcolumn=sortcolumn, descending=descending, |
abe373e16fe6
hgweb: forgot to centralize the req.write() calls in hgwebdir
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5928
diff
changeset
|
486 **dict(sort)) |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
487 |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
488 def templater(self, wsgireq, nonce): |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
489 |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
490 def motd(**map): |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
491 if self.motd is not None: |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
492 yield self.motd |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
493 else: |
34587
b50c036494dc
configitems: register the 'web.motd' config
Boris Feld <boris.feld@octobus.net>
parents:
34515
diff
changeset
|
494 yield config('web', 'motd') |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
495 |
34233
cf08aaaea7f0
web: use '_unset' default value for proxy config method
Boris Feld <boris.feld@octobus.net>
parents:
34146
diff
changeset
|
496 def config(section, name, default=uimod._unset, untrusted=True): |
8191
35604226d712
hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
497 return self.ui.config(section, name, default, untrusted) |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
498 |
36812
b9b968e21f78
hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36636
diff
changeset
|
499 url = wsgireq.env.get('SCRIPT_NAME', '') |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
500 if not url.endswith('/'): |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
501 url += '/' |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
502 |
8216
25266fe996b0
hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8215
diff
changeset
|
503 vars = {} |
36869
1a1972b1a1ff
hgweb: use our new request object for "style" parameter
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36863
diff
changeset
|
504 styles, (style, mapfile) = hgweb_mod.getstyle(wsgireq.req, config, |
34515
8afc25e7effc
hgweb: extract function for loading style from request context
Augie Fackler <augie@google.com>
parents:
34486
diff
changeset
|
505 self.templatepath) |
9842
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
506 if style == styles[0]: |
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
507 vars['style'] = style |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
508 |
36813
ec46415ed826
hgweb: always use "?" when writing session vars
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36812
diff
changeset
|
509 sessionvars = webutil.sessionvars(vars, r'?') |
34612
c2cb6be4212f
configitems: register the 'web.logourl' config
Boris Feld <boris.feld@octobus.net>
parents:
34611
diff
changeset
|
510 logourl = config('web', 'logourl') |
34611
c879fc7bd71f
configitems: register the 'web.logoimg' config
Boris Feld <boris.feld@octobus.net>
parents:
34587
diff
changeset
|
511 logoimg = config('web', 'logoimg') |
36901
a5c478843c82
hgweb: construct static URL like hgweb does
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36900
diff
changeset
|
512 staticurl = (config('web', 'staticurl') |
a5c478843c82
hgweb: construct static URL like hgweb does
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36900
diff
changeset
|
513 or wsgireq.req.apppath + '/static/') |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
514 if not staticurl.endswith('/'): |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
515 staticurl += '/' |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
516 |
28954
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
517 defaults = { |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
518 "encoding": encoding.encoding, |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
519 "motd": motd, |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
520 "url": url, |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
521 "logourl": logourl, |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
522 "logoimg": logoimg, |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
523 "staticurl": staticurl, |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
524 "sessionvars": sessionvars, |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
525 "style": style, |
30766
d7bf7d2bd5ab
hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30749
diff
changeset
|
526 "nonce": nonce, |
28954
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
527 } |
f97a0bcfd7a1
templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents:
27046
diff
changeset
|
528 tmpl = templater.templater.frommapfile(mapfile, defaults=defaults) |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
529 return tmpl |