Skip to content

Commit 4cd7f86

Browse files
wolfvbaszalmstra
authored andcommitted
feat: use resolvo 0.4.0
1 parent bce2b4c commit 4cd7f86

File tree

6 files changed

+40
-22
lines changed

6 files changed

+40
-22
lines changed

Cargo.toml

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[workspace]
22
members = ["crates/*"]
3+
resolver = "2"
34

45
# See: https://docs.rs/insta/latest/insta/#optional-faster-runs
56
[profile.dev.package.insta]
@@ -105,7 +106,7 @@ reflink-copy = "0.1.14"
105106
regex = "1.10.3"
106107
reqwest = { version = "0.11.24", default-features = false }
107108
reqwest-middleware = "0.2.4"
108-
resolvo = { version = "0.3.0" }
109+
resolvo = { version = "0.4.0" }
109110
retry-policies = { version = "0.2.1", default-features = false }
110111
rstest = { version = "0.18.2" }
111112
rstest_reuse = "0.6.0"
@@ -144,3 +145,5 @@ walkdir = "2.4.0"
144145
windows-sys = { version = "0.52.0", default-features = false }
145146
zip = { version = "0.6.6", default-features = false }
146147
zstd = { version = "0.13.0", default-features = false }
148+
149+
[patch.crates-io]

