Skip to content

Commit

Permalink
Updates options processing with new field in requests file
Browse files Browse the repository at this point in the history
Signed-off-by: David Gilligan-Cook <dcook@imageworks.com>
  • Loading branch information
dcookspi committed Oct 10, 2024
1 parent 0f48ce3 commit adeae26
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 48 deletions.
3 changes: 2 additions & 1 deletion crates/spk-cli/cmd-env/src/cmd_env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,11 @@ impl Run for Env {

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

let requests = self
let (requests, extra_options) = self
.requests
.parse_requests(&self.requested, &self.options, solver.repositories())
.await?;
solver.update_options(extra_options);
for request in requests {
solver.add_request(request)
}
Expand Down
3 changes: 2 additions & 1 deletion crates/spk-cli/cmd-explain/src/cmd_explain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,11 @@ impl Run for Explain {

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

let requests = self
let (requests, extra_options) = self
.requests
.parse_requests(&self.requested, &self.options, solver.repositories())
.await?;
solver.update_options(extra_options);
for request in requests {
solver.add_request(request)
}
Expand Down
4 changes: 2 additions & 2 deletions crates/spk-cli/cmd-install/src/cmd_install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ impl Run for Install {
current_env().map_err(|err| err.into())
)?;

let requests = self
let (requests, extra_options) = self
.requests
.parse_requests(&self.packages, &self.options, solver.repositories())
.await?;

solver.update_options(extra_options);
for solved in env.items() {
solver.add_request(solved.request.clone().into());
}
Expand Down
3 changes: 2 additions & 1 deletion crates/spk-cli/cmd-render/src/cmd_render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,11 @@ impl Run for Render {
async fn run(&mut self) -> Result<Self::Output> {
let mut solver = self.solver.get_solver(&self.options).await?;

let requests = self
let (requests, extra_options) = self
.requests
.parse_requests(&self.packages, &self.options, solver.repositories())
.await?;
solver.update_options(extra_options);
for name in requests {
solver.add_request(name);
}
Expand Down
62 changes: 31 additions & 31 deletions crates/spk-cli/common/src/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,10 @@ pub struct Solver {
impl Solver {
pub async fn get_solver(&self, options: &Options) -> Result<solve::Solver> {
let option_map = options.get_options()?;

let mut solver = solve::Solver::default();
solver.update_options(option_map);

for (name, repo) in self.repos.get_repos_for_non_destructive_operation().await? {
tracing::debug!(repo=%name, "using repository");
solver.add_repository(repo);
Expand All @@ -264,9 +266,6 @@ impl Solver {
self.check_impossible_builds || self.check_impossible_all,
);

for r in options.get_var_requests()? {
solver.add_request(r.into());
}
Ok(solver)
}
}
Expand Down Expand Up @@ -391,34 +390,42 @@ impl Requests {
Ok(idents)
}

/// Parse and build a request from the given string and these flags
/// Parse and build a request, and any extra options, from the
/// given string and these flags. If the request expands into
/// multiple requests, such as from a request file, this will
/// return the last request. Any options returned are filtered to
/// exclude any (override) options given in the options parameter.
pub async fn parse_request<R: AsRef<str>>(
&self,
request: R,
options: &Options,
repos: &[Arc<storage::RepositoryHandle>],
) -> Result<Request> {
Ok(self
) -> Result<(Request, OptionMap)> {
let (mut requests, extra_options) = self
.parse_requests([request.as_ref()], options, repos)
.await?
.pop()
.unwrap())
.await?;
let last_request = requests.pop().unwrap();
Ok((last_request, extra_options))
}

/// Parse and build requests from the given strings and these flags.
/// Parse and build requests, and any extra options, from the
/// given strings and these flags. Any options returned are
/// filtered to exclude any (override) options given in the
/// options parameter.
pub async fn parse_requests<I, S>(
&self,
requests: I,
options: &Options,
repos: &[Arc<storage::RepositoryHandle>],
) -> Result<Vec<Request>>
) -> Result<(Vec<Request>, OptionMap)>
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
{
let mut out = Vec::<Request>::new();
let override_options = options.get_options()?;
let mut templating_options = override_options.clone();
let mut extra_options = OptionMap::default();

// From the positional REQUESTS arg
for r in requests.into_iter() {
Expand All @@ -437,25 +444,18 @@ impl Requests {
)
})?;

for request in requests_from_file.requirements {
// First, add all the requests, pkg and var, to
// the requests lists
out.push(request.clone());

// Then, add any var requests to the templating
// options for use with subsequent requests files
// or package@stage spec files read in later
// iterations of the outer loop
if let Some(var) = request.into_var() {
// There is no command line override
// option for this name so can update it.
if override_options.get(&var.var).is_none() {
// Forcing a var request into an option
templating_options.insert(
var.var,
var.value.as_pinned().unwrap_or_default().to_string(),
);
}
out.extend(requests_from_file.requirements);

for (name, value) in requests_from_file.options {
// Command line override options take precedence.
// Only when there is no command line override for
// this option name is it used
if override_options.get(&name).is_none() {
// For template values in later files and specs
templating_options.insert(OptName::new(&name)?.into(), value.clone());
// For later use by commands, usually when
// setting up a solver
extra_options.insert(OptName::new(&name)?.into(), value);
}
}

Expand All @@ -474,7 +474,7 @@ impl Requests {
)
.into())
} else {
Ok(out)
Ok((out, extra_options))
}
}

Expand Down
3 changes: 2 additions & 1 deletion crates/spk-cli/group1/src/cmd_bake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -224,10 +224,11 @@ impl Bake {
// with it.
let mut solver = self.solver.get_solver(&self.options).await?;

let requests = self
let (requests, extra_options) = self
.requests
.parse_requests(&self.requested, &self.options, solver.repositories())
.await?;
solver.update_options(extra_options);
for request in requests {
solver.add_request(request)
}
Expand Down
6 changes: 4 additions & 2 deletions crates/spk-cli/group4/src/cmd_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ impl View {
let solver = self.solver.get_solver(&self.options).await?;
let repos = solver.repositories();

let parsed_request = match self
let (parsed_request, _extra_options) = match self
.requests
.parse_request(&package, &self.options, repos)
.await
Expand Down Expand Up @@ -564,7 +564,9 @@ impl View {
async fn print_package_info_from_solve(&self, package: &String) -> Result<i32> {
let mut solver = self.solver.get_solver(&self.options).await?;

let request = match self
// _extra_option are unused here because getting package info
// from a solve is basically deprecated and should be removed soon.
let (request, _extra_options) = match self
.requests
.parse_request(&package, &self.options, solver.repositories())
.await
Expand Down
16 changes: 7 additions & 9 deletions crates/spk-schema/src/v0/requirements.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,20 @@
// SPDX-License-Identifier: Apache-2.0
// https://github.com/spkenv/spk

use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};

use crate::RequirementsList;

/// For a list of requirements parsed from the requests file
#[derive(Debug, Clone, Hash, PartialEq, Eq, Ord, PartialOrd, Deserialize, Serialize)]
pub struct Requirements {
/// A list of var or pkg requests
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub requirements: RequirementsList,
// Could separate override options out:
//
// // From BuildSpec - Opt has var and pkg items
// #[serde(default, skip_serializing_if = "Vec::is_empty")]
// pub options: Vec<Opt>,
//
// // From V0::Variant
// #[serde(flatten)]
// pub options: OptionMap,

/// Additional options for templates and solver's initial options
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub options: BTreeMap<String, String>,
}

0 comments on commit adeae26

Please sign in to comment.