__init__.py
115 lines
| 3.3 KiB
| text/x-python
|
PythonLexer
|
r2391 | # hgweb/__init__.py - web interface to a mercurial repository | ||
|
r2311 | # | ||
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> | ||||
# Copyright 2005 Matt Mackall <mpm@selenic.com> | ||||
# | ||||
|
r8225 | # This software may be used and distributed according to the terms of the | ||
|
r10263 | # GNU General Public License version 2 or any later version. | ||
|
r2311 | |||
|
r27046 | from __future__ import absolute_import | ||
|
r10996 | import os | ||
|
r27046 | |||
|
r27138 | from ..i18n import _ | ||
from .. import ( | ||||
|
r27139 | error, | ||
|
r27138 | util, | ||
) | ||||
|
r27046 | from . import ( | ||
hgweb_mod, | ||||
hgwebdir_mod, | ||||
|
r27138 | server, | ||
|
r27046 | ) | ||
|
r3877 | |||
|
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) | ||||
|
r3877 | |||
|
r10992 | def hgwebdir(config, baseui=None): | ||
return hgwebdir_mod.hgwebdir(config, baseui=baseui) | ||||
|
r3877 | |||
|
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() | ||||
|
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')) | ||||
if repo: | ||||
baseui = repo.baseui | ||||
else: | ||||
baseui = ui | ||||
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 | ||||
baseui.setconfig("web", o, val, 'serve') | ||||
if repo and repo.ui != baseui: | ||||
repo.ui.setconfig("web", o, val, 'serve') | ||||
o = opts.get('web_conf') or opts.get('webdir_conf') | ||||
if not o: | ||||
if not repo: | ||||
raise error.RepoError(_("there is no Mercurial repository" | ||||
" here (.hg not found)")) | ||||
o = repo | ||||
app = hgweb(o, baseui=baseui) | ||||
return httpservice(ui, app, opts) | ||||