Skip to content

Commit

Permalink
derivations: don't break on dynamicDerivations
Browse files Browse the repository at this point in the history
  • Loading branch information
urbas committed Mar 16, 2024
1 parent 3a9966d commit 46ffb8e
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 26 deletions.
14 changes: 7 additions & 7 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/building/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ fn get_mount_paths(config: &BuildConfig) -> Result<HashSet<PathBuf>, String> {
let mut mount_paths = HashSet::new();
for (drv_path, outputs) in &config.derivation.input_drvs {
let derivation = load_derivation(drv_path)?;
for output in outputs {
for output in &outputs.outputs {
let drv_output = derivation.outputs.get(output).ok_or_else(|| {
format!("Could not find output '{output}' of derivation {drv_path}")
})?;
Expand Down
20 changes: 15 additions & 5 deletions src/derivations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub struct Derivation {
pub args: Vec<String>,
pub builder: String,
pub env: BTreeMap<String, String>,
pub input_drvs: BTreeMap<String, BTreeSet<String>>,
pub input_drvs: BTreeMap<String, InputDrv>,
pub input_srcs: BTreeSet<String>,
pub outputs: BTreeMap<String, DerivationOutput>,
pub system: String,
Expand All @@ -24,6 +24,13 @@ pub struct DerivationOutput {
pub path: String,
}

#[derive(Deserialize, Serialize, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct InputDrv {
pub dynamic_outputs: BTreeMap<String, InputDrv>,
pub outputs: BTreeSet<String>,
}

pub fn load_derivation(drv_path: &str) -> Result<Derivation, String> {
let content = fs::read_to_string(drv_path)
.map_err(|err| format!("Failed to read '{}': {}", drv_path, err))?;
Expand Down Expand Up @@ -71,14 +78,14 @@ fn write_outputs(

fn write_input_drvs(
writer: &mut impl Write,
input_drvs: &BTreeMap<String, BTreeSet<String>>,
input_drvs: &BTreeMap<String, InputDrv>,
) -> std::io::Result<()> {
write_iter(writer, &mut input_drvs.iter(), |writer, entry| {
let (drv_path, drv_outputs) = entry;
let (drv_path, input_drv) = entry;
write!(writer, "(")?;
write_string(writer, drv_path)?;
write!(writer, ",")?;
write_iter(writer, &mut drv_outputs.iter(), write_string)?;
write_iter(writer, &mut input_drv.outputs.iter(), write_string)?;
write!(writer, ")")
})
}
Expand Down Expand Up @@ -167,7 +174,10 @@ mod tests {
env: BTreeMap::from([("var1".to_owned(), "val1".to_owned())]),
input_drvs: BTreeMap::from([(
"foo.drv".to_owned(),
BTreeSet::from(["out".to_owned()]),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: BTreeSet::from(["out".to_owned()]),
},
)]),
input_srcs: BTreeSet::from(["/foo.txt".to_owned()]),
outputs: BTreeMap::from([(
Expand Down
44 changes: 37 additions & 7 deletions src/parsers/derivations.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::derivations::{Derivation, DerivationOutput};
use crate::derivations::{Derivation, DerivationOutput, InputDrv};
use nom::branch::alt;
use nom::bytes::complete::{is_not, tag};
use nom::character::complete::char;
Expand Down Expand Up @@ -88,7 +88,7 @@ fn parse_string(input: &str) -> IResult<&str, String> {
delimited(char('"'), parse_string_inside_quotes, char('"'))(input)
}

fn parse_input_derivations(input: &str) -> IResult<&str, BTreeMap<String, BTreeSet<String>>> {
fn parse_input_derivations(input: &str) -> IResult<&str, BTreeMap<String, InputDrv>> {
let input_derivations = fold_many0(
tuple((
char('('),
Expand All @@ -100,7 +100,13 @@ fn parse_input_derivations(input: &str) -> IResult<&str, BTreeMap<String, BTreeS
)),
BTreeMap::new,
|mut input_drvs, (_, drv, _, input_type, _, _)| {
input_drvs.insert(drv, input_type);
input_drvs.insert(
drv,
InputDrv {
dynamic_outputs: BTreeMap::new(), // TODO (): add support for dynamic outputs
outputs: input_type,
},
);
input_drvs
},
);
Expand Down Expand Up @@ -204,8 +210,20 @@ mod tests {
.into_iter()
.collect(),
input_drvs: vec![
("/drv1".to_owned(), to_string_set(&["out"])),
("/drv2".to_owned(), to_string_set(&["dev"])),
(
"/drv1".to_owned(),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: to_string_set(&["out"]),
},
),
(
"/drv2".to_owned(),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: to_string_set(&["dev"]),
},
),
]
.into_iter()
.collect(),
Expand Down Expand Up @@ -282,8 +300,20 @@ mod tests {
fn test_parse_input_derivations() {
let actual = parse_input_derivations(r#"[("a",["b","c"]),("e",["f","g"])]"#);
let expected = vec![
("a".to_owned(), to_string_set(&["b", "c"])),
("e".to_owned(), to_string_set(&["f", "g"])),
(
"a".to_owned(),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: to_string_set(&["b", "c"]),
},
),
(
"e".to_owned(),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: to_string_set(&["f", "g"]),
},
),
];
assert_eq!(actual, Ok(("", expected.into_iter().collect())));
}
Expand Down
19 changes: 14 additions & 5 deletions tests/cmd/build_derivation.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::test_utils::tmp_file;
use assert_cmd::prelude::*;
use predicates::prelude::*;
use rix::derivations::{load_derivation, save_derivation, Derivation, DerivationOutput};
use rix::derivations::{load_derivation, save_derivation, Derivation, DerivationOutput, InputDrv};
use std::collections::{BTreeMap, BTreeSet};
use std::fs::{read_to_string, File};
use std::os::unix::fs::PermissionsExt;
Expand Down Expand Up @@ -93,7 +93,10 @@ fn build_derivation_missing_deps(test_data: &TestData) {
&vec![],
BTreeMap::from([(
test_data.busybox_drv_path.clone(),
BTreeSet::from(["out".to_owned()]),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: BTreeSet::from(["out".to_owned()]),
},
)]),
BTreeMap::from([(
"PATH".to_owned(),
Expand Down Expand Up @@ -178,11 +181,17 @@ fn simple_derivation(
BTreeMap::from([
(
test_data.coreutils_drv_path.clone(),
BTreeSet::from(["out".to_owned()]),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: BTreeSet::from(["out".to_owned()]),
},
),
(
test_data.busybox_drv_path.clone(),
BTreeSet::from(["out".to_owned()]),
InputDrv {
dynamic_outputs: BTreeMap::new(),
outputs: BTreeSet::from(["out".to_owned()]),
},
),
]),
BTreeMap::from([(
Expand All @@ -198,7 +207,7 @@ fn test_derivation(
builder_script: &str,
builder: &str,
input_srcs: &Vec<String>,
input_drvs: BTreeMap<String, BTreeSet<String>>,
input_drvs: BTreeMap<String, InputDrv>,
mut env: BTreeMap<String, String>,
) -> Derivation {
let builder_script_file = tmp_file(&src_dir, "builder.sh", builder_script);
Expand Down
2 changes: 1 addition & 1 deletion tests/cmd/show_derivation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ fn show_derivation() {
let expected_output: Value = serde_json::from_str(format!(
"{{\"{}\":{}}}",
&derivation_path,
r#"{"args":["-e","/builder.sh"],"builder":"/bash","env":{"ENV1":"val1","ENV2":"val2"},"inputDrvs":{"/drv2":["dev"],"/drv1":["out"]},"inputSrcs":["/builder.sh"],"outputs":{"out":{"hash":"abc","hashAlgo":"sha256","path":"/foo"}},"system":"x86_64-linux"}"#,
r#"{"args":["-e","/builder.sh"],"builder":"/bash","env":{"ENV1":"val1","ENV2":"val2"},"inputDrvs":{"/drv2":{"dynamicOutputs":{},"outputs":["dev"]},"/drv1":{"dynamicOutputs":{},"outputs":["out"]}},"inputSrcs":["/builder.sh"],"outputs":{"out":{"hash":"abc","hashAlgo":"sha256","path":"/foo"}},"system":"x86_64-linux"}"#,
).as_str()).unwrap();

let cmd_result = Command::cargo_bin("rix")
Expand Down

0 comments on commit 46ffb8e

Please sign in to comment.