Skip to content

Commit d1dbdef

Browse files
authored
Fix an infinite loop in the solver (#6178)
1 parent 77003f1 commit d1dbdef

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

src/poetry/mixology/version_solver.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -513,11 +513,9 @@ def _get_locked(
513513
locked = self._locked.get(dependency.name, [])
514514
for dependency_package in locked:
515515
package = dependency_package.package
516-
if (allow_similar or dependency.is_same_package_as(package)) and (
517-
dependency.constraint.allows(package.version)
518-
or package.is_prerelease()
519-
and dependency.constraint.allows(package.version.next_patch())
520-
):
516+
if (
517+
allow_similar or dependency.is_same_package_as(package)
518+
) and dependency.constraint.allows(package.version):
521519
return DependencyPackage(dependency, package)
522520
return None
523521

src/poetry/puzzle/provider.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
from poetry.core.packages.directory_dependency import DirectoryDependency
4747
from poetry.core.packages.file_dependency import FileDependency
4848
from poetry.core.packages.package import Package
49-
from poetry.core.packages.specification import PackageSpecification
5049
from poetry.core.packages.url_dependency import URLDependency
5150
from poetry.core.packages.vcs_dependency import VCSDependency
5251
from poetry.core.semver.version_constraint import VersionConstraint
@@ -193,11 +192,11 @@ def validate_package_for_dependency(
193192

194193
def search_for_installed_packages(
195194
self,
196-
specification: PackageSpecification,
195+
dependency: Dependency,
197196
) -> list[Package]:
198197
"""
199-
Search for installed packages, when available, that provides the given
200-
specification.
198+
Search for installed packages, when available, that satisfy the given
199+
dependency.
201200
202201
This is useful when dealing with packages that are under development, not
203202
published on package sources and/or only available via system installations.
@@ -207,17 +206,17 @@ def search_for_installed_packages(
207206

208207
logger.debug(
209208
"Falling back to installed packages to discover metadata for <c2>%s</>",
210-
specification.complete_name,
209+
dependency.complete_name,
211210
)
212211
packages = [
213212
package
214213
for package in self._installed_packages
215-
if package.provides(specification)
214+
if package.satisfies(dependency, ignore_source_type=True)
216215
]
217216
logger.debug(
218217
"Found <c2>%d</> compatible packages for <c2>%s</>",
219218
len(packages),
220-
specification.complete_name,
219+
dependency.complete_name,
221220
)
222221
return packages
223222

tests/puzzle/test_solver.py

+33
Original file line numberDiff line numberDiff line change
@@ -3648,3 +3648,36 @@ def test_solver_incompatible_dependency_with_and_without_extras(
36483648
{"job": "install", "package": foo},
36493649
],
36503650
)
3651+
3652+
3653+
def test_update_with_prerelease_and_no_solution(
3654+
solver: Solver,
3655+
repo: Repository,
3656+
installed: InstalledRepository,
3657+
package: ProjectPackage,
3658+
locked: Repository,
3659+
):
3660+
# Locked and installed: cleo which depends on an old version of crashtest.
3661+
cleo = get_package("cleo", "1.0.0a5")
3662+
crashtest = get_package("crashtest", "0.3.0")
3663+
cleo.add_dependency(Factory.create_dependency("crashtest", {"version": "<0.4.0"}))
3664+
locked.add_package(cleo)
3665+
locked.add_package(crashtest)
3666+
3667+
installed.add_package(cleo)
3668+
installed.add_package(crashtest)
3669+
3670+
# Try to upgrade to a new version of crashtest, this will be disallowed by the
3671+
# dependency from cleo.
3672+
package.add_dependency(Factory.create_dependency("cleo", "^1.0.0a5"))
3673+
package.add_dependency(Factory.create_dependency("crashtest", "^0.4.0"))
3674+
3675+
newer_crashtest = get_package("crashtest", "0.4.0")
3676+
even_newer_crashtest = get_package("crashtest", "0.4.1")
3677+
repo.add_package(cleo)
3678+
repo.add_package(crashtest)
3679+
repo.add_package(newer_crashtest)
3680+
repo.add_package(even_newer_crashtest)
3681+
3682+
with pytest.raises(SolverProblemError):
3683+
solver.solve()

0 commit comments

Comments
 (0)