crates/rattler_lock/src/lib.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,8 @@ impl Environment {
315315
&self,
316316
platform: Platform,
317317
) -> Result<Option<Vec<RepoDataRecord>>, ConversionError> {
318-
let Some(packages) = self.data()
319-
.packages.get(&platform) else {
320-
return Ok(None)
318+
let Some(packages) = self.data().packages.get(&platform) else {
319+
return Ok(None);
321320
};
322321

323322
packages
@@ -338,9 +337,8 @@ impl Environment {
338337
&self,
339338
platform: Platform,
340339
) -> Option<Vec<(PypiPackageData, PypiPackageEnvironmentData)>> {
341-
let Some(packages) = self.data()
342-
.packages.get(&platform) else {
343-
return None
340+
let Some(packages) = self.data().packages.get(&platform) else {
341+
return None;
344342
};
345343

346344
Some(

crates/rattler_solve/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ hex = { workspace = true }
2525
tempfile = { workspace = true }
2626
rattler_libsolv_c = { workspace = true, optional = true }
2727
resolvo = { workspace = true, optional = true }
28+
futures = { workspace = true, optional = true }
2829

2930
[dev-dependencies]
3031
criterion = { workspace = true }
@@ -41,6 +42,7 @@ url = { workspace = true }
4142
[features]
4243
default = ["libsolv_c"]
4344
libsolv_c = ["rattler_libsolv_c", "libc"]
45+
resolvo = ["dep:resolvo", "dep:futures"]
4446

4547
[[bench]]
4648
name = "bench"

crates/rattler_solve/src/resolvo/conda_util.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use crate::resolvo::{CondaDependencyProvider, SolverMatchSpec};
2+
use futures::future::FutureExt;
23
use rattler_conda_types::Version;
34
use resolvo::{Dependencies, SolvableId, SolverCache, VersionSetId};
45
use std::cmp::Ordering;
56
use std::collections::HashMap;
6-
77
/// Returns the order of two candidates based on the order used by conda.
88
#[allow(clippy::too_many_arguments)]
99
pub(super) fn compare_candidates<'a>(
@@ -47,11 +47,19 @@ pub(super) fn compare_candidates<'a>(
4747
Ordering::Equal => {}
4848
};
4949

50+
// return Ordering::Equal;
51+
5052
// Otherwise, compare the dependencies of the variants. If there are similar
5153
// dependencies select the variant that selects the highest version of the dependency.
5254
let (a_dependencies, b_dependencies) = match (
53-
solver.get_or_cache_dependencies(a),
54-
solver.get_or_cache_dependencies(b),
55+
solver
56+
.get_or_cache_dependencies(a)
57+
.now_or_never()
58+
.expect("get_or_cache_dependencies failed"),
59+
solver
60+
.get_or_cache_dependencies(b)
61+
.now_or_never()
62+
.expect("get_or_cache_dependencies failed"),
5563
) {
5664
(Ok(a_deps), Ok(b_deps)) => (a_deps, b_deps),
5765
// If either call fails, it's likely due to solver cancellation; thus, we can't compare dependencies
@@ -147,7 +155,10 @@ pub(super) fn find_highest_version<'a>(
147155
match_spec_highest_version
148156
.entry(match_spec_id)
149157
.or_insert_with(|| {
150-
let candidates = solver.get_or_cache_matching_candidates(match_spec_id);
158+
let candidates = solver
159+
.get_or_cache_matching_candidates(match_spec_id)
160+
.now_or_never()
161+
.expect("get_or_cache_matching_candidates failed");
151162

152163
// Err only happens on cancellation, so we will not continue anyways
153164
let candidates = if let Ok(candidates) = candidates {
@@ -156,9 +167,11 @@ pub(super) fn find_highest_version<'a>(
156167
return None;
157168
};
158169

170+
let pool = solver.pool();
171+
159172
candidates
160173
.iter()
161-
.map(|id| solver.pool().resolve_solvable(*id).inner())
174+
.map(|id| pool.resolve_solvable(*id).inner())
162175
.fold(None, |init, record| {
163176
Some(init.map_or_else(
164177
|| {

crates/rattler_solve/src/resolvo/mod.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use resolvo::{
1111
SolvableId, Solver as LibSolvRsSolver, SolverCache, UnsolvableOrCancelled, VersionSet,
1212
VersionSetId,
1313
};
14+
use std::rc::Rc;
1415
use std::{
1516
cell::RefCell,
1617
cmp::Ordering,
@@ -157,7 +158,7 @@ impl<'a> Display for SolverPackageRecord<'a> {
157158
/// Dependency provider for conda
158159
#[derive(Default)]
159160
pub(crate) struct CondaDependencyProvider<'a> {
160-
pool: Pool<SolverMatchSpec<'a>, String>,
161+
pool: Rc<Pool<SolverMatchSpec<'a>, String>>,
161162

162163
records: HashMap<NameId, Candidates>,
163164

@@ -178,7 +179,7 @@ impl<'a> CondaDependencyProvider<'a> {
178179
match_specs: &[MatchSpec],
179180
stop_time: Option<std::time::SystemTime>,
180181
) -> Self {
181-
let pool = Pool::default();
182+
let pool = Rc::new(Pool::default());
182183
let mut records: HashMap<NameId, Candidates> = HashMap::default();
183184

184185
// Add virtual packages to the records
@@ -348,11 +349,11 @@ pub enum CancelReason {
348349
}
349350

350351
impl<'a> DependencyProvider<SolverMatchSpec<'a>> for CondaDependencyProvider<'a> {
351-
fn pool(&self) -> &Pool<SolverMatchSpec<'a>, String> {
352-
&self.pool
352+
fn pool(&self) -> Rc<Pool<SolverMatchSpec<'a>, String>> {
353+
self.pool.clone()
353354
}
354355

355-
fn sort_candidates(
356+
async fn sort_candidates(
356357
&self,
357358
solver: &SolverCache<SolverMatchSpec<'a>, String, Self>,
358359
solvables: &mut [SolvableId],
@@ -363,11 +364,11 @@ impl<'a> DependencyProvider<SolverMatchSpec<'a>> for CondaDependencyProvider<'a>
363364
});
364365
}
365366

366-
fn get_candidates(&self, name: NameId) -> Option<Candidates> {
367+
async fn get_candidates(&self, name: NameId) -> Option<Candidates> {
367368
self.records.get(&name).cloned()
368369
}
369370

370-
fn get_dependencies(&self, solvable: SolvableId) -> Dependencies {
371+
async fn get_dependencies(&self, solvable: SolvableId) -> Dependencies {
371372
let mut dependencies = KnownDependencies::default();
372373
let SolverPackageRecord::Record(rec) = self.pool.resolve_solvable(solvable).inner() else {
373374
return Dependencies::Known(dependencies);
@@ -446,6 +447,7 @@ impl super::SolverImpl for Solver {
446447
task.specs.clone().as_ref(),
447448
stop_time,
448449
);
450+
let pool = provider.pool.clone();
449451

450452
// Construct the requirements that the solver needs to satisfy.
451453
let root_requirements = task
@@ -467,7 +469,7 @@ impl super::SolverImpl for Solver {
467469
match unsolvable_or_cancelled {
468470
UnsolvableOrCancelled::Unsolvable(problem) => {
469471
SolveError::Unsolvable(vec![problem
470-
.display_user_friendly(&solver, &CondaSolvableDisplay)
472+
.display_user_friendly(&solver, pool, &CondaSolvableDisplay)
471473
.to_string()])
472474
}
473475
// We are not doing this as of yet
@@ -479,7 +481,7 @@ impl super::SolverImpl for Solver {
479481
// Get the resulting packages from the solver.
480482
let required_records = solvables
481483
.into_iter()
482-
.filter_map(|id| match *solver.pool().resolve_solvable(id).inner() {
484+
.filter_map(|id| match *solver.pool.resolve_solvable(id).inner() {
483485
SolverPackageRecord::Record(rec) => Some(rec.clone()),
484486
SolverPackageRecord::VirtualPackage(_) => None,
485487
})

rust-toolchain

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.70.0
1+
1.75.0

0 commit comments

Comments
 (0)