Skip to content

Commit 4d54fa7

Browse files
committed
Extract _resolve_vcs for resolving a VCS from a URL.
1 parent 7c1c29b commit 4d54fa7

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

setuptools/package_index.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""PyPI and direct package downloading."""
22

3+
import contextlib
34
import sys
45
import os
56
import re
@@ -587,7 +588,7 @@ def download(self, spec, tmpdir):
587588
scheme = URL_SCHEME(spec)
588589
if scheme:
589590
# It's a url, download it to tmpdir
590-
found = self._download_url(scheme.group(1), spec, tmpdir)
591+
found = self._download_url(spec, tmpdir)
591592
base, fragment = egg_info_for_url(spec)
592593
if base.endswith('.py'):
593594
found = self.gen_setup(found, fragment, tmpdir)
@@ -816,7 +817,7 @@ def open_url(self, url, warning=None): # noqa: C901 # is too complex (12)
816817
else:
817818
raise DistutilsError("Download error for %s: %s" % (url, v)) from v
818819

819-
def _download_url(self, scheme, url, tmpdir):
820+
def _download_url(self, url, tmpdir):
820821
# Determine download filename
821822
#
822823
name, fragment = egg_info_for_url(url)
@@ -833,14 +834,29 @@ def _download_url(self, scheme, url, tmpdir):
833834

834835
return self._download_vcs(url, filename) or self._download_other(url, filename)
835836

836-
def _download_vcs(self, url, filename):
837+
@staticmethod
838+
def _resolve_vcs(url):
839+
"""
840+
>>> rvcs = PackageIndex._resolve_vcs
841+
>>> rvcs('git+http://foo/bar')
842+
'git'
843+
>>> rvcs('hg+https://foo/bar')
844+
'hg'
845+
>>> rvcs('git:myhost')
846+
'git'
847+
>>> rvcs('hg:myhost')
848+
>>> rvcs('http://foo/bar')
849+
"""
837850
scheme = urllib.parse.urlsplit(url).scheme
838-
if scheme == 'svn' or scheme.startswith('svn+'):
839-
return self._download_svn(url, filename)
840-
elif scheme == 'git' or scheme.startswith('git+'):
841-
return self._download_git(url, filename)
842-
elif scheme.startswith('hg+'):
843-
return self._download_hg(url, filename)
851+
pre, sep, post = scheme.partition('+')
852+
# svn and git have their own protocol; hg does not
853+
allowed = set(['svn', 'git'] + ['hg'] * bool(sep))
854+
return next(iter({pre} & allowed), None)
855+
856+
def _download_vcs(self, url, filename):
857+
vcs = self._resolve_vcs(url)
858+
with contextlib.suppress(AttributeError):
859+
return getattr(self, f'_download_{vcs}')(url, filename)
844860

845861
def _download_other(self, url, filename):
846862
scheme = urllib.parse.urlsplit(url).scheme

0 commit comments

Comments
 (0)