diff --git a/flake.lock b/flake.lock index f4d9dcb..bfbc1d4 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1707640111, - "narHash": "sha256-H4VMvxvN2+l0gZalvFyxEALWlYjZm1+Vh6m3VEFs/mU=", + "lastModified": 1710594015, + "narHash": "sha256-BKIXMkATIQyWFgCgo9n2UXmB1+y+7VlAEiBcP9kHelQ=", "owner": "urbas", "repo": "nixjs-rt", - "rev": "d01121bab47082d1986f00c88cbb887890d5b69f", + "rev": "86062bad9cf77692c91ad07c8708278c2721f587", "type": "github" }, "original": { @@ -35,11 +35,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1688829822, - "narHash": "sha256-hv56yK1fPHPt7SU2DboxBtdSbIuv9nym7Dss7Cn2jic=", + "lastModified": 1710534455, + "narHash": "sha256-huQT4Xs0y4EeFKn2BTBVYgEwJSv8SDlm82uWgMnCMmI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ed6afb10dfdfc97b6bcf0703f1bad8118e9e961b", + "rev": "9af9c1c87ed3e3ed271934cb896e0cdd33dae212", "type": "github" }, "original": { @@ -57,4 +57,4 @@ }, "root": "root", "version": 7 -} +} \ No newline at end of file diff --git a/src/building/mod.rs b/src/building/mod.rs index 9243186..fc85518 100644 --- a/src/building/mod.rs +++ b/src/building/mod.rs @@ -102,7 +102,7 @@ fn get_mount_paths(config: &BuildConfig) -> Result, 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}") })?; diff --git a/src/derivations.rs b/src/derivations.rs index 42674e5..bb83dd0 100644 --- a/src/derivations.rs +++ b/src/derivations.rs @@ -10,7 +10,7 @@ pub struct Derivation { pub args: Vec, pub builder: String, pub env: BTreeMap, - pub input_drvs: BTreeMap>, + pub input_drvs: BTreeMap, pub input_srcs: BTreeSet, pub outputs: BTreeMap, pub system: String, @@ -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, + pub outputs: BTreeSet, +} + pub fn load_derivation(drv_path: &str) -> Result { let content = fs::read_to_string(drv_path) .map_err(|err| format!("Failed to read '{}': {}", drv_path, err))?; @@ -71,14 +78,14 @@ fn write_outputs( fn write_input_drvs( writer: &mut impl Write, - input_drvs: &BTreeMap>, + input_drvs: &BTreeMap, ) -> 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, ")") }) } @@ -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([( diff --git a/src/parsers/derivations.rs b/src/parsers/derivations.rs index 4ba1d9b..59220a7 100644 --- a/src/parsers/derivations.rs +++ b/src/parsers/derivations.rs @@ -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; @@ -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>> { +fn parse_input_derivations(input: &str) -> IResult<&str, BTreeMap> { let input_derivations = fold_many0( tuple(( char('('), @@ -100,7 +100,13 @@ fn parse_input_derivations(input: &str) -> IResult<&str, BTreeMap, - input_drvs: BTreeMap>, + input_drvs: BTreeMap, mut env: BTreeMap, ) -> Derivation { let builder_script_file = tmp_file(&src_dir, "builder.sh", builder_script); diff --git a/tests/cmd/show_derivation.rs b/tests/cmd/show_derivation.rs index 0c67b2c..46de284 100644 --- a/tests/cmd/show_derivation.rs +++ b/tests/cmd/show_derivation.rs @@ -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")