Mercurial > public > mercurial-scm > hg
annotate mercurial/hgweb/hgwebdir_mod.py @ 4084:51e52db6b40d
hgweb: allow static files to be served directly by the HTTP server
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Thu, 15 Feb 2007 08:51:32 -0200 |
parents | e6d26e71f049 |
children | ca639faa38a2 |
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 # |
6 # This software may be used and distributed according to the terms | |
7 # of the GNU General Public License, incorporated herein by reference. | |
8 | |
3877
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3557
diff
changeset
|
9 from mercurial import demandimport; demandimport.enable() |
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3557
diff
changeset
|
10 import os, mimetools, cStringIO |
2311
b832b6eb65ab
Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents:
2275
diff
changeset
|
11 from mercurial.i18n import gettext as _ |
3877
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3557
diff
changeset
|
12 from mercurial import ui, hg, util, templater |
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3557
diff
changeset
|
13 from common import get_mtime, staticfile, style_map |
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3557
diff
changeset
|
14 from hgweb_mod import hgweb |
138 | 15 |
941 | 16 # This is a stopgap |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1554
diff
changeset
|
17 class hgwebdir(object): |
4079
40c9710e8182
Pass a ui from create_server to hgwebdir and a repo from hgwebdir to hgweb
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3882
diff
changeset
|
18 def __init__(self, config, parentui=None): |
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
|
19 def cleannames(items): |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
20 return [(name.strip(os.sep), 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 |
4079
40c9710e8182
Pass a ui from create_server to hgwebdir and a repo from hgwebdir to hgweb
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3882
diff
changeset
|
22 self.parentui = parentui |
4080
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
23 self.motd = None |
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
24 self.style = None |
2174
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
25 self.repos_sorted = ('name', False) |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
26 if isinstance(config, (list, tuple)): |
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
|
27 self.repos = cleannames(config) |
2174
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
28 self.repos_sorted = ('', False) |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
29 elif isinstance(config, dict): |
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
|
30 self.repos = cleannames(config.items()) |
1143
4fffb3d84b7c
Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1142
diff
changeset
|
31 self.repos.sort() |
4fffb3d84b7c
Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1142
diff
changeset
|
32 else: |
4051
022056263354
hgwebdir: class hgwebdir should also accept a configparser instance
Michael Gebetsroither <michael.geb@gmx.at>
parents:
3887
diff
changeset
|
33 if isinstance(config, util.configparser): |
022056263354
hgwebdir: class hgwebdir should also accept a configparser instance
Michael Gebetsroither <michael.geb@gmx.at>
parents:
3887
diff
changeset
|
34 cp = config |
022056263354
hgwebdir: class hgwebdir should also accept a configparser instance
Michael Gebetsroither <michael.geb@gmx.at>
parents:
3887
diff
changeset
|
35 else: |
022056263354
hgwebdir: class hgwebdir should also accept a configparser instance
Michael Gebetsroither <michael.geb@gmx.at>
parents:
3887
diff
changeset
|
36 cp = util.configparser() |
022056263354
hgwebdir: class hgwebdir should also accept a configparser instance
Michael Gebetsroither <michael.geb@gmx.at>
parents:
3887
diff
changeset
|
37 cp.read(config) |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
38 self.repos = [] |
3221
d7d53e3d9590
Add style support to hgwebdir
Edouard Gomez <ed.gomez@free.fr>
parents:
2859
diff
changeset
|
39 if cp.has_section('web'): |
d7d53e3d9590
Add style support to hgwebdir
Edouard Gomez <ed.gomez@free.fr>
parents:
2859
diff
changeset
|
40 if cp.has_option('web', 'motd'): |
d7d53e3d9590
Add style support to hgwebdir
Edouard Gomez <ed.gomez@free.fr>
parents:
2859
diff
changeset
|
41 self.motd = cp.get('web', 'motd') |
d7d53e3d9590
Add style support to hgwebdir
Edouard Gomez <ed.gomez@free.fr>
parents:
2859
diff
changeset
|
42 if cp.has_option('web', 'style'): |
3223
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3221
diff
changeset
|
43 self.style = cp.get('web', 'style') |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
44 if cp.has_section('paths'): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
45 self.repos.extend(cleannames(cp.items('paths'))) |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
46 if cp.has_section('collections'): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
47 for prefix, root in cp.items('collections'): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
48 for path in util.walkrepos(root): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
49 repo = os.path.normpath(path) |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
50 name = repo |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
51 if name.startswith(prefix): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
52 name = name[len(prefix):] |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1703
diff
changeset
|
53 self.repos.append((name.lstrip(os.sep), repo)) |
1143
4fffb3d84b7c
Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1142
diff
changeset
|
54 self.repos.sort() |
941 | 55 |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
56 def run(self): |
2538
f4b7d71c1c60
Cleanup hgweb and hgwebdir's run method a bit.
Eric Hopper <hopper@omnifarious.org>
parents:
2537
diff
changeset
|
57 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."): |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
58 raise RuntimeError("This function is only intended to be called while running as a CGI script.") |
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
59 import mercurial.hgweb.wsgicgi as wsgicgi |
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
60 from request import wsgiapplication |
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
61 def make_web_app(): |
2538
f4b7d71c1c60
Cleanup hgweb and hgwebdir's run method a bit.
Eric Hopper <hopper@omnifarious.org>
parents:
2537
diff
changeset
|
62 return self |
2535
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
63 wsgicgi.launch(wsgiapplication(make_web_app)) |
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
64 |
b8ccf6386db7
Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents:
2514
diff
changeset
|
65 def run_wsgi(self, req): |
941 | 66 def header(**map): |
3882
9c8488490724
Set charset encoding for hgwebdir, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3557
diff
changeset
|
67 header_file = cStringIO.StringIO( |
9c8488490724
Set charset encoding for hgwebdir, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3557
diff
changeset
|
68 ''.join(tmpl("header", encoding=util._encoding, **map))) |
2514
419c42223bee
Really fix http headers for web UI and issue 254.
Eric Hopper <hopper@omnifarious.org>
parents:
2509
diff
changeset
|
69 msg = mimetools.Message(header_file, 0) |
419c42223bee
Really fix http headers for web UI and issue 254.
Eric Hopper <hopper@omnifarious.org>
parents:
2509
diff
changeset
|
70 req.header(msg.items()) |
419c42223bee
Really fix http headers for web UI and issue 254.
Eric Hopper <hopper@omnifarious.org>
parents:
2509
diff
changeset
|
71 yield header_file.read() |
941 | 72 |
73 def footer(**map): | |
3479
bbfb392b2b1a
Fix "templater object got multiple values for keyword argument 'motd'"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3478
diff
changeset
|
74 yield tmpl("footer", **map) |
941 | 75 |
3488
8f02223662c8
hgweb: make #motd# available for all templates
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3479
diff
changeset
|
76 def motd(**map): |
4080
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
77 if self.motd is not None: |
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
78 yield self.motd |
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
79 else: |
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
80 yield config('web', 'motd', '') |
3488
8f02223662c8
hgweb: make #motd# available for all templates
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3479
diff
changeset
|
81 |
4079
40c9710e8182
Pass a ui from create_server to hgwebdir and a repo from hgwebdir to hgweb
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3882
diff
changeset
|
82 parentui = self.parentui or ui.ui(report_untrusted=False) |
40c9710e8182
Pass a ui from create_server to hgwebdir and a repo from hgwebdir to hgweb
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3882
diff
changeset
|
83 |
4080
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
84 def config(section, name, default=None, untrusted=True): |
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
85 return parentui.config(section, name, default, untrusted) |
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
86 |
3328
415905fad4fe
Add base URL to hgwebdir templater (fixes index page when the URL does not have a trailing /)
Brendan Cully <brendan@kublai.com>
parents:
3276
diff
changeset
|
87 url = req.env['REQUEST_URI'].split('?')[0] |
415905fad4fe
Add base URL to hgwebdir templater (fixes index page when the URL does not have a trailing /)
Brendan Cully <brendan@kublai.com>
parents:
3276
diff
changeset
|
88 if not url.endswith('/'): |
415905fad4fe
Add base URL to hgwebdir templater (fixes index page when the URL does not have a trailing /)
Brendan Cully <brendan@kublai.com>
parents:
3276
diff
changeset
|
89 url += '/' |
415905fad4fe
Add base URL to hgwebdir templater (fixes index page when the URL does not have a trailing /)
Brendan Cully <brendan@kublai.com>
parents:
3276
diff
changeset
|
90 |
4084
51e52db6b40d
hgweb: allow static files to be served directly by the HTTP server
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4081
diff
changeset
|
91 staticurl = config('web', 'staticurl') or url + 'static/' |
51e52db6b40d
hgweb: allow static files to be served directly by the HTTP server
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4081
diff
changeset
|
92 if not staticurl.endswith('/'): |
51e52db6b40d
hgweb: allow static files to be served directly by the HTTP server
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4081
diff
changeset
|
93 staticurl += '/' |
51e52db6b40d
hgweb: allow static files to be served directly by the HTTP server
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4081
diff
changeset
|
94 |
3221
d7d53e3d9590
Add style support to hgwebdir
Edouard Gomez <ed.gomez@free.fr>
parents:
2859
diff
changeset
|
95 style = self.style |
4080
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
96 if style is None: |
ef14fdb675da
hgwebdir: try to get web.style and web.motd from the ui.config system
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4079
diff
changeset
|
97 style = config('web', 'style', '') |
3221
d7d53e3d9590
Add style support to hgwebdir
Edouard Gomez <ed.gomez@free.fr>
parents:
2859
diff
changeset
|
98 if req.form.has_key('style'): |
d7d53e3d9590
Add style support to hgwebdir
Edouard Gomez <ed.gomez@free.fr>
parents:
2859
diff
changeset
|
99 style = req.form['style'][0] |
3276
db9d2a624521
hgweb: Search templates in templatepath/style/map, too, using a common function.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3263
diff
changeset
|
100 mapfile = style_map(templater.templatepath(), style) |
db9d2a624521
hgweb: Search templates in templatepath/style/map, too, using a common function.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3263
diff
changeset
|
101 tmpl = templater.templater(mapfile, templater.common_filters, |
1964
778281d46bb2
fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
102 defaults={"header": header, |
3328
415905fad4fe
Add base URL to hgwebdir templater (fixes index page when the URL does not have a trailing /)
Brendan Cully <brendan@kublai.com>
parents:
3276
diff
changeset
|
103 "footer": footer, |
3488
8f02223662c8
hgweb: make #motd# available for all templates
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3479
diff
changeset
|
104 "motd": motd, |
4084
51e52db6b40d
hgweb: allow static files to be served directly by the HTTP server
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4081
diff
changeset
|
105 "url": url, |
51e52db6b40d
hgweb: allow static files to be served directly by the HTTP server
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4081
diff
changeset
|
106 "staticurl": staticurl}) |
941 | 107 |
2171
290534ee163c
Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2170
diff
changeset
|
108 def archivelist(ui, nodeid, url): |
3556
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
109 allowed = ui.configlist("web", "allow_archive", untrusted=True) |
3262
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
110 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
|
111 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
|
112 untrusted=True): |
3262
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
113 yield {"type" : i[0], "extension": i[1], |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
114 "node": nodeid, "url": url} |
2171
290534ee163c
Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2170
diff
changeset
|
115 |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
116 def entries(sortcolumn="", descending=False, **map): |
3365
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
117 def sessionvars(**map): |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
118 fields = [] |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
119 if req.form.has_key('style'): |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
120 style = req.form['style'][0] |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
121 if style != get('web', 'style', ''): |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
122 fields.append(('style', style)) |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
123 |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
124 separator = url[-1] == '?' and ';' or '?' |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
125 for name, value in fields: |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
126 yield dict(name=name, value=value, separator=separator) |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
127 separator = ';' |
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
128 |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
129 rows = [] |
941 | 130 parity = 0 |
1141
033c968d7c66
Use ConfigParser only in hgwebdir.__init__()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1140
diff
changeset
|
131 for name, path in self.repos: |
4079
40c9710e8182
Pass a ui from create_server to hgwebdir and a repo from hgwebdir to hgweb
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3882
diff
changeset
|
132 u = ui.ui(parentui=parentui) |
1170
85555540a4e2
Make .hg/hgrc optional for repositories published by hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1165
diff
changeset
|
133 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
|
134 u.readconfig(os.path.join(path, '.hg', 'hgrc')) |
1170
85555540a4e2
Make .hg/hgrc optional for repositories published by hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1165
diff
changeset
|
135 except IOError: |
85555540a4e2
Make .hg/hgrc optional for repositories published by hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1165
diff
changeset
|
136 pass |
3556
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
137 def get(section, name, default=None): |
c3043ebe40a0
use untrusted settings in hgwebdir
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3488
diff
changeset
|
138 return u.config(section, name, default, untrusted=True) |
941 | 139 |
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
|
140 url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name]) |
3262
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
141 .replace("//", "/")) + '/' |
1022 | 142 |
1348 | 143 # update time with local timezone |
1524
0d47bb884330
hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents:
1511
diff
changeset
|
144 try: |
0d47bb884330
hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents:
1511
diff
changeset
|
145 d = (get_mtime(path), util.makedate()[1]) |
0d47bb884330
hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents:
1511
diff
changeset
|
146 except OSError: |
0d47bb884330
hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents:
1511
diff
changeset
|
147 continue |
1348 | 148 |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
149 contact = (get("ui", "username") or # preferred |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
150 get("web", "contact") or # deprecated |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
151 get("web", "author", "")) # also |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
152 description = get("web", "description", "") |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
153 name = get("web", "name", name) |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
154 row = dict(contact=contact or "unknown", |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
155 contact_sort=contact.upper() or "unknown", |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
156 name=name, |
2174
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
157 name_sort=name, |
1062 | 158 url=url, |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
159 description=description or "unknown", |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
160 description_sort=description.upper() or "unknown", |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
161 lastchange=d, |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
162 lastchange_sort=d[1]-d[0], |
3365
cf680c9ab1dd
Keep session variables when linking from hgwebdir's index to repositories.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3328
diff
changeset
|
163 sessionvars=sessionvars, |
2171
290534ee163c
Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2170
diff
changeset
|
164 archives=archivelist(u, "tip", url)) |
2174
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
165 if (not sortcolumn |
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
166 or (sortcolumn, descending) == self.repos_sorted): |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
167 # fast path for unsorted output |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
168 row['parity'] = parity |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
169 parity = 1 - parity |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
170 yield row |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
171 else: |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
172 rows.append((row["%s_sort" % sortcolumn], row)) |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
173 if rows: |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
174 rows.sort() |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
175 if descending: |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
176 rows.reverse() |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
177 for key, row in rows: |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
178 row['parity'] = parity |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
179 parity = 1 - parity |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
180 yield row |
941 | 181 |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
182 virtual = req.env.get("PATH_INFO", "").strip('/') |
3263
3207e30bf468
hgweb: support for generating and parsing NWI URLs
Brendan Cully <brendan@kublai.com>
parents:
3262
diff
changeset
|
183 if virtual.startswith('static/'): |
3207e30bf468
hgweb: support for generating and parsing NWI URLs
Brendan Cully <brendan@kublai.com>
parents:
3262
diff
changeset
|
184 static = os.path.join(templater.templatepath(), 'static') |
3207e30bf468
hgweb: support for generating and parsing NWI URLs
Brendan Cully <brendan@kublai.com>
parents:
3262
diff
changeset
|
185 fname = virtual[7:] |
3207e30bf468
hgweb: support for generating and parsing NWI URLs
Brendan Cully <brendan@kublai.com>
parents:
3262
diff
changeset
|
186 req.write(staticfile(static, fname, req) or |
3207e30bf468
hgweb: support for generating and parsing NWI URLs
Brendan Cully <brendan@kublai.com>
parents:
3262
diff
changeset
|
187 tmpl('error', error='%r not found' % fname)) |
3207e30bf468
hgweb: support for generating and parsing NWI URLs
Brendan Cully <brendan@kublai.com>
parents:
3262
diff
changeset
|
188 elif virtual: |
3262
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
189 while virtual: |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
190 real = dict(self.repos).get(virtual) |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
191 if real: |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
192 break |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
193 up = virtual.rfind('/') |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
194 if up < 0: |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
195 break |
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
196 virtual = virtual[:up] |
1141
033c968d7c66
Use ConfigParser only in hgwebdir.__init__()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1140
diff
changeset
|
197 if real: |
3262
1e322b44b366
Teach hgwebdir about new interface
Brendan Cully <brendan@kublai.com>
parents:
3223
diff
changeset
|
198 req.env['REPO_NAME'] = virtual |
1554
68ec7b9e09a4
Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1545
diff
changeset
|
199 try: |
4079
40c9710e8182
Pass a ui from create_server to hgwebdir and a repo from hgwebdir to hgweb
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3882
diff
changeset
|
200 repo = hg.repository(parentui, real) |
40c9710e8182
Pass a ui from create_server to hgwebdir and a repo from hgwebdir to hgweb
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3882
diff
changeset
|
201 hgweb(repo).run_wsgi(req) |
1554
68ec7b9e09a4
Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1545
diff
changeset
|
202 except IOError, inst: |
68ec7b9e09a4
Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1545
diff
changeset
|
203 req.write(tmpl("error", error=inst.strerror)) |
68ec7b9e09a4
Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1545
diff
changeset
|
204 except hg.RepoError, inst: |
68ec7b9e09a4
Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1545
diff
changeset
|
205 req.write(tmpl("error", error=str(inst))) |
1123
457c23af92bd
Use a template for the error message.
Ollivier Robert <roberto@keltia.freenix.fr>
parents:
1122
diff
changeset
|
206 else: |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
207 req.write(tmpl("notfound", repo=virtual)) |
1142
74d184a40a2e
Cleaned up hgweb.hgwebdir.run()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1141
diff
changeset
|
208 else: |
1793
83c6d8355909
Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1792
diff
changeset
|
209 if req.form.has_key('static'): |
1897
58b6784cf9f1
move hgweb.templatepath into templater
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1896
diff
changeset
|
210 static = os.path.join(templater.templatepath(), "static") |
1793
83c6d8355909
Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1792
diff
changeset
|
211 fname = req.form['static'][0] |
2514
419c42223bee
Really fix http headers for web UI and issue 254.
Eric Hopper <hopper@omnifarious.org>
parents:
2509
diff
changeset
|
212 req.write(staticfile(static, fname, req) |
1793
83c6d8355909
Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1792
diff
changeset
|
213 or tmpl("error", error="%r not found" % fname)) |
83c6d8355909
Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1792
diff
changeset
|
214 else: |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
215 sortable = ["name", "description", "contact", "lastchange"] |
2174
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
216 sortcolumn, descending = self.repos_sorted |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
217 if req.form.has_key('sort'): |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
218 sortcolumn = req.form['sort'][0] |
2174
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
219 descending = sortcolumn.startswith('-') |
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
220 if descending: |
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
221 sortcolumn = sortcolumn[1:] |
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
222 if sortcolumn not in sortable: |
3044a3fdae76
If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2173
diff
changeset
|
223 sortcolumn = "" |
2173
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
224 |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
225 sort = [("sort_%s" % column, |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
226 "%s%s" % ((not descending and column == sortcolumn) |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
227 and "-" or "", column)) |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
228 for column in sortable] |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
229 req.write(tmpl("index", entries=entries, |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
230 sortcolumn=sortcolumn, descending=descending, |
d1943df604c4
Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2171
diff
changeset
|
231 **dict(sort))) |