__init__.py
125 lines
| 3.6 KiB
| text/x-python
|
PythonLexer
Eric Hopper
|
r2391 | # hgweb/__init__.py - web interface to a mercurial repository | ||
Eric Hopper
|
r2311 | # | ||
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> | ||||
# Copyright 2005 Matt Mackall <mpm@selenic.com> | ||||
# | ||||
Martin Geisler
|
r8225 | # This software may be used and distributed according to the terms of the | ||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
Eric Hopper
|
r2311 | |||
Yuya Nishihara
|
r27046 | from __future__ import absolute_import | ||
Matt Mackall
|
r10996 | import os | ||
Yuya Nishihara
|
r27046 | |||
Yuya Nishihara
|
r27138 | from ..i18n import _ | ||
from .. import ( | ||||
Yuya Nishihara
|
r27139 | error, | ||
Yuya Nishihara
|
r27138 | util, | ||
) | ||||
Yuya Nishihara
|
r27046 | from . import ( | ||
hgweb_mod, | ||||
hgwebdir_mod, | ||||
Yuya Nishihara
|
r27138 | server, | ||
Yuya Nishihara
|
r27046 | ) | ||
Matt Mackall
|
r3877 | |||
Matt Mackall
|
r10996 | def hgweb(config, name=None, baseui=None): | ||
'''create an hgweb wsgi object | ||||
config can be one of: | ||||
- repo object (single repo view) | ||||
- path to repo (single repo view) | ||||
- path to config file (multi-repo view) | ||||
- dict of virtual:real pairs (multi-repo view) | ||||
- list of virtual:real tuples (multi-repo view) | ||||
''' | ||||
if ((isinstance(config, str) and not os.path.isdir(config)) or | ||||
isinstance(config, dict) or isinstance(config, list)): | ||||
# create a multi-dir interface | ||||
return hgwebdir_mod.hgwebdir(config, baseui=baseui) | ||||
return hgweb_mod.hgweb(config, name=name, baseui=baseui) | ||||
Matt Mackall
|
r3877 | |||
Matt Mackall
|
r10992 | def hgwebdir(config, baseui=None): | ||
return hgwebdir_mod.hgwebdir(config, baseui=baseui) | ||||
Matt Mackall
|
r3877 | |||
Yuya Nishihara
|
r27138 | class httpservice(object): | ||
def __init__(self, ui, app, opts): | ||||
self.ui = ui | ||||
self.app = app | ||||
self.opts = opts | ||||
def init(self): | ||||
util.setsignalhandler() | ||||
self.httpd = server.create_server(self.ui, self.app) | ||||
if self.opts['port'] and not self.ui.verbose: | ||||
return | ||||
if self.httpd.prefix: | ||||
prefix = self.httpd.prefix.strip('/') + '/' | ||||
else: | ||||
prefix = '' | ||||
port = ':%d' % self.httpd.port | ||||
if port == ':80': | ||||
port = '' | ||||
bindaddr = self.httpd.addr | ||||
if bindaddr == '0.0.0.0': | ||||
bindaddr = '*' | ||||
elif ':' in bindaddr: # IPv6 | ||||
bindaddr = '[%s]' % bindaddr | ||||
fqaddr = self.httpd.fqaddr | ||||
if ':' in fqaddr: | ||||
fqaddr = '[%s]' % fqaddr | ||||
if self.opts['port']: | ||||
write = self.ui.status | ||||
else: | ||||
write = self.ui.write | ||||
write(_('listening at http://%s%s/%s (bound to %s:%d)\n') % | ||||
(fqaddr, port, prefix, bindaddr, self.httpd.port)) | ||||
self.ui.flush() # avoid buffering of status message | ||||
def run(self): | ||||
self.httpd.serve_forever() | ||||
Yuya Nishihara
|
r27139 | |||
def createservice(ui, repo, opts): | ||||
# this way we can check if something was given in the command-line | ||||
if opts.get('port'): | ||||
opts['port'] = util.getport(opts.get('port')) | ||||
Yuya Nishihara
|
r27182 | alluis = set([ui]) | ||
Yuya Nishihara
|
r27139 | if repo: | ||
baseui = repo.baseui | ||||
Yuya Nishihara
|
r27182 | alluis.update([repo.baseui, repo.ui]) | ||
Yuya Nishihara
|
r27139 | else: | ||
baseui = ui | ||||
Yuya Nishihara
|
r27184 | webconf = opts.get('web_conf') or opts.get('webdir_conf') | ||
if webconf: | ||||
# load server settings (e.g. web.port) to "copied" ui, which allows | ||||
# hgwebdir to reload webconf cleanly | ||||
servui = ui.copy() | ||||
servui.readconfig(webconf, sections=['web']) | ||||
alluis.add(servui) | ||||
else: | ||||
servui = ui | ||||
Yuya Nishihara
|
r27139 | optlist = ("name templates style address port prefix ipv6" | ||
" accesslog errorlog certificate encoding") | ||||
for o in optlist.split(): | ||||
val = opts.get(o, '') | ||||
if val in (None, ''): # should check against default options instead | ||||
continue | ||||
Yuya Nishihara
|
r27182 | for u in alluis: | ||
u.setconfig("web", o, val, 'serve') | ||||
Yuya Nishihara
|
r27139 | |||
Yuya Nishihara
|
r27181 | if webconf: | ||
app = hgwebdir_mod.hgwebdir(webconf, baseui=baseui) | ||||
else: | ||||
Yuya Nishihara
|
r27139 | if not repo: | ||
raise error.RepoError(_("there is no Mercurial repository" | ||||
" here (.hg not found)")) | ||||
Yuya Nishihara
|
r27181 | app = hgweb_mod.hgweb(repo, baseui=baseui) | ||
Yuya Nishihara
|
r27184 | return httpservice(servui, app, opts) | ||