Skip to content

Commit 8cde6e3

Browse files
authored
Merge pull request #1258 from spkenv/push-rvwyootwrpsk
Fix resolvo treating options as var requirements
2 parents 3896de7 + 8798b7a commit 8cde6e3

File tree

3 files changed

+68
-56
lines changed

3 files changed

+68
-56
lines changed

crates/spk-solve/src/solvers/resolvo/mod.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ impl Solver {
145145
pub async fn solve(&self) -> Result<Solution> {
146146
let repos = self.repos.clone();
147147
let requests = self.requests.clone();
148-
let options = self.options.clone();
149148
let binary_only = self.binary_only;
150149
let build_from_source_trail = self.build_from_source_trail.clone();
151150
// Use a blocking thread so resolvo can call `block_on` on the runtime.
@@ -160,11 +159,7 @@ impl Solver {
160159
loop_counter += 1;
161160
let mut this_iter_provider = provider.take().expect("provider is always Some");
162161
let pkg_requirements = this_iter_provider.root_pkg_requirements(&requests);
163-
let mut var_requirements = this_iter_provider.var_requirements(&requests);
164-
// XXX: Not sure if this will result in the desired precedence
165-
// when options and var requests for the same thing exist.
166-
var_requirements
167-
.extend(this_iter_provider.var_requirements_from_options(options.clone()));
162+
let var_requirements = this_iter_provider.var_requirements(&requests);
168163
let mut solver = resolvo::Solver::new(this_iter_provider)
169164
.with_runtime(tokio::runtime::Handle::current());
170165
let problem = resolvo::Problem::new()

crates/spk-solve/src/solvers/resolvo/spk_provider.rs

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,7 @@ use spk_schema::ident_component::Component;
3939
use spk_schema::name::{OptNameBuf, PkgNameBuf};
4040
use spk_schema::prelude::{HasVersion, Named};
4141
use spk_schema::version_range::{DoubleEqualsVersion, Ranged, VersionFilter, parse_version_range};
42-
use spk_schema::{
43-
BuildIdent,
44-
Deprecate,
45-
Opt,
46-
OptionMap,
47-
Package,
48-
Recipe,
49-
Request,
50-
Spec,
51-
VersionIdent,
52-
};
42+
use spk_schema::{BuildIdent, Deprecate, Opt, Package, Recipe, Request, Spec, VersionIdent};
5343
use spk_solve_package_iterator::{BuildKey, BuildToSortedOptName, SortedBuildIterator};
5444
use spk_storage::RepositoryHandle;
5545
use tracing::{Instrument, debug_span};
@@ -863,45 +853,6 @@ impl SpkProvider {
863853
})
864854
.collect()
865855
}
866-
867-
pub fn var_requirements_from_options(&mut self, options: OptionMap) -> Vec<VersionSetId> {
868-
self.global_var_requests.reserve(options.len());
869-
options
870-
.into_iter()
871-
.filter_map(|(var, value)| {
872-
let var_value = VarValue::Owned(value.clone());
873-
let req = VarRequest::new_with_value(var, value);
874-
match req.var.namespace() {
875-
Some(pkg_name) => {
876-
// A global request applicable to a specific package.
877-
let dep_name = self.pool.intern_package_name(
878-
ResolvoPackageName::PkgNameBufWithComponent(PkgNameBufWithComponent {
879-
name: pkg_name.to_owned(),
880-
component: SyntheticComponent::Base,
881-
}),
882-
);
883-
Some(
884-
self.pool.intern_version_set(
885-
dep_name,
886-
RequestVS::SpkRequest(Request::Var(req)),
887-
),
888-
)
889-
}
890-
None => {
891-
// A global request affecting all packages.
892-
self.global_var_requests
893-
.insert(req.var.without_namespace().to_owned(), req.clone());
894-
self.known_global_var_values
895-
.borrow_mut()
896-
.entry(req.var.without_namespace().to_owned())
897-
.or_default()
898-
.insert(var_value);
899-
None
900-
}
901-
}
902-
})
903-
.collect()
904-
}
905856
}
906857

907858
impl DependencyProvider for SpkProvider {

crates/spk-solve/src/solvers/solver_test.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3086,3 +3086,69 @@ async fn request_for_all_component_picks_correct_version(
30863086
let solution = run_and_print_resolve_for_tests(&mut solver).await.unwrap();
30873087
assert_resolved!(solution, "mypkg", version = version);
30883088
}
3089+
3090+
/// Verify that when solving the dependencies of a package, the build options of
3091+
/// the candidates do not factor into the selection of the candidate.
3092+
#[rstest]
3093+
#[case::step(step_solver())]
3094+
#[case::resolvo(resolvo_solver())]
3095+
#[tokio::test]
3096+
async fn build_options_not_checked_on_dependencies(#[case] mut solver: SolverImpl) {
3097+
// Suppose a platform exists
3098+
let spi_platform_2024_1_1_1 =
3099+
make_build!({"pkg": "spi-platform/2024.1.1.1", "compat": "x.x.a.b"});
3100+
// And a library package targets that platform version
3101+
let openimageio_1_2_3 = make_build!(
3102+
{
3103+
"pkg": "openimageio/1.2.3",
3104+
"build": {
3105+
"options": [
3106+
{ "pkg": "spi-platform/~2024.1.1.1" },
3107+
],
3108+
},
3109+
},
3110+
[spi_platform_2024_1_1_1]
3111+
);
3112+
// And an application package depends on that library package
3113+
let my_app_4_5_6 = make_build!(
3114+
{
3115+
"pkg": "my-app/4.5.6",
3116+
"build": {
3117+
"options": [
3118+
{ "pkg": "openimageio" },
3119+
],
3120+
},
3121+
"install": {
3122+
"requirements": [
3123+
{ "pkg": "openimageio", "fromBuildEnv": true },
3124+
],
3125+
},
3126+
},
3127+
[openimageio_1_2_3]
3128+
);
3129+
// And a new version of the platform is published
3130+
let spi_platform_2025_1_1_1 =
3131+
make_build!({"pkg": "spi-platform/2025.1.1.1", "compat": "x.x.a.b"});
3132+
let repo = make_repo!([
3133+
spi_platform_2024_1_1_1,
3134+
openimageio_1_2_3,
3135+
my_app_4_5_6,
3136+
spi_platform_2025_1_1_1,
3137+
]);
3138+
3139+
// Then we want to solve for my-app using the new platform version.
3140+
// Although the only build of openimageio was built using the old platform,
3141+
// it is expected to be resolvable when using the new platform.
3142+
let repo = Arc::new(repo);
3143+
3144+
solver.add_repository(repo);
3145+
// The platform version is specified as a build option rather than a request
3146+
solver.update_options(option_map! {
3147+
"spi-platform" => "~2025.1.1.1"
3148+
});
3149+
solver.add_request(request!("my-app"));
3150+
3151+
let solution = run_and_print_resolve_for_tests(&mut solver).await.unwrap();
3152+
assert_resolved!(solution, "my-app", "4.5.6");
3153+
assert_resolved!(solution, "openimageio", "1.2.3");
3154+
}

0 commit comments

Comments
 (0)