##// END OF EJS Templates
procutil: make stream detection in make_line_buffered more correct and strict...
procutil: make stream detection in make_line_buffered more correct and strict In make_line_buffered(), we don’t want to wrap the stream if we know that lines get flushed to the underlying raw stream already. Previously, the heuristic was too optimistic. It assumed that any stream which is not an instance of io.BufferedIOBase doesn’t need wrapping. However, there are buffered streams that aren’t instances of io.BufferedIOBase, like Mercurial’s own winstdout. The new logic is different in two ways: First, only for the check, if unwraps any combination of WriteAllWrapper and winstdout. Second, it skips wrapping the stream only if it is an instance of io.RawIOBase (or already wrapped). If it is an instance of io.BufferedIOBase, it gets wrapped. In any other case, the function raises an exception. This ensures that, if an unknown stream is passed or we add another wrapper in the future, we don’t wrap the stream if it’s already line buffered or not wrap the stream if it’s not line buffered. In fact, this was already helpful during development of this change. Without it, I possibly would have forgot that WriteAllWrapper needs to be ignored for the check, leading to unnecessary wrapping if stdout is unbuffered. The alternative would have been to always wrap unknown streams. However, I don’t think that anyone would benefit from being less strict. We can expect streams from the standard library to be subclassing either io.RawIOBase or io.BufferedIOBase, so running Mercurial in the standard way should not regress by this change. Py2exe might replace sys.stdout and sys.stderr, but that currently breaks Mercurial anyway and also these streams don’t claim to be interactive, so this function is not called for them.

File last commit:

r49801:642e31cb default
r50273:094a5fa3 6.2 stable
Show More
transport.py
157 lines | 5.1 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/>.
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):
Kyle Lippincott
black: make codebase compatible with black v21.4b2 and v20.8b1...
r47856 """Create a Subversion authentication baton."""
Daniel Holth
convert extension: stripped-down svn transport module
r4764 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
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class SvnRaTransport:
Daniel Holth
convert extension: stripped-down svn transport module
r4764 """
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'))
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class Reporter:
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)
)