Skip to content

Commit 22cc32d

Browse files
committed
Also handle InvalidVersion
1 parent 968a190 commit 22cc32d

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

src/pip/_internal/exceptions.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@
1515
from itertools import chain, groupby, repeat
1616
from typing import TYPE_CHECKING, Dict, Iterator, List, Literal, Optional, Union
1717

18+
from pip._vendor.packaging.requirements import InvalidRequirement
19+
from pip._vendor.packaging.version import InvalidVersion
1820
from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult
1921
from pip._vendor.rich.markup import escape
2022
from pip._vendor.rich.text import Text
2123

2224
if TYPE_CHECKING:
2325
from hashlib import _Hash
2426

25-
from pip._vendor.packaging.requirements import InvalidRequirement
2627
from pip._vendor.requests.models import Request, Response
2728

2829
from pip._internal.metadata import BaseDistribution
2930
from pip._internal.req.req_install import InstallRequirement
30-
from pip._internal.resolution.resolvelib.candidates import AlreadyInstalledCandidate
3131

3232
logger = logging.getLogger(__name__)
3333

@@ -785,19 +785,25 @@ class InvalidInstalledPackage(DiagnosticPipError):
785785
def __init__(
786786
self,
787787
*,
788-
package: "AlreadyInstalledCandidate",
789-
invalid_req_exc: "InvalidRequirement",
788+
dist: "BaseDistribution",
789+
invalid_exc: Union[InvalidRequirement, InvalidVersion],
790790
) -> None:
791-
installed_location = package.dist.installed_location
791+
installed_location = dist.installed_location
792+
793+
if isinstance(invalid_exc, InvalidRequirement):
794+
invalid_type = "requirement"
795+
else:
796+
invalid_type = "version"
797+
792798
super().__init__(
793799
message=Text(
794-
f"Cannot process installed package {package} "
800+
f"Cannot process installed package {dist} "
795801
+ (f"in {installed_location!r} " if installed_location else "")
796-
+ f"because it has an invalid requirement:\n{invalid_req_exc.args[0]}"
802+
+ f"because it has an invalid {invalid_type}:\n{invalid_exc.args[0]}"
797803
),
798804
context=(
799805
"Starting with pip 24.1, packages with invalid "
800-
"requirements can not be processed."
806+
f"{invalid_type}s can not be processed."
801807
),
802808
hint_stmt=(
803809
"To proceed this package must be uninstalled using 'pip<24.1', "

src/pip/_internal/resolution/resolvelib/candidates.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requiremen
404404
for r in self.dist.iter_dependencies():
405405
yield from self._factory.make_requirements_from_spec(str(r), self._ireq)
406406
except InvalidRequirement as exc:
407-
raise InvalidInstalledPackage(package=self, invalid_req_exc=exc) from None
407+
raise InvalidInstalledPackage(dist=self.dist, invalid_exc=exc) from None
408408

409409
def get_install_requirement(self) -> Optional[InstallRequirement]:
410410
return None

src/pip/_internal/resolution/resolvelib/factory.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@
2323
from pip._vendor.packaging.requirements import InvalidRequirement
2424
from pip._vendor.packaging.specifiers import SpecifierSet
2525
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
26-
from pip._vendor.packaging.version import Version
26+
from pip._vendor.packaging.version import InvalidVersion, Version
2727
from pip._vendor.resolvelib import ResolutionImpossible
2828

2929
from pip._internal.cache import CacheEntry, WheelCache
3030
from pip._internal.exceptions import (
3131
DistributionNotFound,
3232
InstallationError,
33+
InvalidInstalledPackage,
3334
MetadataInconsistent,
3435
MetadataInvalid,
3536
UnsupportedPythonVersion,
@@ -283,10 +284,15 @@ def _get_installed_candidate() -> Optional[Candidate]:
283284
installed_dist = self._installed_dists[name]
284285
except KeyError:
285286
return None
286-
# Don't use the installed distribution if its version does not fit
287-
# the current dependency graph.
288-
if not specifier.contains(installed_dist.version, prereleases=True):
289-
return None
287+
288+
try:
289+
# Don't use the installed distribution if its version
290+
# does not fit the current dependency graph.
291+
if not specifier.contains(installed_dist.version, prereleases=True):
292+
return None
293+
except InvalidVersion as e:
294+
raise InvalidInstalledPackage(dist=installed_dist, invalid_exc=e)
295+
290296
candidate = self._make_candidate_from_dist(
291297
dist=installed_dist,
292298
extras=extras,

0 commit comments

Comments
 (0)