Skip to content

Commit e3502b0

Browse files
committed
Handle package embedding multiple versions of the same package
Fill in missing version comparsion in the necessary places. All the tests involving embedded packages now pass! Signed-off-by: J Robert Ray <[email protected]>
1 parent 2127493 commit e3502b0

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

crates/spk-solve/src/cdcl_solver/spk_provider.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,34 @@ impl DependencyProvider for SpkProvider {
812812
// Also add dependencies on any packages embedded in this
813813
// component.
814814
for embedded in package.embedded().iter() {
815+
// If this embedded package is configured to exist in
816+
// specific components, then skip it if this solvable's
817+
// component is not one of those.
818+
let components_where_this_embedded_package_exists = package
819+
.components()
820+
.iter()
821+
.filter_map(|component_spec| {
822+
if component_spec.embedded.iter().any(|embedded_package| {
823+
embedded_package.pkg.name() == embedded.name()
824+
&& embedded_package
825+
.pkg
826+
.target()
827+
.as_ref()
828+
.map(|version| version == embedded.version())
829+
.unwrap_or(true)
830+
}) {
831+
Some(component_spec.name.clone())
832+
} else {
833+
None
834+
}
835+
})
836+
.collect::<BTreeSet<_>>();
837+
if !components_where_this_embedded_package_exists.is_empty()
838+
&& !components_where_this_embedded_package_exists.contains(actual_component)
839+
{
840+
continue;
841+
}
842+
815843
let dep_name = self.pool.intern_package_name(PkgNameBufWithComponent {
816844
name: embedded.name().to_owned(),
817845
component: located_build_ident_with_component.component.clone(),
@@ -914,6 +942,17 @@ impl DependencyProvider for SpkProvider {
914942
.filter(|embedded_package| {
915943
embedded_package.pkg.name()
916944
== located_build_ident_with_component.ident.name()
945+
&& embedded_package
946+
.pkg
947+
.target()
948+
.as_ref()
949+
.map(|version| {
950+
version
951+
== located_build_ident_with_component
952+
.ident
953+
.version()
954+
})
955+
.unwrap_or(true)
917956
&& embedded_package.components().contains(component)
918957
})
919958
.for_each(|_embedded_package| {

crates/spk-solve/src/solver_test.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2560,10 +2560,7 @@ async fn test_solver_component_embedded_component_requirements(
25602560
#[case::downstream3("downstream3", false)]
25612561
#[tokio::test]
25622562
async fn test_solver_component_embedded_multiple_versions(
2563-
#[values(og_solver()
2564-
// TODO , cdcl_solver()
2565-
)]
2566-
mut solver: SolverImpl,
2563+
#[values(og_solver(), cdcl_solver())] mut solver: SolverImpl,
25672564
#[case] package_to_request: &str,
25682565
#[case] expected_solve_result: bool,
25692566
) {
@@ -2614,14 +2611,17 @@ async fn test_solver_component_embedded_multiple_versions(
26142611
solver.add_repository(repo);
26152612
solver.add_request(request!(package_to_request));
26162613

2617-
match run_and_print_resolve_for_tests(&mut solver).await {
2614+
match run_and_print_resolve_for_tests(&mut solver)
2615+
.await
2616+
.tap_err(|e| eprintln!("{e}"))
2617+
{
26182618
Ok(solution) => {
26192619
assert!(expected_solve_result, "expected solve to fail");
26202620

26212621
assert_resolved!(
26222622
solution,
26232623
"dep-e1",
2624-
build = Build::Embedded(EmbeddedSource::Unknown)
2624+
build =~ Build::Embedded(_)
26252625
);
26262626
}
26272627
Err(_) => {

0 commit comments

Comments
 (0)