feat: parse installables
Some checks failed
conventional commits / conventional commits (push) Successful in 10s
build / run (push) Successful in 54s
check / run (push) Failing after 1m4s

Signed-off-by: Christina Sørensen <christina@cafkafk.com>
This commit is contained in:
Christina Sørensen 2024-09-12 11:56:04 +02:00
parent 419976d275
commit e949478754
Signed by: cafkafk
GPG key ID: 26C542FD97F965CE
3 changed files with 34 additions and 6 deletions

View file

@ -6,12 +6,15 @@
use clap::{arg, command, crate_authors, value_parser, ArgAction, Command};
const DEFAULT_CACHE: &str = "cache.nixos.org";
const DEFAULT_INSTALLABLE: &str = "./#nixosConfigurations.{}.config.system.build.toplevel";
pub fn build_cli() -> Command {
command!()
.author(crate_authors!("\n"))
// TODO: parse multiple installables, like e.g. build does?
.arg(arg!([installable] "A nix installable").required(false))
.arg(
arg!(--cache <CACHE> "check a specific cache")
arg!(--cache <CACHE> "Check a specific cache")
.required(false)
.default_value(DEFAULT_CACHE),
)

View file

@ -103,7 +103,11 @@ async fn main() -> io::Result<()> {
.build()
.unwrap();
let binding = get_requisites(&host_name, &config_dir);
let binding = get_requisites(
&host_name,
&config_dir,
matches.get_one::<String>("installable").cloned(),
);
let get_requisites_duration = initial_time.elapsed().as_secs();

View file

@ -9,8 +9,9 @@ use std::{
process::{Command, Stdio},
};
pub fn get_requisites(host: &str, config_dir: &str) -> String {
let get_drv_path = Command::new("nix")
/// Get nixosConfiguration derivation path
fn get_config_drv_path(host: &str, config_dir: &str) -> std::io::Result<std::process::Output> {
Command::new("nix")
.current_dir(Path::new(config_dir))
.args([
"build",
@ -23,10 +24,30 @@ pub fn get_requisites(host: &str, config_dir: &str) -> String {
"--json",
])
.output()
.unwrap();
}
/// Get installable derivation path
fn get_installable_drv_path(
host: &str,
config_dir: &str,
installable: &str,
) -> std::io::Result<std::process::Output> {
Command::new("nix")
.current_dir(Path::new(config_dir))
.args(["build", "--quiet", installable, "--dry-run", "--json"])
.output()
}
pub fn get_requisites(host: &str, config_dir: &str, installable: Option<String>) -> String {
let mut drv_path;
if let Some(installable) = installable {
drv_path = get_installable_drv_path(host, config_dir, &installable).unwrap();
} else {
drv_path = get_config_drv_path(host, config_dir).unwrap();
}
let drv_path_json: Value =
serde_json::from_str(&String::from_utf8(get_drv_path.stdout).unwrap()).unwrap();
serde_json::from_str(&String::from_utf8(drv_path.stdout).unwrap()).unwrap();
let drv_path = drv_path_json[0]["drvPath"].clone();
log::debug!("drv_path: {}", &drv_path);