Fix fetching for Python 3.9.6 (#24686)
When using Python 3.9.6, Spack is no longer able to fetch anything. Commands like `spack fetch` and `spack install` all break. Python 3.9.6 includes a [new change](https://github.com/python/cpython/pull/25853/files#diff-b3712475a413ec972134c0260c8f1eb1deefb66184f740ef00c37b4487ef873eR462) that means that `scheme` must be a string, it cannot be None. The solution is to use an empty string like the method default. Fixes #24644. Also see https://github.com/Homebrew/homebrew-core/pull/80175 where this issue was discovered by CI. Thanks @branchvincent for reporting such a serious issue before any actual users encountered it! Co-authored-by: Todd Gamblin <tgamblin@llnl.gov>
This commit is contained in:
parent
e568564e2f
commit
3b94e22ad4
@ -11,8 +11,8 @@
|
|||||||
import os.path
|
import os.path
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from six import string_types
|
|
||||||
import six.moves.urllib.parse as urllib_parse
|
import six.moves.urllib.parse as urllib_parse
|
||||||
|
from six import string_types
|
||||||
|
|
||||||
import spack.util.path
|
import spack.util.path
|
||||||
|
|
||||||
@ -151,21 +151,21 @@ def join(base_url, path, *extra, **kwargs):
|
|||||||
for x in itertools.chain((base_url, path), extra)]
|
for x in itertools.chain((base_url, path), extra)]
|
||||||
n = len(paths)
|
n = len(paths)
|
||||||
last_abs_component = None
|
last_abs_component = None
|
||||||
scheme = None
|
scheme = ''
|
||||||
for i in range(n - 1, -1, -1):
|
for i in range(n - 1, -1, -1):
|
||||||
obj = urllib_parse.urlparse(
|
obj = urllib_parse.urlparse(
|
||||||
paths[i], scheme=None, allow_fragments=False)
|
paths[i], scheme='', allow_fragments=False)
|
||||||
|
|
||||||
scheme = obj.scheme
|
scheme = obj.scheme
|
||||||
|
|
||||||
# in either case the component is absolute
|
# in either case the component is absolute
|
||||||
if scheme is not None or obj.path.startswith('/'):
|
if scheme or obj.path.startswith('/'):
|
||||||
if scheme is None:
|
if not scheme:
|
||||||
# Without a scheme, we have to go back looking for the
|
# Without a scheme, we have to go back looking for the
|
||||||
# next-last component that specifies a scheme.
|
# next-last component that specifies a scheme.
|
||||||
for j in range(i - 1, -1, -1):
|
for j in range(i - 1, -1, -1):
|
||||||
obj = urllib_parse.urlparse(
|
obj = urllib_parse.urlparse(
|
||||||
paths[j], scheme=None, allow_fragments=False)
|
paths[j], scheme='', allow_fragments=False)
|
||||||
|
|
||||||
if obj.scheme:
|
if obj.scheme:
|
||||||
paths[i] = '{SM}://{NL}{PATH}'.format(
|
paths[i] = '{SM}://{NL}{PATH}'.format(
|
||||||
|
Loading…
Reference in New Issue
Block a user