Handle flake URIs ending in #

This commit is contained in:
R-VdP 2023-03-15 20:43:04 +01:00
parent 25ac812c53
commit 126cad884b
No known key found for this signature in database

View file

@ -63,9 +63,15 @@ pub fn build(flake_uri: &str) -> Result<StorePath> {
} }
fn find_flake_attr(flake_uri: &str) -> Result<Cow<'_, str>> { fn find_flake_attr(flake_uri: &str) -> Result<Cow<'_, str>> {
if flake_uri.contains('#') { let flake_uri = flake_uri.trim_end_matches('#');
let status = try_flake_attr(flake_uri)?; let hash_count = flake_uri.match_indices('#').count();
return if status {
if hash_count > 1 {
anyhow::bail!("Invalid flake URI!");
}
if hash_count == 1 {
return if try_flake_attr(flake_uri)? {
Ok(flake_uri.into()) Ok(flake_uri.into())
} else { } else {
anyhow::bail!( anyhow::bail!(
@ -78,13 +84,11 @@ fn find_flake_attr(flake_uri: &str) -> Result<Cow<'_, str>> {
let hostname = nix::unistd::gethostname()?; let hostname = nix::unistd::gethostname()?;
let full_uri = format!("{flake_uri}#{FLAKE_ATTR}.{}", hostname.to_string_lossy()); let full_uri = format!("{flake_uri}#{FLAKE_ATTR}.{}", hostname.to_string_lossy());
let status = try_flake_attr(&full_uri)?; if try_flake_attr(&full_uri)? {
if status {
return Ok(full_uri.into()); return Ok(full_uri.into());
} else { } else {
let full_uri = format!("{flake_uri}#{FLAKE_ATTR}.default"); let full_uri = format!("{flake_uri}#{FLAKE_ATTR}.default");
let status = try_flake_attr(&full_uri)?; if try_flake_attr(&full_uri)? {
if status {
return Ok(full_uri.into()); return Ok(full_uri.into());
}; };
}; };
@ -94,12 +98,12 @@ fn find_flake_attr(flake_uri: &str) -> Result<Cow<'_, str>> {
fn try_flake_attr(flake_uri: &str) -> Result<bool> { fn try_flake_attr(flake_uri: &str) -> Result<bool> {
log::info!("Trying flake URI: {flake_uri}..."); log::info!("Trying flake URI: {flake_uri}...");
let status = try_nix_eval(flake_uri)?; let status = try_nix_eval(flake_uri)?;
if status.success() { if status {
log::info!("Success, using {flake_uri}"); log::info!("Success, using {flake_uri}");
} else { } else {
log::info!("Attribute {flake_uri} not found in flake."); log::info!("Attribute {flake_uri} not found in flake.");
}; };
Ok(status.success()) Ok(status)
} }
fn get_store_path(nix_build_result: process::Output) -> Result<StorePath> { fn get_store_path(nix_build_result: process::Output) -> Result<StorePath> {
@ -144,13 +148,20 @@ fn run_nix_build(flake_uri: &str) -> Result<process::Output> {
Ok(output) Ok(output)
} }
fn try_nix_eval(flake_uri: &str) -> Result<process::ExitStatus> { fn try_nix_eval(flake_uri: &str) -> Result<bool> {
let status = process::Command::new("nix") let output = process::Command::new("nix")
.arg("eval") .arg("eval")
.arg(flake_uri) .arg(flake_uri)
.arg("--json") .arg("--json")
.stdout(process::Stdio::null()) .arg("--apply")
.arg("a: a ? outPath")
.stderr(process::Stdio::null()) .stderr(process::Stdio::null())
.status()?; .output()?;
Ok(status) if output.status.success() {
let stdout = String::from_utf8(output.stdout)?;
let parsed_output: bool = serde_json::from_str(&stdout)?;
Ok(parsed_output)
} else {
Ok(false)
}
} }