Skip to content

Commit 2127493

Browse files
committed
Handle requirements of components in embedded packages
This is the test that would run up against that `todo!`. Signed-off-by: J Robert Ray <[email protected]>
1 parent 228bdba commit 2127493

File tree

2 files changed

+92
-92
lines changed

2 files changed

+92
-92
lines changed

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

Lines changed: 87 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,86 @@ impl SpkProvider {
168168
self.cancel_solving.get()
169169
}
170170

171+
fn request_to_known_dependencies(&self, requirement: &Request) -> KnownDependencies {
172+
let mut known_deps = KnownDependencies::default();
173+
match requirement {
174+
Request::Pkg(pkg_request) => {
175+
let kd = self.pkg_request_to_known_dependencies(pkg_request);
176+
known_deps.requirements.extend(kd.requirements);
177+
known_deps.constrains.extend(kd.constrains);
178+
}
179+
Request::Var(var_request) => {
180+
match &var_request.value {
181+
spk_schema::ident::PinnableValue::FromBuildEnv => todo!(),
182+
spk_schema::ident::PinnableValue::FromBuildEnvIfPresent => todo!(),
183+
spk_schema::ident::PinnableValue::Pinned(value) => {
184+
let dep_name = match var_request.var.namespace() {
185+
Some(pkg_name) => {
186+
self.pool.intern_package_name(PkgNameBufWithComponent {
187+
name: pkg_name.to_owned(),
188+
component: SyntheticComponent::Base,
189+
})
190+
}
191+
None => {
192+
// Since we will be adding constraints for
193+
// global vars we need to add the pseudo-package
194+
// to the dependency list so it will influence
195+
// decisions.
196+
let pseudo_pkg_name = format!(
197+
"{PSEUDO_PKG_NAME_PREFIX}{}",
198+
var_request.var.base_name()
199+
);
200+
if self
201+
.known_global_var_values
202+
.borrow_mut()
203+
.entry(var_request.var.base_name().to_owned())
204+
.or_insert_with(HashSet::new)
205+
.insert(VarValue::ArcStr(Arc::clone(value)))
206+
&& self
207+
.queried_global_var_values
208+
.borrow()
209+
.contains(var_request.var.base_name())
210+
{
211+
// Seeing a new value for a var that has
212+
// already locked in the list of candidates.
213+
self.cancel_solving.set(true);
214+
}
215+
let dep_name =
216+
self.pool.intern_package_name(PkgNameBufWithComponent {
217+
name: pkg_name!(&pseudo_pkg_name).to_owned(),
218+
component: SyntheticComponent::Base,
219+
});
220+
known_deps.requirements.push(
221+
self.pool
222+
.intern_version_set(
223+
dep_name,
224+
RequestVS::GlobalVar {
225+
key: var_request.var.base_name().to_owned(),
226+
value: VarValue::ArcStr(Arc::clone(value)),
227+
},
228+
)
229+
.into(),
230+
);
231+
dep_name
232+
}
233+
};
234+
// If we end up adding pkg_name to the solve, it needs
235+
// to satisfy this var request.
236+
known_deps.constrains.push(
237+
self.pool
238+
.intern_version_set(
239+
dep_name,
240+
RequestVS::SpkRequest(requirement.clone()),
241+
)
242+
.into(),
243+
);
244+
}
245+
}
246+
}
247+
}
248+
known_deps
249+
}
250+
171251
/// Return a new provider to restart the solve, preserving what was learned
172252
/// about global variables.
173253
pub fn reset(&self) -> Self {
@@ -779,12 +859,12 @@ impl DependencyProvider for SpkProvider {
779859
for embedded_component_requirement in embedded
780860
.components()
781861
.iter()
782-
.filter(|embedded_component| {
783-
embedded_component.name == located_build_ident_with_component.component
784-
})
862+
.filter(|embedded_component| embedded_component.name == *actual_component)
785863
.flat_map(|embedded_component| embedded_component.requirements.iter())
786864
{
787-
todo!("{embedded_component_requirement:?}");
865+
let kd = self.request_to_known_dependencies(embedded_component_requirement);
866+
known_deps.requirements.extend(kd.requirements);
867+
known_deps.constrains.extend(kd.constrains);
788868
}
789869
}
790870
// If this solvable is an embedded stub and it is
@@ -930,89 +1010,9 @@ impl DependencyProvider for SpkProvider {
9301010
);
9311011
}
9321012
for requirement in package.runtime_requirements().iter() {
933-
match requirement {
934-
Request::Pkg(pkg_request) => {
935-
let kd = self.pkg_request_to_known_dependencies(pkg_request);
936-
known_deps.requirements.extend(kd.requirements);
937-
known_deps.constrains.extend(kd.constrains);
938-
}
939-
Request::Var(var_request) => {
940-
match &var_request.value {
941-
spk_schema::ident::PinnableValue::FromBuildEnv => todo!(),
942-
spk_schema::ident::PinnableValue::FromBuildEnvIfPresent => todo!(),
943-
spk_schema::ident::PinnableValue::Pinned(value) => {
944-
let dep_name = match var_request.var.namespace() {
945-
Some(pkg_name) => {
946-
self.pool.intern_package_name(PkgNameBufWithComponent {
947-
name: pkg_name.to_owned(),
948-
component: SyntheticComponent::Base,
949-
})
950-
}
951-
None => {
952-
// Since we will be adding
953-
// constraints for global vars we
954-
// need to add the pseudo-package
955-
// to the dependency list so it
956-
// will influence decisions.
957-
let pseudo_pkg_name = format!(
958-
"{PSEUDO_PKG_NAME_PREFIX}{}",
959-
var_request.var.base_name()
960-
);
961-
if self
962-
.known_global_var_values
963-
.borrow_mut()
964-
.entry(var_request.var.base_name().to_owned())
965-
.or_insert_with(HashSet::new)
966-
.insert(VarValue::ArcStr(Arc::clone(value)))
967-
&& self
968-
.queried_global_var_values
969-
.borrow()
970-
.contains(var_request.var.base_name())
971-
{
972-
// Seeing a new value for a var
973-
// that has already locked in
974-
// the list of candidates.
975-
self.cancel_solving.set(true);
976-
}
977-
let dep_name = self.pool.intern_package_name(
978-
PkgNameBufWithComponent {
979-
name: pkg_name!(&pseudo_pkg_name).to_owned(),
980-
component: SyntheticComponent::Base,
981-
},
982-
);
983-
known_deps.requirements.push(
984-
self.pool
985-
.intern_version_set(
986-
dep_name,
987-
RequestVS::GlobalVar {
988-
key: var_request
989-
.var
990-
.base_name()
991-
.to_owned(),
992-
value: VarValue::ArcStr(Arc::clone(
993-
value,
994-
)),
995-
},
996-
)
997-
.into(),
998-
);
999-
dep_name
1000-
}
1001-
};
1002-
// If we end up adding pkg_name to the solve,
1003-
// it needs to satisfy this var request.
1004-
known_deps.constrains.push(
1005-
self.pool
1006-
.intern_version_set(
1007-
dep_name,
1008-
RequestVS::SpkRequest(requirement.clone()),
1009-
)
1010-
.into(),
1011-
);
1012-
}
1013-
}
1014-
}
1015-
}
1013+
let kd = self.request_to_known_dependencies(requirement);
1014+
known_deps.requirements.extend(kd.requirements);
1015+
known_deps.constrains.extend(kd.constrains);
10161016
}
10171017
Dependencies::Known(known_deps)
10181018
}

crates/spk-solve/src/solver_test.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2501,10 +2501,7 @@ async fn test_solver_component_embedded(#[case] mut solver: SolverImpl) {
25012501
#[case::comp2(&["mypkg:comp2", "dep-e1:comp2"], false)]
25022502
#[tokio::test]
25032503
async fn test_solver_component_embedded_component_requirements(
2504-
#[values(og_solver()
2505-
// TODO , cdcl_solver()
2506-
)]
2507-
mut solver: SolverImpl,
2504+
#[values(og_solver(), cdcl_solver())] mut solver: SolverImpl,
25082505
#[case] packages_to_request: &[&str],
25092506
#[case] expected_solve_result: bool,
25102507
) {
@@ -2542,7 +2539,10 @@ async fn test_solver_component_embedded_component_requirements(
25422539
solver.add_request(request!(package_to_request));
25432540
}
25442541

2545-
match run_and_print_resolve_for_tests(&mut solver).await {
2542+
match run_and_print_resolve_for_tests(&mut solver)
2543+
.await
2544+
.tap_err(|e| eprintln!("{e}"))
2545+
{
25462546
Ok(solution) => {
25472547
assert!(expected_solve_result, "expected solve to fail");
25482548

0 commit comments

Comments
 (0)