Skip to content

Commit 44114dc

Browse files
committed
Work towards using resolvo for spk commands
Change the solver factory to return an `impl AbstractSolver` instead of a concrete `spk_solve::Solver`. This leads to trouble with the different way to run the solver, so `downcast_ref` is used to get back the original type. Signed-off-by: J Robert Ray <[email protected]>
1 parent fcf33d6 commit 44114dc

File tree

21 files changed

+137
-57
lines changed

21 files changed

+137
-57
lines changed

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/spk-build/src/build/binary.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use spk_schema::{
3737
};
3838
use spk_solve::graph::Graph;
3939
use spk_solve::solution::Solution;
40-
use spk_solve::{BoxedResolverCallback, Named, ResolverCallback, Solver};
40+
use spk_solve::{AbstractSolver, BoxedResolverCallback, Named, ResolverCallback, Solver};
4141
use spk_storage as storage;
4242

4343
use crate::report::{BuildOutputReport, BuildReport, BuildSetupReport};

crates/spk-cli/cmd-env/src/cmd_env.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use spfs::tracking::SpecFile;
1111
use spfs_cli_common::Progress;
1212
use spk_cli_common::{build_required_packages, flags, CommandArgs, Run};
1313
use spk_exec::setup_runtime_with_reporter;
14+
use spk_solve::AbstractSolver;
1415
#[cfg(feature = "statsd")]
1516
use spk_solve::{get_metrics_client, SPK_RUN_TIME_METRIC};
1617

@@ -86,8 +87,13 @@ impl Run for Env {
8687
solver.add_request(request)
8788
}
8889

89-
let formatter = self.formatter_settings.get_formatter(self.verbose)?;
90-
let (solution, _) = formatter.run_and_print_resolve(&solver).await?;
90+
let solution = if let Some(solver) = solver.as_any().downcast_ref::<spk_solve::Solver>() {
91+
let formatter = self.formatter_settings.get_formatter(self.verbose)?;
92+
let (solution, _) = formatter.run_and_print_resolve(&solver).await?;
93+
solution
94+
} else {
95+
solver.solve().await?
96+
};
9197

9298
let solution = build_required_packages(&solution).await?;
9399

crates/spk-cli/cmd-explain/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ miette = { workspace = true, features = ["fancy"] }
1717
async-trait = { workspace = true }
1818
clap = { workspace = true }
1919
spk-cli-common = { workspace = true }
20+
spk-solve = { workspace = true }
2021
# The dependency on spfs can be removed after the deprecated runtime flags are
2122
# removed.
2223
spfs = { workspace = true }

crates/spk-cli/cmd-explain/src/cmd_explain.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use clap::Args;
66
use miette::Result;
77
use spk_cli_common::{flags, CommandArgs, Run};
8+
use spk_solve::AbstractSolver;
89

910
/// Show the resolve process for a set of packages.
1011
#[derive(Args)]
@@ -80,12 +81,17 @@ impl Run for Explain {
8081
}
8182

8283
// Always show the solution packages for the solve
83-
let formatter = self
84-
.formatter_settings
85-
.get_formatter_builder(self.verbose + 1)?
86-
.with_solution(true)
87-
.build();
88-
formatter.run_and_print_resolve(&solver).await?;
84+
if let Some(solver) = solver.as_any().downcast_ref::<spk_solve::Solver>() {
85+
let formatter = self
86+
.formatter_settings
87+
.get_formatter_builder(self.verbose + 1)?
88+
.with_solution(true)
89+
.build();
90+
formatter.run_and_print_resolve(&solver).await?;
91+
} else {
92+
// TODO: print the solve
93+
solver.solve().await?;
94+
}
8995

9096
Ok(0)
9197
}

crates/spk-cli/cmd-install/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ futures = { workspace = true }
2121
spk-cli-common = { workspace = true }
2222
spk-exec = { workspace = true }
2323
spk-schema = { workspace = true }
24+
spk-solve = { workspace = true }
2425
tokio = { workspace = true, features = ["rt"] }

crates/spk-cli/cmd-install/src/cmd_install.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use spk_exec::setup_current_runtime;
1414
use spk_schema::foundation::format::FormatIdent;
1515
use spk_schema::foundation::spec_ops::Named;
1616
use spk_schema::Package;
17+
use spk_solve::AbstractSolver;
1718

1819
/// Install a package into the current environment
1920
#[derive(Args)]
@@ -62,12 +63,16 @@ impl Run for Install {
6263
solver.add_request(request);
6364
}
6465

65-
let formatter = self.formatter_settings.get_formatter(self.verbose)?;
66-
let (solution, _) = formatter.run_and_print_resolve(&solver).await?;
66+
let solution = if let Some(solver) = solver.as_any().downcast_ref::<spk_solve::Solver>() {
67+
let formatter = self.formatter_settings.get_formatter(self.verbose)?;
68+
let (solution, _) = formatter.run_and_print_resolve(&solver).await?;
69+
solution
70+
} else {
71+
solver.solve().await?
72+
};
6773

6874
println!("The following packages will be installed:\n");
6975
let requested: HashSet<_> = solver
70-
.get_initial_state()
7176
.get_pkg_requests()
7277
.iter()
7378
.map(|r| r.pkg.name.clone())

crates/spk-cli/cmd-render/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dunce = { workspace = true }
2020
spfs = { workspace = true }
2121
spk-cli-common = { workspace = true }
2222
spk-exec = { workspace = true }
23+
spk-solve = { workspace = true }
2324
spk-storage = { workspace = true }
2425
tokio = { workspace = true, features = ["rt"] }
2526
tracing = { workspace = true }

crates/spk-cli/cmd-render/src/cmd_render.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use miette::{bail, Context, IntoDiagnostic, Result};
99
use spfs::storage::fallback::FallbackProxy;
1010
use spk_cli_common::{build_required_packages, flags, CommandArgs, Run};
1111
use spk_exec::resolve_runtime_layers;
12+
use spk_solve::AbstractSolver;
1213

1314
/// Output the contents of an spk environment (/spfs) to a folder
1415
#[derive(Args)]
@@ -51,8 +52,13 @@ impl Run for Render {
5152
solver.add_request(name);
5253
}
5354

54-
let formatter = self.formatter_settings.get_formatter(self.verbose)?;
55-
let (solution, _) = formatter.run_and_print_resolve(&solver).await?;
55+
let solution = if let Some(solver) = solver.as_any().downcast_ref::<spk_solve::Solver>() {
56+
let formatter = self.formatter_settings.get_formatter(self.verbose)?;
57+
let (solution, _) = formatter.run_and_print_resolve(&solver).await?;
58+
solution
59+
} else {
60+
solver.solve().await?
61+
};
5662

5763
let solution = build_required_packages(&solution).await?;
5864
let stack = resolve_runtime_layers(true, &solution).await?;

crates/spk-cli/cmd-test/src/test/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use spk_schema::foundation::option_map::OptionMap;
1515
use spk_schema::ident::{PkgRequest, PreReleasePolicy, RangeIdent, Request, RequestedBy};
1616
use spk_schema::{AnyIdent, Recipe, SpecRecipe};
1717
use spk_solve::solution::Solution;
18-
use spk_solve::{BoxedResolverCallback, DefaultResolver, ResolverCallback, Solver};
18+
use spk_solve::{AbstractSolver, BoxedResolverCallback, DefaultResolver, ResolverCallback, Solver};
1919
use spk_storage as storage;
2020

2121
use super::Tester;

0 commit comments

Comments
 (0)