Commit b2903b83 by Dos Moonen Committed by GitHub

Fix the solver adding a package as a dependency of itself when extras are involved (#5769)

* Add Failing test for #5727

* Fixes #5727

Co-authored-by: Dos Moonen <d.moonen@nki.nl>
parent 87769930
...@@ -164,19 +164,18 @@ class Solver: ...@@ -164,19 +164,18 @@ class Solver:
if package.features: if package.features:
for _package in packages: for _package in packages:
if ( if (
_package.name == package.name not _package.features
and not _package.is_same_package_as(package) and _package.name == package.name
and _package.version == package.version and _package.version == package.version
): ):
for dep in package.requires: for dep in package.requires:
if dep.is_same_package_as(_package): # Prevent adding base package as a dependency to itself
if _package.name == dep.name:
continue continue
if dep not in _package.requires: if dep not in _package.requires:
_package.add_dependency(dep) _package.add_dependency(dep)
else:
continue
final_packages.append(package) final_packages.append(package)
depths.append(results[package]) depths.append(results[package])
......
...@@ -793,6 +793,38 @@ def test_solver_finds_extras_next_to_non_extras( ...@@ -793,6 +793,38 @@ def test_solver_finds_extras_next_to_non_extras(
) )
def test_solver_merge_extras_into_base_package_multiple_repos_fixes_5727(
solver: Solver, repo: Repository, pool: Pool, package: ProjectPackage
):
package.add_dependency(
Factory.create_dependency("A", {"version": "*", "source": "legacy"})
)
package.add_dependency(Factory.create_dependency("B", {"version": "*"}))
package_a = get_package("A", "1.0")
package_a.extras = {"foo": []}
repo.add_package(package_a)
package_b = Package("B", "1.0", source_type="legacy")
package_b.add_dependency(package_a.with_features(["foo"]).to_dependency())
package_a = Package("A", "1.0", source_type="legacy")
package_a.extras = {"foo": []}
repo = Repository("legacy")
repo.add_package(package_a)
repo.add_package(package_b)
pool.add_repository(repo)
transaction = solver.solve()
ops = transaction.calculate_operations(synchronize=True)
assert len(ops[0].package.requires) == 0, "a should not require itself"
def test_solver_returns_prereleases_if_requested( def test_solver_returns_prereleases_if_requested(
solver: Solver, repo: Repository, package: ProjectPackage solver: Solver, repo: Repository, package: ProjectPackage
): ):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment