Skip to content

Commit 652c25f

Browse files
committed
Updates options processing with new field in requests file
Signed-off-by: David Gilligan-Cook <[email protected]>
1 parent 475efa0 commit 652c25f

File tree

8 files changed

+52
-48
lines changed

8 files changed

+52
-48
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,11 @@ impl Run for Env {
6969

7070
let mut solver = self.solver.get_solver(&self.options).await?;
7171

72-
let requests = self
72+
let (requests, extra_options) = self
7373
.requests
7474
.parse_requests(&self.requested, &self.options, solver.repositories())
7575
.await?;
76+
solver.update_options(extra_options);
7677
for request in requests {
7778
solver.add_request(request)
7879
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ impl Run for Explain {
7070

7171
let mut solver = self.solver.get_solver(&self.options).await?;
7272

73-
let requests = self
73+
let (requests, extra_options) = self
7474
.requests
7575
.parse_requests(&self.requested, &self.options, solver.repositories())
7676
.await?;
77+
solver.update_options(extra_options);
7778
for request in requests {
7879
solver.add_request(request)
7980
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ impl Run for Install {
5050
current_env().map_err(|err| err.into())
5151
)?;
5252

53-
let requests = self
53+
let (requests, extra_options) = self
5454
.requests
5555
.parse_requests(&self.packages, &self.options, solver.repositories())
5656
.await?;
57-
57+
solver.update_options(extra_options);
5858
for solved in env.items() {
5959
solver.add_request(solved.request.clone().into());
6060
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,11 @@ impl Run for Render {
4242
async fn run(&mut self) -> Result<Self::Output> {
4343
let mut solver = self.solver.get_solver(&self.options).await?;
4444

45-
let requests = self
45+
let (requests, extra_options) = self
4646
.requests
4747
.parse_requests(&self.packages, &self.options, solver.repositories())
4848
.await?;
49+
solver.update_options(extra_options);
4950
for name in requests {
5051
solver.add_request(name);
5152
}

crates/spk-cli/common/src/flags.rs

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,10 @@ pub struct Solver {
255255
impl Solver {
256256
pub async fn get_solver(&self, options: &Options) -> Result<solve::Solver> {
257257
let option_map = options.get_options()?;
258+
258259
let mut solver = solve::Solver::default();
259260
solver.update_options(option_map);
261+
260262
for (name, repo) in self.repos.get_repos_for_non_destructive_operation().await? {
261263
tracing::debug!(repo=%name, "using repository");
262264
solver.add_repository(repo);
@@ -272,9 +274,6 @@ impl Solver {
272274
self.check_impossible_builds || self.check_impossible_all,
273275
);
274276

275-
for r in options.get_var_requests()? {
276-
solver.add_request(r.into());
277-
}
278277
Ok(solver)
279278
}
280279
}
@@ -399,34 +398,42 @@ impl Requests {
399398
Ok(idents)
400399
}
401400

402-
/// Parse and build a request from the given string and these flags
401+
/// Parse and build a request, and any extra options, from the
402+
/// given string and these flags. If the request expands into
403+
/// multiple requests, such as from a request file, this will
404+
/// return the last request. Any options returned are filtered to
405+
/// exclude any (override) options given in the options parameter.
403406
pub async fn parse_request<R: AsRef<str>>(
404407
&self,
405408
request: R,
406409
options: &Options,
407410
repos: &[Arc<storage::RepositoryHandle>],
408-
) -> Result<Request> {
409-
Ok(self
411+
) -> Result<(Request, OptionMap)> {
412+
let (mut requests, extra_options) = self
410413
.parse_requests([request.as_ref()], options, repos)
411-
.await?
412-
.pop()
413-
.unwrap())
414+
.await?;
415+
let last_request = requests.pop().unwrap();
416+
Ok((last_request, extra_options))
414417
}
415418

416-
/// Parse and build requests from the given strings and these flags.
419+
/// Parse and build requests, and any extra options, from the
420+
/// given strings and these flags. Any options returned are
421+
/// filtered to exclude any (override) options given in the
422+
/// options parameter.
417423
pub async fn parse_requests<I, S>(
418424
&self,
419425
requests: I,
420426
options: &Options,
421427
repos: &[Arc<storage::RepositoryHandle>],
422-
) -> Result<Vec<Request>>
428+
) -> Result<(Vec<Request>, OptionMap)>
423429
where
424430
I: IntoIterator<Item = S>,
425431
S: AsRef<str>,
426432
{
427433
let mut out = Vec::<Request>::new();
428434
let override_options = options.get_options()?;
429435
let mut templating_options = override_options.clone();
436+
let mut extra_options = OptionMap::default();
430437

431438
// From the positional REQUESTS arg
432439
for r in requests.into_iter() {
@@ -445,25 +452,18 @@ impl Requests {
445452
)
446453
})?;
447454

448-
for request in requests_from_file.requirements {
449-
// First, add all the requests, pkg and var, to
450-
// the requests lists
451-
out.push(request.clone());
452-
453-
// Then, add any var requests to the templating
454-
// options for use with subsequent requests files
455-
// or package@stage spec files read in later
456-
// iterations of the outer loop
457-
if let Some(var) = request.into_var() {
458-
// There is no command line override
459-
// option for this name so can update it.
460-
if override_options.get(&var.var).is_none() {
461-
// Forcing a var request into an option
462-
templating_options.insert(
463-
var.var,
464-
var.value.as_pinned().unwrap_or_default().to_string(),
465-
);
466-
}
455+
out.extend(requests_from_file.requirements);
456+
457+
for (name, value) in requests_from_file.options {
458+
// Command line override options take precedence.
459+
// Only when there is no command line override for
460+
// this option name is it used
461+
if override_options.get(&name).is_none() {
462+
// For template values in later files and specs
463+
templating_options.insert(OptName::new(&name)?.into(), value.clone());
464+
// For later use by commands, usually when
465+
// setting up a solver
466+
extra_options.insert(OptName::new(&name)?.into(), value);
467467
}
468468
}
469469
continue;
@@ -481,7 +481,7 @@ impl Requests {
481481
)
482482
.into())
483483
} else {
484-
Ok(out)
484+
Ok((out, extra_options))
485485
}
486486
}
487487

crates/spk-cli/group1/src/cmd_bake.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,11 @@ impl Bake {
224224
// with it.
225225
let mut solver = self.solver.get_solver(&self.options).await?;
226226

227-
let requests = self
227+
let (requests, extra_options) = self
228228
.requests
229229
.parse_requests(&self.requested, &self.options, solver.repositories())
230230
.await?;
231+
solver.update_options(extra_options);
231232
for request in requests {
232233
solver.add_request(request)
233234
}

crates/spk-cli/group4/src/cmd_view.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ impl View {
473473
let solver = self.solver.get_solver(&self.options).await?;
474474
let repos = solver.repositories();
475475

476-
let parsed_request = match self
476+
let (parsed_request, _extra_options) = match self
477477
.requests
478478
.parse_request(&package, &self.options, repos)
479479
.await
@@ -613,7 +613,9 @@ impl View {
613613
async fn print_package_info_from_solve(&self, package: &String) -> Result<i32> {
614614
let mut solver = self.solver.get_solver(&self.options).await?;
615615

616-
let request = match self
616+
// _extra_option are unused here because getting package info
617+
// from a solve is basically deprecated and should be removed soon.
618+
let (request, _extra_options) = match self
617619
.requests
618620
.parse_request(&package, &self.options, solver.repositories())
619621
.await

crates/spk-schema/src/v0/requirements.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,20 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// https://github.com/spkenv/spk
44

5+
use std::collections::BTreeMap;
6+
57
use serde::{Deserialize, Serialize};
68

79
use crate::RequirementsList;
810

911
/// For a list of requirements parsed from the requests file
1012
#[derive(Debug, Clone, Hash, PartialEq, Eq, Ord, PartialOrd, Deserialize, Serialize)]
1113
pub struct Requirements {
14+
/// A list of var or pkg requests
1215
#[serde(default, skip_serializing_if = "Vec::is_empty")]
1316
pub requirements: RequirementsList,
14-
// Could separate override options out:
15-
//
16-
// // From BuildSpec - Opt has var and pkg items
17-
// #[serde(default, skip_serializing_if = "Vec::is_empty")]
18-
// pub options: Vec<Opt>,
19-
//
20-
// // From V0::Variant
21-
// #[serde(flatten)]
22-
// pub options: OptionMap,
17+
18+
/// Additional options for templates and solver's initial options
19+
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
20+
pub options: BTreeMap<String, String>,
2321
}

0 commit comments

Comments
 (0)