Skip to content

Commit adeae26

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

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
@@ -247,8 +247,10 @@ pub struct Solver {
247247
impl Solver {
248248
pub async fn get_solver(&self, options: &Options) -> Result<solve::Solver> {
249249
let option_map = options.get_options()?;
250+
250251
let mut solver = solve::Solver::default();
251252
solver.update_options(option_map);
253+
252254
for (name, repo) in self.repos.get_repos_for_non_destructive_operation().await? {
253255
tracing::debug!(repo=%name, "using repository");
254256
solver.add_repository(repo);
@@ -264,9 +266,6 @@ impl Solver {
264266
self.check_impossible_builds || self.check_impossible_all,
265267
);
266268

267-
for r in options.get_var_requests()? {
268-
solver.add_request(r.into());
269-
}
270269
Ok(solver)
271270
}
272271
}
@@ -391,34 +390,42 @@ impl Requests {
391390
Ok(idents)
392391
}
393392

394-
/// Parse and build a request from the given string and these flags
393+
/// Parse and build a request, and any extra options, from the
394+
/// given string and these flags. If the request expands into
395+
/// multiple requests, such as from a request file, this will
396+
/// return the last request. Any options returned are filtered to
397+
/// exclude any (override) options given in the options parameter.
395398
pub async fn parse_request<R: AsRef<str>>(
396399
&self,
397400
request: R,
398401
options: &Options,
399402
repos: &[Arc<storage::RepositoryHandle>],
400-
) -> Result<Request> {
401-
Ok(self
403+
) -> Result<(Request, OptionMap)> {
404+
let (mut requests, extra_options) = self
402405
.parse_requests([request.as_ref()], options, repos)
403-
.await?
404-
.pop()
405-
.unwrap())
406+
.await?;
407+
let last_request = requests.pop().unwrap();
408+
Ok((last_request, extra_options))
406409
}
407410

408-
/// Parse and build requests from the given strings and these flags.
411+
/// Parse and build requests, and any extra options, from the
412+
/// given strings and these flags. Any options returned are
413+
/// filtered to exclude any (override) options given in the
414+
/// options parameter.
409415
pub async fn parse_requests<I, S>(
410416
&self,
411417
requests: I,
412418
options: &Options,
413419
repos: &[Arc<storage::RepositoryHandle>],
414-
) -> Result<Vec<Request>>
420+
) -> Result<(Vec<Request>, OptionMap)>
415421
where
416422
I: IntoIterator<Item = S>,
417423
S: AsRef<str>,
418424
{
419425
let mut out = Vec::<Request>::new();
420426
let override_options = options.get_options()?;
421427
let mut templating_options = override_options.clone();
428+
let mut extra_options = OptionMap::default();
422429

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

440-
for request in requests_from_file.requirements {
441-
// First, add all the requests, pkg and var, to
442-
// the requests lists
443-
out.push(request.clone());
444-
445-
// Then, add any var requests to the templating
446-
// options for use with subsequent requests files
447-
// or package@stage spec files read in later
448-
// iterations of the outer loop
449-
if let Some(var) = request.into_var() {
450-
// There is no command line override
451-
// option for this name so can update it.
452-
if override_options.get(&var.var).is_none() {
453-
// Forcing a var request into an option
454-
templating_options.insert(
455-
var.var,
456-
var.value.as_pinned().unwrap_or_default().to_string(),
457-
);
458-
}
447+
out.extend(requests_from_file.requirements);
448+
449+
for (name, value) in requests_from_file.options {
450+
// Command line override options take precedence.
451+
// Only when there is no command line override for
452+
// this option name is it used
453+
if override_options.get(&name).is_none() {
454+
// For template values in later files and specs
455+
templating_options.insert(OptName::new(&name)?.into(), value.clone());
456+
// For later use by commands, usually when
457+
// setting up a solver
458+
extra_options.insert(OptName::new(&name)?.into(), value);
459459
}
460460
}
461461

@@ -474,7 +474,7 @@ impl Requests {
474474
)
475475
.into())
476476
} else {
477-
Ok(out)
477+
Ok((out, extra_options))
478478
}
479479
}
480480

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
@@ -424,7 +424,7 @@ impl View {
424424
let solver = self.solver.get_solver(&self.options).await?;
425425
let repos = solver.repositories();
426426

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

567-
let request = match self
567+
// _extra_option are unused here because getting package info
568+
// from a solve is basically deprecated and should be removed soon.
569+
let (request, _extra_options) = match self
568570
.requests
569571
.parse_request(&package, &self.options, solver.repositories())
570572
.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)