Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/hgweb/hgwebdir_mod.py @ 26072:06320fb11699
hgweb: make refresh interval configurable
hgwebdir refreshes the set of known repositories periodically. This
is necessary because refreshing on every request could add significant
request latency.
More than once I've found myself wanting to tweak this interval at
Mozilla. I've also wanted the ability to always refresh (often when
writing tests for our replication setup).
This patch makes the refresh interval configurable. Negative values
indicate to always refresh. The default is left unchanged.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 22 Aug 2015 22:59:51 -0700 |
parents | 328739ea70c3 |
children | 9df8c729e2e7 |
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 |
13821
a35aff48d577
hgweb: use url.url when setting CGI environment variables
Brodie Rao <brodie@bitheap.org>
parents:
13796
diff
changeset
|
9 import os, re, time |
7225
59b4ae211584
i18n: import _ instead of gettext
Martin Geisler <mg@daimi.au.dk>
parents:
7107
diff
changeset
|
10 from mercurial.i18n import _ |
13975
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13964
diff
changeset
|
11 from mercurial import ui, hg, scmutil, util, templater |
14076
924c82157d46
url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents:
13975
diff
changeset
|
12 from mercurial import error, encoding |
19032
7d31f2e42a8a
hgweb: refactor checks for granting and revoking user permissions
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
18645
diff
changeset
|
13 from common import ErrorResponse, get_mtime, staticfile, paritygen, ismember, \ |
5993
948a41e77902
hgweb: explicit response status
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5976
diff
changeset
|
14 get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR |
18258
bebb05a7e249
hgweb: add a "URL breadcrumb" to the index and repository pages
Angel Ezquerra <angel.ezquerra at gmail.com>
parents:
18206
diff
changeset
|
15 from hgweb_mod import hgweb, makebreadcrumb |
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
|
16 from request import wsgirequest |
8216
25266fe996b0
hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8215
diff
changeset
|
17 import webutil |
138 | 18 |
8215
227707c90548
hgweb: some cleanups in hgwebdir, remove double defaults
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8209
diff
changeset
|
19 def cleannames(items): |
227707c90548
hgweb: some cleanups in hgwebdir, remove double defaults
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8209
diff
changeset
|
20 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
|
21 |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
22 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
|
23 repos = [] |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
24 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
|
25 roothead, roottail = os.path.split(root) |
17104
5a9acb0b2086
help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents:
16754
diff
changeset
|
26 # "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
|
27 # /bar/ be served as as foo/N . |
5a9acb0b2086
help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents:
16754
diff
changeset
|
28 # '*' will not search inside dirs with .hg (except .hg/patches), |
5a9acb0b2086
help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents:
16754
diff
changeset
|
29 # '**' 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
|
30 try: |
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
31 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
|
32 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
|
33 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
|
34 continue |
11677
8f8a7976f4bc
hgwebdir: allow pure relative globs in paths
Mads Kiilerich <mads@kiilerich.com>
parents:
11649
diff
changeset
|
35 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
|
36 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
|
37 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
|
38 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
|
39 |
13402
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
40 def urlrepos(prefix, roothead, paths): |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
41 """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
|
42 |
13538
d24e97fd52a9
test-doctest: handle unix/windows path discrepancies
Patrick Mezard <pmezard@gmail.com>
parents:
13436
diff
changeset
|
43 >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq] |
d24e97fd52a9
test-doctest: handle unix/windows path discrepancies
Patrick Mezard <pmezard@gmail.com>
parents:
13436
diff
changeset
|
44 >>> conv(urlrepos('hg', '/opt', ['/opt/r', '/opt/r/r', '/opt'])) |
13403
8ed91088acbb
hgweb: make paths wildcards expanding in a repo root match repo correctly
Mads Kiilerich <mads@kiilerich.com>
parents:
13402
diff
changeset
|
45 [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')] |
13538
d24e97fd52a9
test-doctest: handle unix/windows path discrepancies
Patrick Mezard <pmezard@gmail.com>
parents:
13436
diff
changeset
|
46 >>> conv(urlrepos('', '/opt', ['/opt/r', '/opt/r/r', '/opt'])) |
13402
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
47 [('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
|
48 """ |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
49 for path in paths: |
f947d9a4c45c
hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents:
13214
diff
changeset
|
50 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
|
51 yield (prefix + '/' + |
8ed91088acbb
hgweb: make paths wildcards expanding in a repo root match repo correctly
Mads Kiilerich <mads@kiilerich.com>
parents:
13402
diff
changeset
|
52 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
|
53 |
15003
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
54 def geturlcgivars(baseurl, port): |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
55 """ |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
56 Extract CGI variables from baseurl |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
57 |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
58 >>> geturlcgivars("http://host.org/base", "80") |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
59 ('host.org', '80', '/base') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
60 >>> geturlcgivars("http://host.org:8000/base", "80") |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
61 ('host.org', '8000', '/base') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
62 >>> geturlcgivars('/base', 8000) |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
63 ('', '8000', '/base') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
64 >>> geturlcgivars("base", '8000') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
65 ('', '8000', '/base') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
66 >>> geturlcgivars("http://host", '8000') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
67 ('host', '8000', '/') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
68 >>> geturlcgivars("http://host/", '8000') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
69 ('host', '8000', '/') |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
70 """ |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
71 u = util.url(baseurl) |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
72 name = u.host or '' |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
73 if u.port: |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
74 port = u.port |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
75 path = u.path or "" |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
76 if not path.startswith('/'): |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
77 path = '/' + path |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
78 |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
79 return name, str(port), path |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
80 |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1554
diff
changeset
|
81 class hgwebdir(object): |
8191
35604226d712
hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
82 def __init__(self, conf, baseui=None): |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
83 self.conf = conf |
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
84 self.baseui = baseui |
26072
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
85 self.ui = None |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
86 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
|
87 self.motd = None |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
88 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
|
89 |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
90 def refresh(self): |
26072
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
91 refreshinterval = 20 |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
92 if self.ui: |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
93 refreshinterval = self.ui.configint('web', 'refreshinterval', |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
94 refreshinterval) |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
95 |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
96 # refreshinterval <= 0 means to always refresh. |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
97 if (refreshinterval > 0 and |
06320fb11699
hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
98 self.lastrefresh + refreshinterval > time.time()): |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
99 return |
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
100 |
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
101 if self.baseui: |
11239
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
102 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
|
103 else: |
12696
ef969e58a394
hgweb: another fix for the help termwidth bug
Matt Mackall <mpm@selenic.com>
parents:
12691
diff
changeset
|
104 u = ui.ui() |
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
|
105 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
|
106 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
|
107 # 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
|
108 # break some wsgi implementations. |
89ce95f907bd
hgewb: disable progress when serving (issue4582)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25427
diff
changeset
|
109 u.setconfig('progress', 'disable', 'true', 'hgweb') |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
7966
diff
changeset
|
110 |
8529
a767998f0a78
hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
8389
diff
changeset
|
111 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
|
112 map = {'paths': 'hgweb-paths'} |
13214
5bcb6c9d16db
hgweb: abort if config file isn't found
Matt Mackall <mpm@selenic.com>
parents:
13066
diff
changeset
|
113 if not os.path.exists(self.conf): |
5bcb6c9d16db
hgweb: abort if config file isn't found
Matt Mackall <mpm@selenic.com>
parents:
13066
diff
changeset
|
114 raise util.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
|
115 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
|
116 paths = [] |
8cbb59124e67
hgweb: support multiple directories for the same path
timeless <timeless@gmail.com>
parents:
13538
diff
changeset
|
117 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
|
118 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
|
119 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
|
120 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
|
121 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
|
122 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
|
123 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
|
124 |
11239
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
125 repos = findrepos(paths) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
126 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
|
127 prefix = util.pconvert(prefix) |
13975
938fbeacac84
move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13964
diff
changeset
|
128 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
|
129 repo = os.path.normpath(path) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
130 name = util.pconvert(repo) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
131 if name.startswith(prefix): |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
132 name = name[len(prefix):] |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
133 repos.append((name.lstrip('/'), repo)) |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
134 |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
135 self.repos = repos |
99bc18d1ab0f
hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents:
10675
diff
changeset
|
136 self.ui = u |
8859
580a79dde2a3
hgweb: web.encoding should override encoding.encoding (issue1183)
Matt Mackall <mpm@selenic.com>
parents:
8663
diff
changeset
|
137 encoding.encoding = self.ui.config('web', 'encoding', |
580a79dde2a3
hgweb: web.encoding should override encoding.encoding (issue1183)
Matt Mackall <mpm@selenic.com>
parents:
8663
diff
changeset
|
138 encoding.encoding) |
8621
13613221caf1
hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8537
diff
changeset
|
139 self.style = self.ui.config('web', 'style', 'paper') |
11649
48163c39e1f1
hgwebdir: use template paths configured in the hgrc (issue2281)
Christian Fischer <christian@fi12.de>
parents:
11241
diff
changeset
|
140 self.templatepath = self.ui.config('web', 'templates', None) |
8621
13613221caf1
hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8537
diff
changeset
|
141 self.stripecount = self.ui.config('web', 'stripes', 1) |
13613221caf1
hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8537
diff
changeset
|
142 if self.stripecount: |
13613221caf1
hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8537
diff
changeset
|
143 self.stripecount = int(self.stripecount) |
13613221caf1
hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8537
diff
changeset
|
144 self._baseurl = self.ui.config('web', 'baseurl') |
18515
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
145 prefix = self.ui.config('web', 'prefix', '') |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
146 if prefix.startswith('/'): |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
147 prefix = prefix[1:] |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
148 if prefix.endswith('/'): |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
149 prefix = prefix[:-1] |
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
150 self.prefix = prefix |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
151 self.lastrefresh = time.time() |
941 | 152 |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
153 def run(self): |
2538
f4b7d71c1c60
Cleanup hgweb and hgwebdir's run method a bit.
Eric Hopper <hopper@omnifarious.org>
parents:
2537
diff
changeset
|
154 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."): |
8663
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8621
diff
changeset
|
155 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
|
156 "called while running as a CGI script.") |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
157 import mercurial.hgweb.wsgicgi as wsgicgi |
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
|
158 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
|
159 |
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
|
160 def __call__(self, env, respond): |
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
|
161 req = wsgirequest(env, respond) |
6797
8909070fd05e
merge another backout
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6796
diff
changeset
|
162 return self.run_wsgi(req) |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
163 |
7336
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
164 def read_allowed(self, ui, req): |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
165 """Check allow_read and deny_read config options of a repo's ui object |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
166 to determine user permissions. By default, with neither option set (or |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
167 both empty), allow all users to read the repo. There are two ways a |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
168 user can be denied read access: (1) deny_read is not empty, and the |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
169 user is unauthenticated or deny_read contains user (or *), and (2) |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
170 allow_read is not empty and the user is not in allow_read. Return True |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
171 if user is allowed to read the repo, else return False.""" |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
172 |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
173 user = req.env.get('REMOTE_USER') |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
174 |
7575
3ccaefc84f45
hgweb: fix long line lengths introduced in 2dc868712dcc
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7560
diff
changeset
|
175 deny_read = ui.configlist('web', 'deny_read', untrusted=True) |
19032
7d31f2e42a8a
hgweb: refactor checks for granting and revoking user permissions
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
18645
diff
changeset
|
176 if deny_read and (not user or ismember(ui, user, deny_read)): |
7336
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
177 return False |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
178 |
7575
3ccaefc84f45
hgweb: fix long line lengths introduced in 2dc868712dcc
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7560
diff
changeset
|
179 allow_read = ui.configlist('web', 'allow_read', untrusted=True) |
7336
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
180 # by default, allow reading if no allow_read option has been set |
19032
7d31f2e42a8a
hgweb: refactor checks for granting and revoking user permissions
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
18645
diff
changeset
|
181 if (not allow_read) or ismember(ui, user, allow_read): |
7336
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
182 return True |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
183 |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
184 return False |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
185 |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
186 def run_wsgi(self, req): |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
187 try: |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
188 self.refresh() |
5603
74f65f44a9aa
hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5602
diff
changeset
|
189 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
190 virtual = req.env.get("PATH_INFO", "").strip('/') |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
191 tmpl = self.templater(req) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
192 ctype = tmpl('mimetype', encoding=encoding.encoding) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
193 ctype = templater.stringify(ctype) |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5603
diff
changeset
|
194 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
195 # a static file |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
196 if virtual.startswith('static/') or 'static' in req.form: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
197 if virtual.startswith('static/'): |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
198 fname = virtual[7:] |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
199 else: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
200 fname = req.form['static'][0] |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
201 static = self.ui.config("web", "static", None, |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
202 untrusted=False) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
203 if not static: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
204 tp = self.templatepath or templater.templatepaths() |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
205 if isinstance(tp, str): |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
206 tp = [tp] |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
207 static = [os.path.join(p, 'static') for p in tp] |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
208 staticfile(static, fname, req) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
209 return [] |
5603
74f65f44a9aa
hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5602
diff
changeset
|
210 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
211 # top-level index |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
212 elif not virtual: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
213 req.respond(HTTP_OK, ctype) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
214 return self.makeindex(req, tmpl) |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
215 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
216 # nested indexes and hgwebs |
6210
942287cb1f57
Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6046
diff
changeset
|
217 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
218 repos = dict(self.repos) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
219 virtualrepo = virtual |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
220 while virtualrepo: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
221 real = repos.get(virtualrepo) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
222 if real: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
223 req.env['REPO_NAME'] = virtualrepo |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
224 try: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
225 # ensure caller gets private copy of ui |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
226 repo = hg.repository(self.ui.copy(), real) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
227 return hgweb(repo).run_wsgi(req) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25488
diff
changeset
|
228 except IOError as inst: |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
229 msg = inst.strerror |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
230 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
|
231 except error.RepoError as inst: |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
232 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst)) |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
233 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
234 up = virtualrepo.rfind('/') |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
235 if up < 0: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
236 break |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
237 virtualrepo = virtualrepo[:up] |
13066
86888ae9ce90
hgwebdir: fix incorrect index generation for invalid paths (issue2023)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
12696
diff
changeset
|
238 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
239 # browse subdirectories |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
240 subdir = virtual + '/' |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
241 if [r for r in repos if r.startswith(subdir)]: |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
242 req.respond(HTTP_OK, ctype) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
243 return self.makeindex(req, tmpl, subdir) |
5603
74f65f44a9aa
hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5602
diff
changeset
|
244 |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
245 # prefixes not found |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
246 req.respond(HTTP_NOT_FOUND, ctype) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
247 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
|
248 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25488
diff
changeset
|
249 except ErrorResponse as err: |
25083
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
250 req.respond(err, ctype) |
ef36536abea3
hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
22634
diff
changeset
|
251 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
|
252 finally: |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
253 tmpl = None |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
254 |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
255 def makeindex(self, req, tmpl, subdir=""): |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
256 |
2171
290534ee163c
Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2170
diff
changeset
|
257 def archivelist(ui, nodeid, url): |
3556
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
258 allowed = ui.configlist("web", "allow_archive", untrusted=True) |
13436
b391c0c9be61
hgwebdir: reduce memory usage for index generation
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
13403
diff
changeset
|
259 archives = [] |
3262
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
260 for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]: |
3556
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
261 if i[0] in allowed or ui.configbool("web", "allow" + i[0], |
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
262 untrusted=True): |
13436
b391c0c9be61
hgwebdir: reduce memory usage for index generation
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
13403
diff
changeset
|
263 archives.append({"type" : i[0], "extension": i[1], |
b391c0c9be61
hgwebdir: reduce memory usage for index generation
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
13403
diff
changeset
|
264 "node": nodeid, "url": url}) |
b391c0c9be61
hgwebdir: reduce memory usage for index generation
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
13403
diff
changeset
|
265 return archives |
2171
290534ee163c
Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2170
diff
changeset
|
266 |
10600
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
267 def rawentries(subdir="", **map): |
9363
8635b33eaade
hgweb: add web.descend configuration variable
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9184
diff
changeset
|
268 |
8635b33eaade
hgweb: add web.descend configuration variable
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9184
diff
changeset
|
269 descend = self.ui.configbool('web', 'descend', True) |
16239
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
270 collapse = self.ui.configbool('web', 'collapse', False) |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
271 seenrepos = set() |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
272 seendirs = set() |
1141
033c968d7c66
Use ConfigParser only in hgwebdir.__init__()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1140
diff
changeset
|
273 for name, path in self.repos: |
9363
8635b33eaade
hgweb: add web.descend configuration variable
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9184
diff
changeset
|
274 |
4841
9b0ebb5e0f94
hgweb: let hgwebdir browse subdirectories
Brendan Cully <brendan@kublai.com>
parents:
4709
diff
changeset
|
275 if not name.startswith(subdir): |
9b0ebb5e0f94
hgweb: let hgwebdir browse subdirectories
Brendan Cully <brendan@kublai.com>
parents:
4709
diff
changeset
|
276 continue |
4843
496ac05c6a31
hgwebdir: show only trailing part of path when browsing subdirectories
Brendan Cully <brendan@kublai.com>
parents:
4841
diff
changeset
|
277 name = name[len(subdir):] |
16239
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
278 directory = False |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
279 |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
280 if '/' in name: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
281 if not descend: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
282 continue |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
283 |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
284 nameparts = name.split('/') |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
285 rootname = nameparts[0] |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
286 |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
287 if not collapse: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
288 pass |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
289 elif rootname in seendirs: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
290 continue |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
291 elif rootname in seenrepos: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
292 pass |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
293 else: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
294 directory = True |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
295 name = rootname |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
296 |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
297 # redefine the path to refer to the directory |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
298 discarded = '/'.join(nameparts[1:]) |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
299 |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
300 # remove name parts plus accompanying slash |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
301 path = path[:-len(discarded) - 1] |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
302 |
25426
5f3666da6910
hgwebdir: don't allow the hidden parent of a subrepo to show as a directory
Matt Harbison <mharbison@attotech.com>
parents:
25396
diff
changeset
|
303 try: |
5f3666da6910
hgwebdir: don't allow the hidden parent of a subrepo to show as a directory
Matt Harbison <mharbison@attotech.com>
parents:
25396
diff
changeset
|
304 r = hg.repository(self.ui, path) |
5f3666da6910
hgwebdir: don't allow the hidden parent of a subrepo to show as a directory
Matt Harbison <mharbison@attotech.com>
parents:
25396
diff
changeset
|
305 directory = False |
5f3666da6910
hgwebdir: don't allow the hidden parent of a subrepo to show as a directory
Matt Harbison <mharbison@attotech.com>
parents:
25396
diff
changeset
|
306 except (IOError, error.RepoError): |
5f3666da6910
hgwebdir: don't allow the hidden parent of a subrepo to show as a directory
Matt Harbison <mharbison@attotech.com>
parents:
25396
diff
changeset
|
307 pass |
5f3666da6910
hgwebdir: don't allow the hidden parent of a subrepo to show as a directory
Matt Harbison <mharbison@attotech.com>
parents:
25396
diff
changeset
|
308 |
16239
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
309 parts = [name] |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
310 if 'PATH_INFO' in req.env: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
311 parts.insert(0, req.env['PATH_INFO'].rstrip('/')) |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
312 if req.env['SCRIPT_NAME']: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
313 parts.insert(0, req.env['SCRIPT_NAME']) |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
314 url = re.sub(r'/+', '/', '/'.join(parts) + '/') |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
315 |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
316 # show either a directory entry or a repository |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
317 if directory: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
318 # get the directory's time information |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
319 try: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
320 d = (get_mtime(path), util.makedate()[1]) |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
321 except OSError: |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
322 continue |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
323 |
17838
d51364b318ea
hgwebdir: make collapsed folders easier to distinguish from repositories
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17104
diff
changeset
|
324 # add '/' to the name to make it obvious that |
d51364b318ea
hgwebdir: make collapsed folders easier to distinguish from repositories
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17104
diff
changeset
|
325 # the entry is a directory, not a regular repository |
20677
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
326 row = {'contact': "", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
327 'contact_sort': "", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
328 'name': name + '/', |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
329 'name_sort': name, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
330 'url': url, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
331 'description': "", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
332 'description_sort': "", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
333 'lastchange': d, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
334 'lastchange_sort': d[1]-d[0], |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
335 'archives': [], |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
336 'isdirectory': True} |
16239
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
337 |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
338 seendirs.add(name) |
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
339 yield row |
9363
8635b33eaade
hgweb: add web.descend configuration variable
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9184
diff
changeset
|
340 continue |
4841
9b0ebb5e0f94
hgweb: let hgwebdir browse subdirectories
Brendan Cully <brendan@kublai.com>
parents:
4709
diff
changeset
|
341 |
8191
35604226d712
hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
342 u = self.ui.copy() |
1170
85555540a4e2
Make .hg/hgrc optional for repositories published by hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1165
diff
changeset
|
343 try: |
1473
7d66ce9895fa
make readconfig take a filename instead of a file pointer as argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1445
diff
changeset
|
344 u.readconfig(os.path.join(path, '.hg', 'hgrc')) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25488
diff
changeset
|
345 except Exception as e: |
6913
580d5e6bfc1f
move % out of translatable strings
Martin Geisler <mg@daimi.au.dk>
parents:
6908
diff
changeset
|
346 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) |
5332
b0bfe087ad8a
hgwebdir: ignore hgrc parse errors while building the index page
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5289
diff
changeset
|
347 continue |
3556
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
348 def get(section, name, default=None): |
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
349 return u.config(section, name, default, untrusted=True) |
941 | 350 |
4709
53eca35c3aeb
Add option "hidden" to hgwebdir.
Markus F.X.J. Oberhumer <markus@oberhumer.com>
parents:
4462
diff
changeset
|
351 if u.configbool("web", "hidden", untrusted=True): |
53eca35c3aeb
Add option "hidden" to hgwebdir.
Markus F.X.J. Oberhumer <markus@oberhumer.com>
parents:
4462
diff
changeset
|
352 continue |
53eca35c3aeb
Add option "hidden" to hgwebdir.
Markus F.X.J. Oberhumer <markus@oberhumer.com>
parents:
4462
diff
changeset
|
353 |
7336
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
354 if not self.read_allowed(u, req): |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
355 continue |
2dc868712dcc
hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents:
7225
diff
changeset
|
356 |
1348 | 357 # update time with local timezone |
1524
0d47bb884330
hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents:
1511
diff
changeset
|
358 try: |
10078
97c75ad3b1a0
hgweb: Make get_mtime use repository to find store path.
Brendan Cully <brendan@kublai.com>
parents:
9903
diff
changeset
|
359 r = hg.repository(self.ui, path) |
13796
6337149fc07c
hgwebdir: handle IOErrors from localrepo while enumerating
timeless@gmail.com
parents:
13667
diff
changeset
|
360 except IOError: |
6337149fc07c
hgwebdir: handle IOErrors from localrepo while enumerating
timeless@gmail.com
parents:
13667
diff
changeset
|
361 u.warn(_('error accessing repository at %s\n') % path) |
6337149fc07c
hgwebdir: handle IOErrors from localrepo while enumerating
timeless@gmail.com
parents:
13667
diff
changeset
|
362 continue |
12038
9617803b1acb
hgweb: handle exception of misconfigured path on index page
Yuya Nishihara <yuya@tcha.org>
parents:
11677
diff
changeset
|
363 except error.RepoError: |
9617803b1acb
hgweb: handle exception of misconfigured path on index page
Yuya Nishihara <yuya@tcha.org>
parents:
11677
diff
changeset
|
364 u.warn(_('error accessing repository at %s\n') % path) |
9617803b1acb
hgweb: handle exception of misconfigured path on index page
Yuya Nishihara <yuya@tcha.org>
parents:
11677
diff
changeset
|
365 continue |
9617803b1acb
hgweb: handle exception of misconfigured path on index page
Yuya Nishihara <yuya@tcha.org>
parents:
11677
diff
changeset
|
366 try: |
10078
97c75ad3b1a0
hgweb: Make get_mtime use repository to find store path.
Brendan Cully <brendan@kublai.com>
parents:
9903
diff
changeset
|
367 d = (get_mtime(r.spath), util.makedate()[1]) |
1524
0d47bb884330
hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents:
1511
diff
changeset
|
368 except OSError: |
0d47bb884330
hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents:
1511
diff
changeset
|
369 continue |
1348 | 370 |
5779
e9f68860d5ed
Don't let ui.username override web.contact (issue900)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5760
diff
changeset
|
371 contact = get_contact(get) |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
372 description = get("web", "description", "") |
25396
78e8890cfb4b
hgwebdir: avoid redundant repo and directory entries when 'web.name' is set
Matt Harbison <matt_harbison@yahoo.com>
parents:
22634
diff
changeset
|
373 seenrepos.add(name) |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
374 name = get("web", "name", name) |
20677
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
375 row = {'contact': contact or "unknown", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
376 'contact_sort': contact.upper() or "unknown", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
377 'name': name, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
378 'name_sort': name, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
379 'url': url, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
380 'description': description or "unknown", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
381 'description_sort': description.upper() or "unknown", |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
382 'lastchange': d, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
383 'lastchange_sort': d[1]-d[0], |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
384 'archives': archivelist(u, "tip", url), |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
385 'isdirectory': None, |
0e757575aef5
hgwebdir_mod: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
20575
diff
changeset
|
386 } |
16239
287f76b3f502
hgweb: support multi-level repository indexes by enabling descend and collapse
Paul Boddie <paul@boddie.org.uk>
parents:
15003
diff
changeset
|
387 |
10600
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
388 yield row |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
389 |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
390 sortdefault = None, False |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
391 def entries(sortcolumn="", descending=False, subdir="", **map): |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
392 rows = rawentries(subdir=subdir, **map) |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
393 |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
394 if sortcolumn and sortdefault != (sortcolumn, descending): |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
395 sortkey = '%s_sort' % sortcolumn |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
396 rows = sorted(rows, key=lambda x: x[sortkey], |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
397 reverse=descending) |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
398 for row, parity in zip(rows, paritygen(self.stripecount)): |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
399 row['parity'] = parity |
033d2fdc3b9d
hgweb: separate generation of entries and sorting (cleanup)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
400 yield row |
941 | 401 |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
402 self.refresh() |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
403 sortable = ["name", "description", "contact", "lastchange"] |
8346
b579823cc546
hgweb: get rid of inaccurate hgwebdir.repos_sorted, localize machinery
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8345
diff
changeset
|
404 sortcolumn, descending = sortdefault |
5915
d0576d065993
Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents:
5779
diff
changeset
|
405 if 'sort' in req.form: |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
406 sortcolumn = req.form['sort'][0] |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
407 descending = sortcolumn.startswith('-') |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
408 if descending: |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
409 sortcolumn = sortcolumn[1:] |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
410 if sortcolumn not in sortable: |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
411 sortcolumn = "" |
4841
9b0ebb5e0f94
hgweb: let hgwebdir browse subdirectories
Brendan Cully <brendan@kublai.com>
parents:
4709
diff
changeset
|
412 |
5601
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
413 sort = [("sort_%s" % column, |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
414 "%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
|
415 and "-" or "", column)) |
8279cb841467
hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5585
diff
changeset
|
416 for column in sortable] |
5928
3340aa5a64f7
hgweb: move HTTP content types out of header templates
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5915
diff
changeset
|
417 |
8371
1bd0fdf4c1ec
hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
8360
diff
changeset
|
418 self.refresh() |
10673
9848b39a1472
hgweb: introduce helper method to update req.env
Yuya Nishihara <yuya@tcha.org>
parents:
10394
diff
changeset
|
419 self.updatereqenv(req.env) |
6221
2eb18c780287
Support web.baseurl in hgwebdir, overriding SCRIPT_NAME
Brendan Cully <brendan@kublai.com>
parents:
6217
diff
changeset
|
420 |
5965
abe373e16fe6
hgweb: forgot to centralize the req.write() calls in hgwebdir
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5928
diff
changeset
|
421 return tmpl("index", entries=entries, subdir=subdir, |
18515
bf8bbbf4aa45
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
18258
diff
changeset
|
422 pathdef=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
|
423 sortcolumn=sortcolumn, descending=descending, |
abe373e16fe6
hgweb: forgot to centralize the req.write() calls in hgwebdir
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5928
diff
changeset
|
424 **dict(sort)) |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
425 |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
426 def templater(self, req): |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
427 |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
428 def motd(**map): |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
429 if self.motd is not None: |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
430 yield self.motd |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
431 else: |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
432 yield config('web', 'motd', '') |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
433 |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
434 def config(section, name, default=None, untrusted=True): |
8191
35604226d712
hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
435 return self.ui.config(section, name, default, untrusted) |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
436 |
10673
9848b39a1472
hgweb: introduce helper method to update req.env
Yuya Nishihara <yuya@tcha.org>
parents:
10394
diff
changeset
|
437 self.updatereqenv(req.env) |
6221
2eb18c780287
Support web.baseurl in hgwebdir, overriding SCRIPT_NAME
Brendan Cully <brendan@kublai.com>
parents:
6217
diff
changeset
|
438 |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
439 url = req.env.get('SCRIPT_NAME', '') |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
440 if not url.endswith('/'): |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
441 url += '/' |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
442 |
8216
25266fe996b0
hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8215
diff
changeset
|
443 vars = {} |
9842
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
444 styles = ( |
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
445 req.form.get('style', [None])[0], |
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
446 config('web', 'style'), |
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
447 'paper' |
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
448 ) |
11649
48163c39e1f1
hgwebdir: use template paths configured in the hgrc (issue2281)
Christian Fischer <christian@fi12.de>
parents:
11241
diff
changeset
|
449 style, mapfile = templater.stylemap(styles, self.templatepath) |
9842
d3dbdca92458
hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9724
diff
changeset
|
450 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
|
451 vars['style'] = style |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
452 |
8216
25266fe996b0
hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8215
diff
changeset
|
453 start = url[-1] == '?' and '&' or '?' |
25266fe996b0
hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8215
diff
changeset
|
454 sessionvars = webutil.sessionvars(vars, start) |
13964
616ad3f6fd33
hgweb: support alternate logo url
Steven Stallion <sstallion@gmail.com>
parents:
13821
diff
changeset
|
455 logourl = config('web', 'logourl', 'http://mercurial.selenic.com/') |
14913
44382887d012
hgweb: add a "web/logoimg" setting to customize the web logo image
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
14076
diff
changeset
|
456 logoimg = config('web', 'logoimg', 'hglogo.png') |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
457 staticurl = config('web', 'staticurl') or url + 'static/' |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
458 if not staticurl.endswith('/'): |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
459 staticurl += '/' |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
460 |
8360
acc202b71619
templater: provide the standard template filters by default
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8359
diff
changeset
|
461 tmpl = templater.templater(mapfile, |
19906
1dba26575dba
hgweb: remove now unnecessary explicit header() and footer()
Alexander Plavin <alexander@plav.in>
parents:
19032
diff
changeset
|
462 defaults={"encoding": encoding.encoding, |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
463 "motd": motd, |
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
464 "url": url, |
13964
616ad3f6fd33
hgweb: support alternate logo url
Steven Stallion <sstallion@gmail.com>
parents:
13821
diff
changeset
|
465 "logourl": logourl, |
14913
44382887d012
hgweb: add a "web/logoimg" setting to customize the web logo image
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
14076
diff
changeset
|
466 "logoimg": logoimg, |
8216
25266fe996b0
hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8215
diff
changeset
|
467 "staticurl": staticurl, |
20253
43cfad930d38
hgweb: avoid invalid infinity scroll request when overwritten web.style
Takumi IINO <trot.thunder@gmail.com>
parents:
19906
diff
changeset
|
468 "sessionvars": sessionvars, |
43cfad930d38
hgweb: avoid invalid infinity scroll request when overwritten web.style
Takumi IINO <trot.thunder@gmail.com>
parents:
19906
diff
changeset
|
469 "style": style, |
43cfad930d38
hgweb: avoid invalid infinity scroll request when overwritten web.style
Takumi IINO <trot.thunder@gmail.com>
parents:
19906
diff
changeset
|
470 }) |
5602
d676d0f35bd8
hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5601
diff
changeset
|
471 return tmpl |
10673
9848b39a1472
hgweb: introduce helper method to update req.env
Yuya Nishihara <yuya@tcha.org>
parents:
10394
diff
changeset
|
472 |
9848b39a1472
hgweb: introduce helper method to update req.env
Yuya Nishihara <yuya@tcha.org>
parents:
10394
diff
changeset
|
473 def updatereqenv(self, env): |
9848b39a1472
hgweb: introduce helper method to update req.env
Yuya Nishihara <yuya@tcha.org>
parents:
10394
diff
changeset
|
474 if self._baseurl is not None: |
15003
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
475 name, port, path = geturlcgivars(self._baseurl, env['SERVER_PORT']) |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
476 env['SERVER_NAME'] = name |
a31b8e03af28
hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents:
15002
diff
changeset
|
477 env['SERVER_PORT'] = port |
15001
dd74cd1e5d49
hgweb: handle 'baseurl' configurations with leading slash (issue2934)
wujek
parents:
14076
diff
changeset
|
478 env['SCRIPT_NAME'] = path |