Handle flake URIs ending in #
This commit is contained in:
parent
25ac812c53
commit
126cad884b
1 changed files with 25 additions and 14 deletions
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue