##// END OF EJS Templates
absorb: preserve changesets which were already empty...
absorb: preserve changesets which were already empty Most commands in Mercurial (commit, rebase, absorb itself) don’t create empty changesets or drop them if they become empty. If there’s a changeset that’s empty, it must be a deliberate choice of the user. At least it shouldn’t be absorb’s responsibility to prune them. The fact that changesets that became empty during absorb are pruned, is unaffected by this. This case was found while writing patches which make it possible to configure absorb and rebase to not drop empty changesets. Even without having such config set, I think it’s valuable to preserve changesets which were already empty.

File last commit:

r43359:c59eb156 default
r45518:1ca0047f 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)
)