__init__.py
127 lines
| 3.3 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> | ||||
Raphaël Gomès
|
r47575 | # Copyright 2005 Olivia Mackall <olivia@selenic.com> | ||
Eric Hopper
|
r2311 | # | ||
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 | |||
Matt Harbison
|
r52756 | from __future__ import annotations | ||
Yuya Nishihara
|
r27046 | |||
Matt Mackall
|
r10996 | import os | ||
Yuya Nishihara
|
r27046 | |||
Yuya Nishihara
|
r27138 | from ..i18n import _ | ||
from .. import ( | ||||
Yuya Nishihara
|
r27139 | error, | ||
Augie Fackler
|
r34705 | pycompat, | ||
Yuya Nishihara
|
r37138 | ) | ||
Augie Fackler
|
r43346 | from ..utils import procutil | ||
Yuya Nishihara
|
r27138 | |||
Matt Harbison
|
r50284 | # pytype: disable=pyi-error | ||
Yuya Nishihara
|
r27046 | from . import ( | ||
hgweb_mod, | ||||
hgwebdir_mod, | ||||
Yuya Nishihara
|
r27138 | server, | ||
Yuya Nishihara
|
r27046 | ) | ||
Matt Mackall
|
r3877 | |||
Matt Harbison
|
r50284 | # pytype: enable=pyi-error | ||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r10996 | def hgweb(config, name=None, baseui=None): | ||
Augie Fackler
|
r46554 | """create an hgweb wsgi object | ||
Matt Mackall
|
r10996 | |||
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) | ||||
Augie Fackler
|
r46554 | """ | ||
Matt Mackall
|
r10996 | |||
Gregory Szorc
|
r49789 | if isinstance(config, str): | ||
Ludovic Chabant
|
r42395 | raise error.ProgrammingError( | ||
Augie Fackler
|
r43347 | b'Mercurial only supports encoded strings: %r' % config | ||
Augie Fackler
|
r43346 | ) | ||
if ( | ||||
(isinstance(config, bytes) and not os.path.isdir(config)) | ||||
or isinstance(config, dict) | ||||
or isinstance(config, list) | ||||
): | ||||
Matt Mackall
|
r10996 | # create a multi-dir interface | ||
return hgwebdir_mod.hgwebdir(config, baseui=baseui) | ||||
return hgweb_mod.hgweb(config, name=name, baseui=baseui) | ||||
Matt Mackall
|
r3877 | |||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r10992 | def hgwebdir(config, baseui=None): | ||
return hgwebdir_mod.hgwebdir(config, baseui=baseui) | ||||
Matt Mackall
|
r3877 | |||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r49801 | class httpservice: | ||
Yuya Nishihara
|
r27138 | def __init__(self, ui, app, opts): | ||
self.ui = ui | ||||
self.app = app | ||||
self.opts = opts | ||||
def init(self): | ||||
Yuya Nishihara
|
r37138 | procutil.setsignalhandler() | ||
Yuya Nishihara
|
r27138 | self.httpd = server.create_server(self.ui, self.app) | ||
Augie Fackler
|
r43346 | if ( | ||
Augie Fackler
|
r43347 | self.opts[b'port'] | ||
Augie Fackler
|
r43346 | and not self.ui.verbose | ||
Augie Fackler
|
r43347 | and not self.opts[b'print_url'] | ||
Augie Fackler
|
r43346 | ): | ||
Yuya Nishihara
|
r27138 | return | ||
if self.httpd.prefix: | ||||
Augie Fackler
|
r43347 | prefix = self.httpd.prefix.strip(b'/') + b'/' | ||
Yuya Nishihara
|
r27138 | else: | ||
Augie Fackler
|
r43347 | prefix = b'' | ||
Yuya Nishihara
|
r27138 | |||
Augie Fackler
|
r43906 | port = ':%d' % self.httpd.port | ||
if port == ':80': | ||||
port = '' | ||||
Yuya Nishihara
|
r27138 | |||
bindaddr = self.httpd.addr | ||||
Augie Fackler
|
r43906 | if bindaddr == '0.0.0.0': | ||
bindaddr = '*' | ||||
elif ':' in bindaddr: # IPv6 | ||||
bindaddr = '[%s]' % bindaddr | ||||
Yuya Nishihara
|
r27138 | |||
fqaddr = self.httpd.fqaddr | ||||
Augie Fackler
|
r43906 | if ':' in fqaddr: | ||
fqaddr = '[%s]' % fqaddr | ||||
Nicola Spanti
|
r38196 | |||
Augie Fackler
|
r43347 | url = b'http://%s%s/%s' % ( | ||
Augie Fackler
|
r43346 | pycompat.sysbytes(fqaddr), | ||
pycompat.sysbytes(port), | ||||
prefix, | ||||
) | ||||
Augie Fackler
|
r43347 | if self.opts[b'print_url']: | ||
self.ui.write(b'%s\n' % url) | ||||
Yuya Nishihara
|
r27138 | else: | ||
Augie Fackler
|
r43347 | if self.opts[b'port']: | ||
Nicola Spanti
|
r38196 | write = self.ui.status | ||
else: | ||||
write = self.ui.write | ||||
Augie Fackler
|
r43346 | write( | ||
Augie Fackler
|
r43347 | _(b'listening at %s (bound to %s:%d)\n') | ||
Augie Fackler
|
r43346 | % (url, pycompat.sysbytes(bindaddr), self.httpd.port) | ||
) | ||||
Yuya Nishihara
|
r27138 | self.ui.flush() # avoid buffering of status message | ||
def run(self): | ||||
self.httpd.serve_forever() | ||||
Yuya Nishihara
|
r27139 | |||
Augie Fackler
|
r43346 | |||
Yuya Nishihara
|
r30508 | def createapp(baseui, repo, webconf): | ||
Yuya Nishihara
|
r27181 | if webconf: | ||
Yuya Nishihara
|
r30508 | return hgwebdir_mod.hgwebdir(webconf, baseui=baseui) | ||
Yuya Nishihara
|
r27181 | else: | ||
Yuya Nishihara
|
r27139 | if not repo: | ||
Augie Fackler
|
r43346 | raise error.RepoError( | ||
Martin von Zweigbergk
|
r43387 | _(b"there is no Mercurial repository here (.hg not found)") | ||
Augie Fackler
|
r43346 | ) | ||
Yuya Nishihara
|
r30508 | return hgweb_mod.hgweb(repo, baseui=baseui) | ||