Skip to content

Commit

Permalink
Merge pull request #11085 from pypa/revert-10962-fix-hashes
Browse files Browse the repository at this point in the history
  • Loading branch information
pradyunsg committed May 9, 2022
2 parents cf3696a + 6ad9a21 commit cb24fb4
Show file tree
Hide file tree
Showing 6 changed files with 16 additions and 56 deletions.
1 change: 1 addition & 0 deletions news/10962.bugfix.rst
@@ -0,0 +1 @@
Revert `#9243 <https://github.com/pypa/pip/issues/9243>`_ since it introduced a regression in certain edge cases.
5 changes: 3 additions & 2 deletions src/pip/_internal/req/req_install.py
Expand Up @@ -53,7 +53,7 @@
hide_url,
redact_auth_from_url,
)
from pip._internal.utils.packaging import is_pinned, safe_extra
from pip._internal.utils.packaging import safe_extra
from pip._internal.utils.subprocess import runner_with_spinner_message
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
from pip._internal.utils.virtualenv import running_under_virtualenv
Expand Down Expand Up @@ -241,7 +241,8 @@ def is_pinned(self) -> bool:
For example, some-package==1.2 is pinned; some-package>1.2 is not.
"""
return is_pinned(self.specifier)
specifiers = self.specifier
return len(specifiers) == 1 and next(iter(specifiers)).operator in {"==", "==="}

def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> bool:
if not extras_requested:
Expand Down
18 changes: 12 additions & 6 deletions src/pip/_internal/resolution/resolvelib/factory.py
Expand Up @@ -45,7 +45,7 @@
from pip._internal.resolution.base import InstallRequirementProvider
from pip._internal.utils.compatibility_tags import get_supported
from pip._internal.utils.hashes import Hashes
from pip._internal.utils.packaging import get_requirement, is_pinned
from pip._internal.utils.packaging import get_requirement
from pip._internal.utils.virtualenv import running_under_virtualenv

from .base import Candidate, CandidateVersion, Constraint, Requirement
Expand Down Expand Up @@ -303,12 +303,18 @@ def iter_index_candidate_infos() -> Iterator[IndexCandidateInfo]:
# solely satisfied by a yanked release.
all_yanked = all(ican.link.is_yanked for ican in icans)

pinned = is_pinned(specifier)
def is_pinned(specifier: SpecifierSet) -> bool:
for sp in specifier:
if sp.operator == "===":
return True
if sp.operator != "==":
continue
if sp.version.endswith(".*"):
continue
return True
return False

if not template.is_pinned:
assert template.req, "Candidates found on index must be PEP 508"
template.req.specifier = specifier
template.hash_options = hashes.allowed
pinned = is_pinned(specifier)

# PackageFinder returns earlier versions first, so we reverse.
for ican in reversed(icans):
Expand Down
4 changes: 0 additions & 4 deletions src/pip/_internal/utils/hashes.py
Expand Up @@ -63,10 +63,6 @@ def __and__(self, other: "Hashes") -> "Hashes":
def digest_count(self) -> int:
return sum(len(digests) for digests in self._allowed.values())

@property
def allowed(self) -> Dict[str, List[str]]:
return self._allowed

def is_hash_allowed(self, hash_name: str, hex_digest: str) -> bool:
"""Return whether the given hex digest is allowed."""
return hex_digest in self._allowed.get(hash_name, [])
Expand Down
13 changes: 0 additions & 13 deletions src/pip/_internal/utils/packaging.py
Expand Up @@ -5,7 +5,6 @@

from pip._vendor.packaging import specifiers, version
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.specifiers import SpecifierSet

NormalizedExtra = NewType("NormalizedExtra", str)

Expand Down Expand Up @@ -56,15 +55,3 @@ def safe_extra(extra: str) -> NormalizedExtra:
the same to either ``canonicalize_name`` or ``_egg_link_name``.
"""
return cast(NormalizedExtra, re.sub("[^A-Za-z0-9.-]+", "_", extra).lower())


def is_pinned(specifier: SpecifierSet) -> bool:
for sp in specifier:
if sp.operator == "===":
return True
if sp.operator != "==":
continue
if sp.version.endswith(".*"):
continue
return True
return False
31 changes: 0 additions & 31 deletions tests/functional/test_new_resolver_hashes.py
Expand Up @@ -373,34 +373,3 @@ def test_new_resolver_hash_with_extras(script: PipTestEnvironment) -> None:
child="0.1.0",
extra="0.1.0",
)


def test_new_resolver_hash_with_pin(script: PipTestEnvironment) -> None:
find_links = _create_find_links(script)

requirements_txt = script.scratch_path / "requirements.txt"
requirements_txt.write_text("base")

constraints_txt = script.scratch_path / "constraints.txt"
constraints_txt.write_text(
"""
base==0.1.0 --hash=sha256:{sdist_hash} --hash=sha256:{wheel_hash}
""".format(
sdist_hash=find_links.sdist_hash,
wheel_hash=find_links.wheel_hash,
)
)

script.pip(
"install",
"--no-cache-dir",
"--no-index",
"--find-links",
find_links.index_html,
"--requirement",
requirements_txt,
"--constraint",
constraints_txt,
)

script.assert_installed(base="0.1.0")

0 comments on commit cb24fb4

Please sign in to comment.