|
|
6d6b84e |
From b1b3a2905e82d535b1ee347d35fa4148bfd3406c Mon Sep 17 00:00:00 2001
|
|
|
6d6b84e |
From: Frost Ming <mianghong@gmail.com>
|
|
|
6d6b84e |
Date: Thu, 23 Dec 2021 10:49:17 +0800
|
|
|
6d6b84e |
Subject: [PATCH 1/4] Fix the index parsing
|
|
|
6d6b84e |
|
|
|
6d6b84e |
---
|
|
|
6d6b84e |
pipenv/core.py | 10 ++++--
|
|
|
6d6b84e |
pipenv/resolver.py | 2 +-
|
|
|
6d6b84e |
pipenv/utils.py | 48 ++++++++++---------------
|
|
|
6d6b84e |
tests/integration/test_install_basic.py | 13 ++++---
|
|
|
6d6b84e |
tests/unit/test_utils.py | 23 ++++++++++++
|
|
|
6d6b84e |
5 files changed, 58 insertions(+), 38 deletions(-)
|
|
|
6d6b84e |
|
|
|
6d6b84e |
diff --git a/pipenv/core.py b/pipenv/core.py
|
|
|
6d6b84e |
index 1fb3e4a..1797acf 100644
|
|
|
6d6b84e |
--- a/pipenv/core.py
|
|
|
6d6b84e |
+++ b/pipenv/core.py
|
|
|
6d6b84e |
@@ -212,9 +212,13 @@ def import_requirements(r=None, dev=False):
|
|
|
6d6b84e |
trusted_hosts = []
|
|
|
6d6b84e |
# Find and add extra indexes.
|
|
|
6d6b84e |
for line in contents.split("\n"):
|
|
|
6d6b84e |
- line_indexes, _trusted_hosts, _ = parse_indexes(line.strip())
|
|
|
6d6b84e |
- indexes.extend(line_indexes)
|
|
|
6d6b84e |
- trusted_hosts.extend(_trusted_hosts)
|
|
|
6d6b84e |
+ index, extra_index, trusted_host, _ = parse_indexes(line.strip(), strict=True)
|
|
|
6d6b84e |
+ if index:
|
|
|
6d6b84e |
+ indexes = [index]
|
|
|
6d6b84e |
+ if extra_index:
|
|
|
6d6b84e |
+ indexes.append(extra_index)
|
|
|
6d6b84e |
+ if trusted_host:
|
|
|
6d6b84e |
+ trusted_hosts.append(trusted_host)
|
|
|
6d6b84e |
indexes = sorted(set(indexes))
|
|
|
6d6b84e |
trusted_hosts = sorted(set(trusted_hosts))
|
|
|
6d6b84e |
reqs = [f for f in parse_requirements(r, session=pip_requests)]
|
|
|
6d6b84e |
diff --git a/pipenv/resolver.py b/pipenv/resolver.py
|
|
|
6d6b84e |
index 80de928..1a77860 100644
|
|
|
6d6b84e |
--- a/pipenv/resolver.py
|
|
|
6d6b84e |
+++ b/pipenv/resolver.py
|
|
|
6d6b84e |
@@ -646,7 +646,7 @@ def parse_packages(packages, pre, clear, system, requirements_dir=None):
|
|
|
6d6b84e |
from pipenv.utils import parse_indexes
|
|
|
6d6b84e |
parsed_packages = []
|
|
|
6d6b84e |
for package in packages:
|
|
|
6d6b84e |
- indexes, trusted_hosts, line = parse_indexes(package)
|
|
|
6d6b84e |
+ _, _, line = parse_indexes(package)
|
|
|
6d6b84e |
line = " ".join(line)
|
|
|
6d6b84e |
pf = dict()
|
|
|
6d6b84e |
req = Requirement.from_line(line)
|
|
|
6d6b84e |
diff --git a/pipenv/utils.py b/pipenv/utils.py
|
|
|
6d6b84e |
index 61e5f68..086b2af 100644
|
|
|
6d6b84e |
--- a/pipenv/utils.py
|
|
|
6d6b84e |
+++ b/pipenv/utils.py
|
|
|
6d6b84e |
@@ -484,10 +484,7 @@ class Resolver(object):
|
|
|
6d6b84e |
if project is None:
|
|
|
6d6b84e |
from .project import Project
|
|
|
6d6b84e |
project = Project()
|
|
|
6d6b84e |
- url = None
|
|
|
6d6b84e |
- indexes, trusted_hosts, remainder = parse_indexes(line)
|
|
|
6d6b84e |
- if indexes:
|
|
|
6d6b84e |
- url = indexes[0]
|
|
|
6d6b84e |
+ index, extra_index, trust_host, remainder = parse_indexes(line)
|
|
|
6d6b84e |
line = " ".join(remainder)
|
|
|
6d6b84e |
req = None # type: Requirement
|
|
|
6d6b84e |
try:
|
|
|
6d6b84e |
@@ -502,10 +499,10 @@ class Resolver(object):
|
|
|
6d6b84e |
raise ResolutionFailure("Failed to resolve requirement from line: {0!s}".format(line))
|
|
|
6d6b84e |
else:
|
|
|
6d6b84e |
raise ResolutionFailure("Failed to resolve requirement from line: {0!s}".format(line))
|
|
|
6d6b84e |
- if url:
|
|
|
6d6b84e |
+ if index:
|
|
|
6d6b84e |
try:
|
|
|
6d6b84e |
index_lookup[req.normalized_name] = project.get_source(
|
|
|
6d6b84e |
- url=url, refresh=True).get("name")
|
|
|
6d6b84e |
+ url=index, refresh=True).get("name")
|
|
|
6d6b84e |
except TypeError:
|
|
|
6d6b84e |
pass
|
|
|
6d6b84e |
try:
|
|
|
6d6b84e |
@@ -519,12 +516,6 @@ class Resolver(object):
|
|
|
6d6b84e |
markers_lookup[req.normalized_name] = req.markers.replace('"', "'")
|
|
|
6d6b84e |
return req, index_lookup, markers_lookup
|
|
|
6d6b84e |
|
|
|
6d6b84e |
- @classmethod
|
|
|
6d6b84e |
- def get_deps_from_line(cls, line):
|
|
|
6d6b84e |
- # type: (str) -> Tuple[Set[str], Dict[str, Dict[str, Union[str, bool, List[str]]]]]
|
|
|
6d6b84e |
- req, _, _ = cls.parse_line(line)
|
|
|
6d6b84e |
- return cls.get_deps_from_req(req)
|
|
|
6d6b84e |
-
|
|
|
6d6b84e |
@classmethod
|
|
|
6d6b84e |
def get_deps_from_req(cls, req, resolver=None):
|
|
|
6d6b84e |
# type: (Requirement, Optional["Resolver"]) -> Tuple[Set[str], Dict[str, Dict[str, Union[str, bool, List[str]]]]]
|
|
|
6d6b84e |
@@ -697,7 +688,7 @@ class Resolver(object):
|
|
|
6d6b84e |
self._pip_command = self._get_pip_command()
|
|
|
6d6b84e |
return self._pip_command
|
|
|
6d6b84e |
|
|
|
6d6b84e |
- def prepare_pip_args(self, use_pep517=False, build_isolation=True):
|
|
|
6d6b84e |
+ def prepare_pip_args(self, use_pep517=None, build_isolation=True):
|
|
|
6d6b84e |
pip_args = []
|
|
|
6d6b84e |
if self.sources:
|
|
|
6d6b84e |
pip_args = prepare_pip_source_args(self.sources, pip_args)
|
|
|
6d6b84e |
@@ -820,7 +811,6 @@ class Resolver(object):
|
|
|
6d6b84e |
from pipenv.patched.piptools.cache import CorruptCacheError
|
|
|
6d6b84e |
from .exceptions import CacheError, ResolutionFailure
|
|
|
6d6b84e |
with temp_environ():
|
|
|
6d6b84e |
- os.environ["PIP_NO_USE_PEP517"] = str("")
|
|
|
6d6b84e |
try:
|
|
|
6d6b84e |
results = self.resolver.resolve(max_rounds=environments.PIPENV_MAX_ROUNDS)
|
|
|
6d6b84e |
except CorruptCacheError as e:
|
|
|
6d6b84e |
@@ -2074,24 +2064,22 @@ def looks_like_dir(path):
|
|
|
6d6b84e |
return any(sep in path for sep in seps)
|
|
|
6d6b84e |
|
|
|
6d6b84e |
|
|
|
6d6b84e |
-def parse_indexes(line):
|
|
|
6d6b84e |
+def parse_indexes(line, strict=False):
|
|
|
6d6b84e |
from argparse import ArgumentParser
|
|
|
6d6b84e |
- parser = ArgumentParser("indexes")
|
|
|
6d6b84e |
- parser.add_argument(
|
|
|
6d6b84e |
- "--index", "-i", "--index-url",
|
|
|
6d6b84e |
- metavar="index_url", action="store", nargs="?",
|
|
|
6d6b84e |
- )
|
|
|
6d6b84e |
- parser.add_argument(
|
|
|
6d6b84e |
- "--extra-index-url", "--extra-index",
|
|
|
6d6b84e |
- metavar="extra_indexes", action="append",
|
|
|
6d6b84e |
- )
|
|
|
6d6b84e |
- parser.add_argument("--trusted-host", metavar="trusted_hosts", action="append")
|
|
|
6d6b84e |
+ line = line.split("#")[0].strip()
|
|
|
6d6b84e |
+ parser = ArgumentParser("indexes", exit_on_error=False)
|
|
|
6d6b84e |
+ parser.add_argument("-i", "--index-url", dest="index")
|
|
|
6d6b84e |
+ parser.add_argument("--extra-index-url", dest="extra_index")
|
|
|
6d6b84e |
+ parser.add_argument("--trusted-host", dest="trusted_host")
|
|
|
6d6b84e |
args, remainder = parser.parse_known_args(line.split())
|
|
|
6d6b84e |
- index = [] if not args.index else [args.index]
|
|
|
6d6b84e |
- extra_indexes = [] if not args.extra_index_url else args.extra_index_url
|
|
|
6d6b84e |
- indexes = index + extra_indexes
|
|
|
6d6b84e |
- trusted_hosts = args.trusted_host if args.trusted_host else []
|
|
|
6d6b84e |
- return indexes, trusted_hosts, remainder
|
|
|
6d6b84e |
+ index = args.index
|
|
|
6d6b84e |
+ extra_index = args.extra_index
|
|
|
6d6b84e |
+ trusted_host = args.trusted_host
|
|
|
6d6b84e |
+ if strict and sum(
|
|
|
6d6b84e |
+ bool(arg) for arg in (index, extra_index, trusted_host, remainder)
|
|
|
6d6b84e |
+ ) > 1:
|
|
|
6d6b84e |
+ raise ValueError("Index arguments must be on their own lines.")
|
|
|
6d6b84e |
+ return index, extra_index, trusted_host, remainder
|
|
|
6d6b84e |
|
|
|
6d6b84e |
|
|
|
6d6b84e |
@contextmanager
|
|
|
6d6b84e |
diff --git a/tests/integration/test_install_basic.py b/tests/integration/test_install_basic.py
|
|
|
6d6b84e |
index f711879..6d70a03 100644
|
|
|
6d6b84e |
--- a/tests/integration/test_install_basic.py
|
|
|
6d6b84e |
+++ b/tests/integration/test_install_basic.py
|
|
|
6d6b84e |
@@ -286,18 +286,23 @@ def test_requirements_to_pipfile(PipenvInstance, pypi):
|
|
|
6d6b84e |
|
|
|
6d6b84e |
# Write a requirements file
|
|
|
6d6b84e |
with open("requirements.txt", "w") as f:
|
|
|
6d6b84e |
- f.write("-i {}\nrequests[socks]==2.19.1\n".format(pypi.url))
|
|
|
6d6b84e |
+ f.write(
|
|
|
6d6b84e |
+ f"-i {pypi.url}\n"
|
|
|
6d6b84e |
+ "# -i https://private.pypi.org/simple\n"
|
|
|
6d6b84e |
+ "requests[socks]==2.19.1\n"
|
|
|
6d6b84e |
+ )
|
|
|
6d6b84e |
|
|
|
6d6b84e |
c = p.pipenv("install")
|
|
|
6d6b84e |
assert c.return_code == 0
|
|
|
6d6b84e |
print(c.out)
|
|
|
6d6b84e |
print(c.err)
|
|
|
6d6b84e |
- print(delegator.run("ls -l").out)
|
|
|
6d6b84e |
-
|
|
|
6d6b84e |
# assert stuff in pipfile
|
|
|
6d6b84e |
assert "requests" in p.pipfile["packages"]
|
|
|
6d6b84e |
assert "extras" in p.pipfile["packages"]["requests"]
|
|
|
6d6b84e |
-
|
|
|
6d6b84e |
+ assert not any(
|
|
|
6d6b84e |
+ source['url'] == 'https://private.pypi.org/simple'
|
|
|
6d6b84e |
+ for source in p.pipfile['source']
|
|
|
6d6b84e |
+ )
|
|
|
6d6b84e |
# assert stuff in lockfile
|
|
|
6d6b84e |
assert "requests" in p.lockfile["default"]
|
|
|
6d6b84e |
assert "chardet" in p.lockfile["default"]
|
|
|
6d6b84e |
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
|
|
|
6d6b84e |
index 24df26a..41d5feb 100644
|
|
|
6d6b84e |
--- a/tests/unit/test_utils.py
|
|
|
6d6b84e |
+++ b/tests/unit/test_utils.py
|
|
|
6d6b84e |
@@ -138,6 +138,29 @@ def test_convert_deps_to_pip_unicode():
|
|
|
6d6b84e |
assert deps[0] == "django==1.10"
|
|
|
6d6b84e |
|
|
|
6d6b84e |
|
|
|
6d6b84e |
+@pytest.mark.parametrize("line,result", [
|
|
|
6d6b84e |
+ ("-i https://example.com/simple/", ("https://example.com/simple/", None, None, [])),
|
|
|
6d6b84e |
+ ("--extra-index-url=https://example.com/simple/", (None, "https://example.com/simple/", None, [])),
|
|
|
6d6b84e |
+ ("--trusted-host=example.com", (None, None, "example.com", [])),
|
|
|
6d6b84e |
+ ("# -i https://example.com/simple/", (None, None, None, [])),
|
|
|
6d6b84e |
+ ("requests", (None, None, None, ["requests"]))
|
|
|
6d6b84e |
+])
|
|
|
6d6b84e |
+@pytest.mark.utils
|
|
|
6d6b84e |
+def test_parse_indexes(line, result):
|
|
|
6d6b84e |
+ assert pipenv.utils.parse_indexes(line) == result
|
|
|
6d6b84e |
+
|
|
|
6d6b84e |
+
|
|
|
6d6b84e |
+@pytest.mark.parametrize("line", [
|
|
|
6d6b84e |
+ "-i https://example.com/simple/ --extra-index-url=https://extra.com/simple/",
|
|
|
6d6b84e |
+ "--extra-index-url https://example.com/simple/ --trusted-host=example.com",
|
|
|
6d6b84e |
+ "requests -i https://example.com/simple/",
|
|
|
6d6b84e |
+])
|
|
|
6d6b84e |
+@pytest.mark.utils
|
|
|
6d6b84e |
+def test_parse_indexes_individual_lines(line):
|
|
|
6d6b84e |
+ with pytest.raises(ValueError):
|
|
|
6d6b84e |
+ pipenv.utils.parse_indexes(line, strict=True)
|
|
|
6d6b84e |
+
|
|
|
6d6b84e |
+
|
|
|
6d6b84e |
class TestUtils:
|
|
|
6d6b84e |
"""Test utility functions in pipenv"""
|
|
|
6d6b84e |
|
|
|
6d6b84e |
--
|
|
|
6d6b84e |
2.33.1
|
|
|
6d6b84e |
|
|
|
6d6b84e |
|
|
|
6d6b84e |
From 4d3d22394c274879f6e6fd39166d60aa71e4a870 Mon Sep 17 00:00:00 2001
|
|
|
6d6b84e |
From: Frost Ming <mianghong@gmail.com>
|
|
|
6d6b84e |
Date: Thu, 23 Dec 2021 11:27:23 +0800
|
|
|
6d6b84e |
Subject: [PATCH 2/4] remove the useless option
|
|
|
6d6b84e |
|
|
|
6d6b84e |
---
|
|
|
6d6b84e |
news/4899.bugfix.rst | 1 +
|
|
|
6d6b84e |
pipenv/utils.py | 2 +-
|
|
|
6d6b84e |
2 files changed, 2 insertions(+), 1 deletion(-)
|
|
|
6d6b84e |
create mode 100644 news/4899.bugfix.rst
|
|
|
6d6b84e |
|
|
|
6d6b84e |
diff --git a/news/4899.bugfix.rst b/news/4899.bugfix.rst
|
|
|
6d6b84e |
new file mode 100644
|
|
|
6d6b84e |
index 0000000..bc61835
|
|
|
6d6b84e |
--- /dev/null
|
|
|
6d6b84e |
+++ b/news/4899.bugfix.rst
|
|
|
6d6b84e |
@@ -0,0 +1 @@
|
|
|
6d6b84e |
+Fix the index parsing to reject illegal requirements.txt.
|
|
|
6d6b84e |
diff --git a/pipenv/utils.py b/pipenv/utils.py
|
|
|
6d6b84e |
index 086b2af..44d7202 100644
|
|
|
6d6b84e |
--- a/pipenv/utils.py
|
|
|
6d6b84e |
+++ b/pipenv/utils.py
|
|
|
6d6b84e |
@@ -2067,7 +2067,7 @@ def looks_like_dir(path):
|
|
|
6d6b84e |
def parse_indexes(line, strict=False):
|
|
|
6d6b84e |
from argparse import ArgumentParser
|
|
|
6d6b84e |
line = line.split("#")[0].strip()
|
|
|
6d6b84e |
- parser = ArgumentParser("indexes", exit_on_error=False)
|
|
|
6d6b84e |
+ parser = ArgumentParser("indexes")
|
|
|
6d6b84e |
parser.add_argument("-i", "--index-url", dest="index")
|
|
|
6d6b84e |
parser.add_argument("--extra-index-url", dest="extra_index")
|
|
|
6d6b84e |
parser.add_argument("--trusted-host", dest="trusted_host")
|
|
|
6d6b84e |
--
|
|
|
6d6b84e |
2.33.1
|
|
|
6d6b84e |
|
|
|
6d6b84e |
|
|
|
6d6b84e |
From 1775fa1b28a478c11923ab57d27889e805ac1f50 Mon Sep 17 00:00:00 2001
|
|
|
6d6b84e |
From: Frost Ming <mianghong@gmail.com>
|
|
|
6d6b84e |
Date: Thu, 23 Dec 2021 12:53:42 +0800
|
|
|
6d6b84e |
Subject: [PATCH 3/4] fix comment ignorance
|
|
|
6d6b84e |
|
|
|
6d6b84e |
---
|
|
|
6d6b84e |
pipenv/utils.py | 4 +++-
|
|
|
6d6b84e |
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
|
6d6b84e |
|
|
|
6d6b84e |
diff --git a/pipenv/utils.py b/pipenv/utils.py
|
|
|
6d6b84e |
index 44d7202..67be2d0 100644
|
|
|
6d6b84e |
--- a/pipenv/utils.py
|
|
|
6d6b84e |
+++ b/pipenv/utils.py
|
|
|
6d6b84e |
@@ -2066,7 +2066,9 @@ def looks_like_dir(path):
|
|
|
6d6b84e |
|
|
|
6d6b84e |
def parse_indexes(line, strict=False):
|
|
|
6d6b84e |
from argparse import ArgumentParser
|
|
|
6d6b84e |
- line = line.split("#")[0].strip()
|
|
|
6d6b84e |
+
|
|
|
6d6b84e |
+ comment_re = re.compile(r"(?:^|\s+)#.*$")
|
|
|
6d6b84e |
+ line = comment_re.sub("", line)
|
|
|
6d6b84e |
parser = ArgumentParser("indexes")
|
|
|
6d6b84e |
parser.add_argument("-i", "--index-url", dest="index")
|
|
|
6d6b84e |
parser.add_argument("--extra-index-url", dest="extra_index")
|
|
|
6d6b84e |
--
|
|
|
6d6b84e |
2.33.1
|
|
|
6d6b84e |
|
|
|
6d6b84e |
|
|
|
6d6b84e |
From 2640cccad9c770255fd529de676b48967faeed90 Mon Sep 17 00:00:00 2001
|
|
|
6d6b84e |
From: Frost Ming <mianghong@gmail.com>
|
|
|
6d6b84e |
Date: Thu, 23 Dec 2021 15:20:11 +0800
|
|
|
6d6b84e |
Subject: [PATCH 4/4] fix pip location
|
|
|
6d6b84e |
|
|
|
6d6b84e |
---
|
|
|
6d6b84e |
pipenv/patched/notpip/_internal/build_env.py | 2 +-
|
|
|
6d6b84e |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
6d6b84e |
|
|
|
6d6b84e |
diff --git a/pipenv/patched/notpip/_internal/build_env.py b/pipenv/patched/notpip/_internal/build_env.py
|
|
|
6d6b84e |
index 71fa326..a4db7f1 100644
|
|
|
6d6b84e |
--- a/pipenv/patched/notpip/_internal/build_env.py
|
|
|
6d6b84e |
+++ b/pipenv/patched/notpip/_internal/build_env.py
|
|
|
6d6b84e |
@@ -15,7 +15,7 @@ from sysconfig import get_paths
|
|
|
6d6b84e |
|
|
|
6d6b84e |
from pipenv.patched.notpip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet
|
|
|
6d6b84e |
|
|
|
6d6b84e |
-from pipenv.patched.notpip import __file__ as pip_location
|
|
|
6d6b84e |
+from pip import __file__ as pip_location
|
|
|
6d6b84e |
from pipenv.patched.notpip._internal.utils.subprocess import call_subprocess
|
|
|
6d6b84e |
from pipenv.patched.notpip._internal.utils.temp_dir import TempDirectory
|
|
|
6d6b84e |
from pipenv.patched.notpip._internal.utils.typing import MYPY_CHECK_RUNNING
|
|
|
6d6b84e |
--
|
|
|
6d6b84e |
2.33.1
|
|
|
6d6b84e |
|