##// END OF EJS Templates
perf: import newer modules separately for earlier Mercurial...
perf: import newer modules separately for earlier Mercurial demandimport of early Mercurial loads an imported module immediately, if a module is imported absolutely by "from a import b" style. Recent perf.py satisfies this condition, because it does: - have "from __future__ import absolute_import" line - use "from a import b" style for modules in "mercurial" package Before this patch, importing modules below prevents perf.py from being loaded by earlier Mercurial, because these aren't available in such Mercurial, even though there are some code paths for Mercurial earlier than 1.9. - branchmap 2.5 (or bcee63733aad) - repoview 2.5 (or 3a6ddacb7198) - obsolete 2.3 (or ad0d6c2b3279) - scmutil 1.9 (or 8b252e826c68) For example, setting "_prereadsize" attribute in perfindex() and perfnodelookup() is effective only with Mercurial earlier than 1.8 (or 61c9bc3da402). After this patch, "mercurial.error" is the only blocker in "from mercurial import" statement for loading perf.py with Mercurial earlier than 1.2. This patch ignores it, because just importing it separately isn't enough.

File last commit:

r27184:64187e9a default
r29567:7e2b3894 default
Show More
__init__.py
125 lines | 3.6 KiB | text/x-python | PythonLexer
Eric Hopper
Fixing up comment headers for split up code.
r2391 # hgweb/__init__.py - web interface to a mercurial repository
Eric Hopper
Moving hgweb.py into it's own module in preparation for breaking it up.
r2311 #
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
# Copyright 2005 Matt Mackall <mpm@selenic.com>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Eric Hopper
Moving hgweb.py into it's own module in preparation for breaking it up.
r2311
Yuya Nishihara
hgweb: use absolute_import
r27046 from __future__ import absolute_import
Matt Mackall
hgweb: make hgweb.hgweb a unified interface to hgweb/hgwebdir
r10996 import os
Yuya Nishihara
hgweb: use absolute_import
r27046
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 from ..i18n import _
from .. import (
Yuya Nishihara
hgweb: extract factory function of httpservice object...
r27139 error,
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 util,
)
Yuya Nishihara
hgweb: use absolute_import
r27046 from . import (
hgweb_mod,
hgwebdir_mod,
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 server,
Yuya Nishihara
hgweb: use absolute_import
r27046 )
Matt Mackall
Replace demandload with new demandimport
r3877
Matt Mackall
hgweb: make hgweb.hgweb a unified interface to hgweb/hgwebdir
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
Replace demandload with new demandimport
r3877
Matt Mackall
hgweb: make top-level prototypes mirror their callees
r10992 def hgwebdir(config, baseui=None):
return hgwebdir_mod.hgwebdir(config, baseui=baseui)
Matt Mackall
Replace demandload with new demandimport
r3877
Yuya Nishihara
hgweb: move httpservice object from commands module...
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
hgweb: extract factory function of httpservice object...
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
hgweb: make sure command options are set to all ui objects...
r27182 alluis = set([ui])
Yuya Nishihara
hgweb: extract factory function of httpservice object...
r27139 if repo:
baseui = repo.baseui
Yuya Nishihara
hgweb: make sure command options are set to all ui objects...
r27182 alluis.update([repo.baseui, repo.ui])
Yuya Nishihara
hgweb: extract factory function of httpservice object...
r27139 else:
baseui = ui
Yuya Nishihara
hgweb: load server settings from --web-conf (issue4699)...
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
hgweb: extract factory function of httpservice object...
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
hgweb: make sure command options are set to all ui objects...
r27182 for u in alluis:
u.setconfig("web", o, val, 'serve')
Yuya Nishihara
hgweb: extract factory function of httpservice object...
r27139
Yuya Nishihara
hgweb: eliminate duck-typing to select hgweb or hgwebdir by command option...
r27181 if webconf:
app = hgwebdir_mod.hgwebdir(webconf, baseui=baseui)
else:
Yuya Nishihara
hgweb: extract factory function of httpservice object...
r27139 if not repo:
raise error.RepoError(_("there is no Mercurial repository"
" here (.hg not found)"))
Yuya Nishihara
hgweb: eliminate duck-typing to select hgweb or hgwebdir by command option...
r27181 app = hgweb_mod.hgweb(repo, baseui=baseui)
Yuya Nishihara
hgweb: load server settings from --web-conf (issue4699)...
r27184 return httpservice(servui, app, opts)