From b3761f6fabbd4f2aa36342c8f14ee0200dc55151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sat, 9 Jan 2021 15:50:51 +0100 Subject: [PATCH] Remove support for git+git@ pseudo VCS URLs. Now that we don't need to support git@ pseudo-urls, we can simplify the test for valid VCS URLs based on link.is_vcs, which is turns is based on the URL scheme. This also means we fail earlier if a git@ pseudo URL is used. Since VCS requirements are not validated to be URLs in Requirement constructors, we can simplify update_editable. --- news/7554.removal.rst | 2 ++ src/pip/_internal/req/constructors.py | 15 +++--------- src/pip/_internal/req/req_install.py | 31 +++++------------------- src/pip/_internal/vcs/bazaar.py | 2 +- src/pip/_internal/vcs/subversion.py | 4 ++- tests/functional/test_install_vcs_git.py | 5 ++-- 6 files changed, 19 insertions(+), 40 deletions(-) create mode 100644 news/7554.removal.rst diff --git a/news/7554.removal.rst b/news/7554.removal.rst new file mode 100644 index 000000000..d5037d5fd --- /dev/null +++ b/news/7554.removal.rst @@ -0,0 +1,2 @@ +Remove support for VCS pseudo URLs editable requirements. It was emitting +deprecation warning since version 20.0. diff --git a/src/pip/_internal/req/constructors.py b/src/pip/_internal/req/constructors.py index 5a8f0666c..6c223cd79 100644 --- a/src/pip/_internal/req/constructors.py +++ b/src/pip/_internal/req/constructors.py @@ -115,7 +115,9 @@ def parse_editable(editable_req): url = f'{version_control}+{url}' break - if '+' not in url: + link = Link(url) + + if not link.is_vcs: backends = ", ".join([backend.name + '+' for backend in vcs.backends]) raise InstallationError( f'{editable_req} is not a valid editable requirement. ' @@ -123,16 +125,7 @@ def parse_editable(editable_req): f'(beginning with {backends}).' ) - vc_type = url.split('+', 1)[0].lower() - - if not vcs.get_backend(vc_type): - backends = ", ".join([bends.name + '+URL' for bends in vcs.backends]) - error_message = "For --editable={}, " \ - "only {} are currently supported".format( - editable_req, backends) - raise InstallationError(error_message) - - package_name = Link(url).egg_fragment + package_name = link.egg_fragment if not package_name: raise InstallationError( "Could not detect requirement name for '{}', please specify one " diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 11d000df5..6d0aa30b4 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -625,31 +625,12 @@ class InstallRequirement: if self.link.scheme == 'file': # Static paths don't get updated return - assert '+' in self.link.url, \ - "bad url: {self.link.url!r}".format(**locals()) - vc_type, url = self.link.url.split('+', 1) - vcs_backend = vcs.get_backend(vc_type) - if vcs_backend: - if not self.link.is_vcs: - reason = ( - "This form of VCS requirement is being deprecated: {}." - ).format( - self.link.url - ) - replacement = None - if self.link.url.startswith("git+git@"): - replacement = ( - "git+https://git@example.com/..., " - "git+ssh://git@example.com/..., " - "or the insecure git+git://git@example.com/..." - ) - deprecated(reason, replacement, gone_in="21.0", issue=7554) - hidden_url = hide_url(self.link.url) - vcs_backend.obtain(self.source_dir, url=hidden_url) - else: - assert 0, ( - 'Unexpected version control type (in {}): {}'.format( - self.link, vc_type)) + vcs_backend = vcs.get_backend_for_scheme(self.link.scheme) + # Editable requirements are validated in Requirement constructors. + # So here, if it's neither a path nor a valid VCS URL, it's a bug. + assert vcs_backend, f"Unsupported VCS URL {self.link.url}" + hidden_url = hide_url(self.link.url) + vcs_backend.obtain(self.source_dir, url=hidden_url) # Top-level Actions def uninstall(self, auto_confirm=False, verbose=False): diff --git a/src/pip/_internal/vcs/bazaar.py b/src/pip/_internal/vcs/bazaar.py index 3c9c8a479..2e8213499 100644 --- a/src/pip/_internal/vcs/bazaar.py +++ b/src/pip/_internal/vcs/bazaar.py @@ -26,7 +26,7 @@ class Bazaar(VersionControl): repo_name = 'branch' schemes = ( 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', - 'bzr+lp', + 'bzr+lp', 'bzr+file' ) @staticmethod diff --git a/src/pip/_internal/vcs/subversion.py b/src/pip/_internal/vcs/subversion.py index f397c427e..54d616485 100644 --- a/src/pip/_internal/vcs/subversion.py +++ b/src/pip/_internal/vcs/subversion.py @@ -37,7 +37,9 @@ class Subversion(VersionControl): name = 'svn' dirname = '.svn' repo_name = 'checkout' - schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + schemes = ( + 'svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn', 'svn+file' + ) @classmethod def should_add_vcs_url_prefix(cls, remote_url): diff --git a/tests/functional/test_install_vcs_git.py b/tests/functional/test_install_vcs_git.py index 4c26d8e88..afd6ffae0 100644 --- a/tests/functional/test_install_vcs_git.py +++ b/tests/functional/test_install_vcs_git.py @@ -1,5 +1,6 @@ import pytest +from pip._internal.utils.urls import path_to_url from tests.lib import pyversion # noqa: F401 from tests.lib import ( _change_test_package_version, @@ -454,7 +455,7 @@ def test_check_submodule_addition(script): ) install_result = script.pip( - 'install', '-e', 'git+' + module_path + '#egg=version_pkg' + 'install', '-e', 'git+' + path_to_url(module_path) + '#egg=version_pkg' ) install_result.did_create( script.venv / 'src/version-pkg/testpkg/static/testfile' @@ -467,7 +468,7 @@ def test_check_submodule_addition(script): # expect error because git may write to stderr update_result = script.pip( - 'install', '-e', 'git+' + module_path + '#egg=version_pkg', + 'install', '-e', 'git+' + path_to_url(module_path) + '#egg=version_pkg', '--upgrade', ) -- GitLab