1
1
"""PyPI and direct package downloading."""
2
2
3
+ import contextlib
3
4
import sys
4
5
import os
5
6
import re
@@ -587,7 +588,7 @@ def download(self, spec, tmpdir):
587
588
scheme = URL_SCHEME (spec )
588
589
if scheme :
589
590
# 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 )
591
592
base , fragment = egg_info_for_url (spec )
592
593
if base .endswith ('.py' ):
593
594
found = self .gen_setup (found , fragment , tmpdir )
@@ -816,7 +817,7 @@ def open_url(self, url, warning=None): # noqa: C901 # is too complex (12)
816
817
else :
817
818
raise DistutilsError ("Download error for %s: %s" % (url , v )) from v
818
819
819
- def _download_url (self , scheme , url , tmpdir ):
820
+ def _download_url (self , url , tmpdir ):
820
821
# Determine download filename
821
822
#
822
823
name , fragment = egg_info_for_url (url )
@@ -833,14 +834,29 @@ def _download_url(self, scheme, url, tmpdir):
833
834
834
835
return self ._download_vcs (url , filename ) or self ._download_other (url , filename )
835
836
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
+ """
837
850
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 )
844
860
845
861
def _download_other (self , url , filename ):
846
862
scheme = urllib .parse .urlsplit (url ).scheme
0 commit comments