##// END OF EJS Templates
branchmap-v3: filter topo heads using node for performance reason...
branchmap-v3: filter topo heads using node for performance reason The branchmap currently contains heads as nodeid. If we build a set of revnum with the topological heads, we need to turn the nodeid in the branchmap to revnum to be able to check if they are topo-heads. That nodeid → revnum lookup is "expensive" and adds up to something noticeable if you do it hundreds of thousand of time. Instead we turn all the topo-heads revnums into nodes and build a set. So we can directly test membership of the nodeids stored in the branchmap. That is much faster. Ideally we would have revnum in the branchmap and could directly test revnum against a revnum set and that would be even faster. However that's an adventure for another time. Without this change, the branchmap format "v3" was significantly slower than the "v2" format. With this changes, some of that gap is recovered With rust + persistent nodemap, this overhead was smaller because the extra lookup did not had to to build the nodemap from scratch. In addition the mozilla-unified repository is able to use the "pure_top" mode of branchmap v3, so it was not really affected by this. Future changeset will work of the remaining of the performance gap. ### benchmark.name = hg.command.unbundle # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = disabled # benchmark.variants.resource-usage = default # benchmark.variants.reuse-external-delta-parent = yes # benchmark.variants.revs = any-1-extra-rev # benchmark.variants.source = unbundle # benchmark.variants.validate = default # benchmark.variants.verbosity = quiet ## data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 0.233711 ~~~~~ branch-v3 before: 0.380994 (+63.02%, +0.15) branch-v3 after: 0.368769 (+57.79%, +0.14) # bin-env-vars.hg.flavor = rust branch-v2: 0.235230 ~~~~~ branch-v3 before: 0.385060 (+63.70%, +0.15) branch-v3 after: 0.372460 (+58.34%, +0.14) ## data-env-vars.name = netbeans-2018-08-01-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 0.255586 ~~~~~ branch-v3 before: 0.317524 (+24.23%, +0.06) branch-v3 after: 0.318907 (+24.78%, +0.06) ## data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 0.339010 ~~~~~ branch-v3 before: 0.410007 (+20.94%, +0.07) branch-v3 after: 0.349752 (+3.17%, +0.01) # bin-env-vars.hg.flavor = rust branch-v2: 0.346525 ~~~~~ branch-v3 before: 0.410428 (+18.44%, +0.06) branch-v3 after: 0.354300 (+2.24%, +0.01) ## data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 0.380202 ~~~~~ branch-v3 before: 0.393871 (+3.60%, +0.01) branch-v3 after: 0.396293 (+4.23%, +0.02) ## data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 0.412165 ~~~~~ branch-v3 before: 0.438105 (+6.29%, +0.03) branch-v3 after: 0.424769 (+3.06%, +0.01) # bin-env-vars.hg.flavor = rust branch-v2: 0.412397 ~~~~~ branch-v3 before: 0.438405 (+6.31%, +0.03) branch-v3 after: 0.421796 (+2.28%, +0.01) ## data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 0.429501 ~~~~~ branch-v3 before: 0.452692 (+5.40%, +0.02) branch-v3 after: 0.443849 (+3.34%, +0.01) ## data-env-vars.name = mozilla-try-2024-03-26-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 3.403171 ~~~~~ branch-v3 before: 6.562345 (+92.83%, +3.16) branch-v3 after: 6.234055 (+83.18%, +2.83) # bin-env-vars.hg.flavor = rust branch-v2: 3.454876 ~~~~~ branch-v3 before: 6.160248 (+78.31%, +2.71) branch-v3 after: 6.307813 (+82.58%, +2.85) ## data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 3.465435 ~~~~~ branch-v3 before: 5.381648 (+55.30%, +1.92) branch-v3 after: 5.176076 (+49.36%, +1.71)

File last commit:

