##// END OF EJS Templates
pathcopies: give up any optimization based on `introrev`...
pathcopies: give up any optimization based on `introrev` Between 8a0136f69027 and d98fb3f42f33, we sped up the search for the introduction revision during path copies. However, further checking show that finding the introduction revision is still expensive and that we are better off without it. So we simply drop it and only rely on the linkrev optimisation. I ran `perfpathcopies` on 6989 pair of revision in the pypy repository (`hg perfhelper-pathcopies`. The result is massively in favor of dropping this condition. The result of the copy tracing are unchanged. Attempt to use a smaller changes preserving linkrev usage were unsuccessful, it can return wrong result. The following changesets broke test-mv-cp-st-diff.t - if not f.isintroducedafter(limit): + if limit >= 0 and f.linkrev() < limit: return None Here are various numbers (before this changeset/after this changesets) source destination before after saved-time ratio worth cases e66f24650daf 695dfb0f493b 1.062843 1.246369 -0.183526 1.172675 c979853a3b6a 8d60fe293e79 1.036985 1.196414 -0.159429 1.153743 22349fa2fc33 fbb1c9fd86c0 0.879926 1.038682 -0.158756 1.180420 682b98f3e672 a4878080a536 0.909952 1.063801 -0.153849 1.169074 5adabc9b9848 920958a93997 0.993622 1.147452 -0.153830 1.154817 worse 1% dbfbfcf077e9 aea8f2fd3593 1.016595 1.082999 -0.066404 1.065320 worse 5% c95f1ced15f2 7d29d5e39734 0.453694 0.471156 -0.017462 1.038488 worse 10% 3e144ed1d5b7 2aef0e942480 0.035140 0.037535 -0.002395 1.068156 worse 25% 321fc60db035 801748ba582a 0.009267 0.009325 -0.000058 1.006259 median 2088ce763fc2 e6991321d78b 0.000665 0.000651 0.000014 0.978947 best 25% 915631a97de6 385b31354be6 0.040743 0.040363 0.000380 0.990673 best 10% ad495c36a765 19c10384d3e7 0.431658 0.411490 0.020168 0.953278 best 5% d13ae7d283ae 813c99f810ac 1.141404 1.075346 0.066058 0.942126 best 1% 81593cb4a496 99ae11866969 1.833297 0.063823 1.769474 0.034813 best cases c3b14617fbd7 743a0fcaa4eb 1101.811740 2.735970 1099.075770 0.002483 c3b14617fbd7 9ba6ab77fd29 1116.753953 2.800729 1113.953224 0.002508 058b99d6e81f 57e249b7a3ea 1246.128485 3.042762 1243.085723 0.002442 9a8c361aab49 0354a250d371 1253.111894 3.085796 1250.026098 0.002463 442dbbc53c68 3ec1002a818c 1261.786294 3.138607 1258.647687 0.002487 As one can see, the average case is not really impacted. However, the worth case we get after this changeset are much better than the one we had before it. We have 30 pairs where improvements are above 10 minutes. This reflect in the combined time for all pairs before: 26256s after: 1300s (-95%) If we remove these pathological 30 cases, we still see a significant improvements: before: 1631s after: 1245s (-24%)

File last commit:

r43359:c59eb156 default
r43469:c16fe77e default
Show More
transport.py
158 lines | 5.2 KiB | text/x-python | PythonLexer
Daniel Holth
convert extension: stripped-down svn transport module
r4764 # -*- coding: utf-8 -*-
# Copyright (C) 2007 Daniel Holth <dholth@fastmail.fm>
# This is a stripped-down version of the original bzr-svn transport.py,
# Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
Martin Geisler
Remove FSF mailing address from GPL headers...
r15782 # along with this program; if not, see <http://www.gnu.org/licenses/>.
timeless
convert: transport use absolute_import
r28412 from __future__ import absolute_import
Daniel Holth
convert extension: stripped-down svn transport module
r4764
Bryan O'Sullivan
convert/subversion: get converter working against plain HTTP.
r4938 import svn.client
Daniel Holth
convert extension: stripped-down svn transport module
r4764 import svn.core
timeless
convert: transport use absolute_import
r28412 import svn.ra
Pool = svn.core.Pool
SubversionException = svn.core.SubversionException
Daniel Holth
convert extension: stripped-down svn transport module
r4764
Gregory Szorc
py3: manually import getattr where it is needed...
r43359 from mercurial.pycompat import getattr
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial import util
FUJIWARA Katsunori
convert: fix "stdlib import follows local import" problem in transport...
r28461
Thomas Arendsen Hein
removed trailing whitespace
r4957 # Some older versions of the Python bindings need to be
Daniel Holth
convert extension: stripped-down svn transport module
r4764 # explicitly initialized. But what we want to do probably
# won't work worth a darn against those libraries anyway!
svn.ra.initialize()
Durham Goode
convert: move svn config initializer out of the module level...
r29668 svn_config = None
Daniel Holth
convert extension: stripped-down svn transport module
r4764
Augie Fackler
formatting: blacken the codebase...
r43346
Daniel Holth
convert extension: stripped-down svn transport module
r4764 def _create_auth_baton(pool):
"""Create a Subversion authentication baton. """
import svn.client
Augie Fackler
formatting: blacken the codebase...
r43346
Daniel Holth
convert extension: stripped-down svn transport module
r4764 # Give the client context baton a suite of authentication
# providers.h
providers = [
svn.client.get_simple_provider(pool),
svn.client.get_username_provider(pool),
svn.client.get_ssl_client_cert_file_provider(pool),
svn.client.get_ssl_client_cert_pw_file_provider(pool),
svn.client.get_ssl_server_trust_file_provider(pool),
Augie Fackler
formatting: blacken the codebase...
r43346 ]
timeless@mozdev.org
spelling: dependent
r17481 # Platform-dependent authentication methods
Augie Fackler
formatting: blacken the codebase...
r43346 getprovider = getattr(
svn.core, 'svn_auth_get_platform_specific_provider', None
)
Patrick Mezard
convert/svn: support more OS specific auth providers via svn 1.6 API
r8120 if getprovider:
# Available in svn >= 1.6
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 for name in (b'gnome_keyring', b'keychain', b'kwallet', b'windows'):
for type in (b'simple', b'ssl_client_cert_pw', b'ssl_server_trust'):
Patrick Mezard
convert/svn: support more OS specific auth providers via svn 1.6 API
r8120 p = getprovider(name, type, pool)
if p:
providers.append(p)
else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if util.safehasattr(svn.client, b'get_windows_simple_provider'):
Patrick Mezard
convert/svn: support more OS specific auth providers via svn 1.6 API
r8120 providers.append(svn.client.get_windows_simple_provider(pool))
Patrick Mezard
convert: support windows SVN simple auth provider
r5126
Daniel Holth
convert extension: stripped-down svn transport module
r4764 return svn.core.svn_auth_open(providers, pool)
Augie Fackler
formatting: blacken the codebase...
r43346
Daniel Holth
convert extension: stripped-down svn transport module
r4764 class NotBranchError(SubversionException):
pass
Augie Fackler
formatting: blacken the codebase...
r43346
Daniel Holth
convert extension: stripped-down svn transport module
r4764 class SvnRaTransport(object):
"""
Open an ra connection to a Subversion repository.
"""
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 def __init__(self, url=b"", ra=None):
Daniel Holth
convert extension: stripped-down svn transport module
r4764 self.pool = Pool()
self.svn_url = url
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self.username = b''
self.password = b''
Daniel Holth
convert extension: stripped-down svn transport module
r4764
# Only Subversion 1.4 has reparent()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if ra is None or not util.safehasattr(svn.ra, b'reparent'):
Bryan O'Sullivan
convert/subversion: get converter working against plain HTTP.
r4938 self.client = svn.client.create_context(self.pool)
ab = _create_auth_baton(self.pool)
self.client.auth_baton = ab
Durham Goode
convert: move svn config initializer out of the module level...
r29668 global svn_config
if svn_config is None:
svn_config = svn.core.svn_config_get_config(None)
Bryan O'Sullivan
convert/subversion: get converter working against plain HTTP.
r4938 self.client.config = svn_config
Daniel Holth
convert extension: stripped-down svn transport module
r4764 try:
Bryan O'Sullivan
convert/subversion: get converter working against plain HTTP.
r4938 self.ra = svn.client.open_ra_session(
Augie Fackler
formatting: blacken the codebase...
r43346 self.svn_url, self.client, self.pool
)
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except SubversionException as xxx_todo_changeme:
(inst, num) = xxx_todo_changeme.args
Augie Fackler
formatting: blacken the codebase...
r43346 if num in (
svn.core.SVN_ERR_RA_ILLEGAL_URL,
svn.core.SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED,
svn.core.SVN_ERR_BAD_URL,
):
Daniel Holth
convert extension: stripped-down svn transport module
r4764 raise NotBranchError(url)
raise
else:
self.ra = ra
svn.ra.reparent(self.ra, self.svn_url.encode('utf8'))
Benoit Boissinot
use new style classes
r8778 class Reporter(object):
Renato Cunha
convert: tuple parameter unpacking is deprecated in py3k
r11498 def __init__(self, reporter_data):
self._reporter, self._baton = reporter_data
Daniel Holth
convert extension: stripped-down svn transport module
r4764
def set_path(self, path, revnum, start_empty, lock_token, pool=None):
Augie Fackler
formatting: blacken the codebase...
r43346 svn.ra.reporter2_invoke_set_path(
self._reporter,
self._baton,
path,
revnum,
start_empty,
lock_token,
pool,
)
Daniel Holth
convert extension: stripped-down svn transport module
r4764
def delete_path(self, path, pool=None):
Augie Fackler
formatting: blacken the codebase...
r43346 svn.ra.reporter2_invoke_delete_path(
self._reporter, self._baton, path, pool
)
Daniel Holth
convert extension: stripped-down svn transport module
r4764
Augie Fackler
formatting: blacken the codebase...
r43346 def link_path(
self, path, url, revision, start_empty, lock_token, pool=None
):
svn.ra.reporter2_invoke_link_path(
self._reporter,
self._baton,
path,
url,
revision,
start_empty,
lock_token,
pool,
)
Daniel Holth
convert extension: stripped-down svn transport module
r4764
def finish_report(self, pool=None):
Augie Fackler
formatting: blacken the codebase...
r43346 svn.ra.reporter2_invoke_finish_report(
self._reporter, self._baton, pool
)
Daniel Holth
convert extension: stripped-down svn transport module
r4764
def abort_report(self, pool=None):
Augie Fackler
formatting: blacken the codebase...
r43346 svn.ra.reporter2_invoke_abort_report(
self._reporter, self._baton, pool
)
Daniel Holth
convert extension: stripped-down svn transport module
r4764
def do_update(self, revnum, path, *args, **kwargs):
Augie Fackler
formatting: blacken the codebase...
r43346 return self.Reporter(
svn.ra.do_update(self.ra, revnum, path, *args, **kwargs)
)