diff --git a/crates/nix-weather/src/nix.rs b/crates/nix-weather/src/nix.rs index 772a2f3..dd1fe30 100644 --- a/crates/nix-weather/src/nix.rs +++ b/crates/nix-weather/src/nix.rs @@ -10,6 +10,7 @@ use std::{ }; /// Get nixosConfiguration derivation path +#[inline] fn get_config_drv_path(host: &str, config_dir: &str) -> std::io::Result { Command::new("nix") .current_dir(Path::new(config_dir)) @@ -27,6 +28,7 @@ fn get_config_drv_path(host: &str, config_dir: &str) -> std::io::Result std::io::Result { + Command::new("nix-store") + .args(["--query", "--requisites", drv_path]) + .stdout(Stdio::piped()) + .spawn() +} + +/// Turns requisites into hashes +#[inline] +fn requisites_to_hashes( + drv_requisites: std::process::Child, +) -> std::io::Result { + let drv_requisites_remove_base = Command::new("cut") + .args(["-d", "/", "-f4"]) + .stdin(Stdio::from(drv_requisites.stdout.unwrap())) + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + Command::new("cut") + .args(["-d", "-", "-f1"]) + .stdin(Stdio::from(drv_requisites_remove_base.stdout.unwrap())) + .stdout(Stdio::piped()) + .spawn() +} + pub fn get_requisites(host: &str, config_dir: &str, installable: Option) -> String { + // If the users specified an installable, we interpret that, instead of trying + // to guess their config location. let mut drv_path; if let Some(installable) = installable { drv_path = get_installable_drv_path(host, config_dir, &installable).unwrap(); @@ -51,23 +82,16 @@ pub fn get_requisites(host: &str, config_dir: &str, installable: Option) log::debug!("drv_path: {}", &drv_path); - let get_drv_requisites = Command::new("nix-store") - .args(["--query", "--requisites", drv_path.as_str().unwrap()]) - .stdout(Stdio::piped()) - .spawn() - .unwrap(); - let drv_requisites_remove_base = Command::new("cut") - .args(["-d", "/", "-f4"]) - .stdin(Stdio::from(get_drv_requisites.stdout.unwrap())) - .stdout(Stdio::piped()) - .spawn() - .unwrap(); - let drv_requisites_to_hash = Command::new("cut") - .args(["-d", "-", "-f1"]) - .stdin(Stdio::from(drv_requisites_remove_base.stdout.unwrap())) - .stdout(Stdio::piped()) - .spawn() - .unwrap(); + let drv_requisites = get_requisites_from_drv_path(drv_path.as_str().unwrap()).unwrap(); - String::from_utf8(drv_requisites_to_hash.wait_with_output().unwrap().stdout).unwrap() + let drv_requisite_hashes = requisites_to_hashes(drv_requisites); + + String::from_utf8( + drv_requisite_hashes + .unwrap() + .wait_with_output() + .unwrap() + .stdout, + ) + .unwrap() }