r52756:f4733654 default
r52869:41b8892a default
Show More
__init__.py
127 lines | 3.3 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>
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2005 Olivia Mackall <olivia@selenic.com>
Eric Hopper
Moving hgweb.py into it's own module in preparation for breaking it up.
r2311 #
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
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
Yuya Nishihara
hgweb: use absolute_import
r27046
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,
Augie Fackler
hgweb: rewrite most obviously-native-strings to be native strings...
r34705 pycompat,
Yuya Nishihara
procutil: bulk-replace function calls to point to new module
r37138 )
Augie Fackler
formatting: blacken the codebase...
r43346 from ..utils import procutil
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138
Matt Harbison
typing: suppress a few pyi-errors with more recent pytype...
r50284 # pytype: disable=pyi-error
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 Harbison
typing: suppress a few pyi-errors with more recent pytype...
r50284 # pytype: enable=pyi-error
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
hgweb: make hgweb.hgweb a unified interface to hgweb/hgwebdir
r10996 def hgweb(config, name=None, baseui=None):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """create an hgweb wsgi object
Matt Mackall
hgweb: make hgweb.hgweb a unified interface to hgweb/hgwebdir
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
formating: upgrade to black 20.8b1...
r46554 """
Matt Mackall
hgweb: make hgweb.hgweb a unified interface to hgweb/hgwebdir
r10996
Gregory Szorc
py3: use str instead of pycompat.unicode...
r49789 if isinstance(config, str):
Ludovic Chabant
py3: properly reject non-encoded strings given to hgweb
r42395 raise error.ProgrammingError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'Mercurial only supports encoded strings: %r' % config
Augie Fackler
formatting: blacken the codebase...
r43346 )
if (
(isinstance(config, bytes) and not os.path.isdir(config))
or isinstance(config, dict)
or isinstance(config, list)
):
Matt Mackall
hgweb: make hgweb.hgweb a unified interface to hgweb/hgwebdir
r10996 # 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
Augie Fackler
formatting: blacken the codebase...
r43346
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
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class httpservice:
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 def __init__(self, ui, app, opts):
self.ui = ui
self.app = app
self.opts = opts
def init(self):
Yuya Nishihara
procutil: bulk-replace function calls to point to new module
r37138 procutil.setsignalhandler()
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 self.httpd = server.create_server(self.ui, self.app)
Augie Fackler
formatting: blacken the codebase...
r43346 if (
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self.opts[b'port']
Augie Fackler
formatting: blacken the codebase...
r43346 and not self.ui.verbose
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 and not self.opts[b'print_url']
Augie Fackler
formatting: blacken the codebase...
r43346 ):
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 return
if self.httpd.prefix:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 prefix = self.httpd.prefix.strip(b'/') + b'/'
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 prefix = b''
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 port = ':%d' % self.httpd.port
if port == ':80':
port = ''
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138
bindaddr = self.httpd.addr
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 if bindaddr == '0.0.0.0':
bindaddr = '*'
elif ':' in bindaddr: # IPv6
bindaddr = '[%s]' % bindaddr
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138
fqaddr = self.httpd.fqaddr
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 if ':' in fqaddr:
fqaddr = '[%s]' % fqaddr
Nicola Spanti
serve: add option print-url...
r38196
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 url = b'http://%s%s/%s' % (
Augie Fackler
formatting: blacken the codebase...
r43346 pycompat.sysbytes(fqaddr),
pycompat.sysbytes(port),
prefix,
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if self.opts[b'print_url']:
self.ui.write(b'%s\n' % url)
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if self.opts[b'port']:
Nicola Spanti
serve: add option print-url...
r38196 write = self.ui.status
else:
write = self.ui.write
Augie Fackler
formatting: blacken the codebase...
r43346 write(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'listening at %s (bound to %s:%d)\n')
Augie Fackler
formatting: blacken the codebase...
r43346 % (url, pycompat.sysbytes(bindaddr), self.httpd.port)
)
Yuya Nishihara
hgweb: move httpservice object from commands module...
r27138 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
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
hgweb: extract app factory...
r30508 def createapp(baseui, repo, webconf):
Yuya Nishihara
hgweb: eliminate duck-typing to select hgweb or hgwebdir by command option...
r27181 if webconf:
Yuya Nishihara
hgweb: extract app factory...
r30508 return hgwebdir_mod.hgwebdir(webconf, baseui=baseui)
Yuya Nishihara
hgweb: eliminate duck-typing to select hgweb or hgwebdir by command option...
r27181 else:
Yuya Nishihara
hgweb: extract factory function of httpservice object...
r27139 if not repo:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.RepoError(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 _(b"there is no Mercurial repository here (.hg not found)")
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
hgweb: extract app factory...
r30508 return hgweb_mod.hgweb(repo, baseui=baseui)