Handle nix output better.
This commit is contained in:
parent
9bd82bc098
commit
1cce38559c
1 changed files with 12 additions and 19 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Context, Result};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs::DirBuilder;
|
use std::fs::DirBuilder;
|
||||||
|
|
@ -20,7 +20,7 @@ pub fn generate(flake_uri: &str) -> Result<StorePath> {
|
||||||
let profile_name = Path::new(PROFILE_NAME);
|
let profile_name = Path::new(PROFILE_NAME);
|
||||||
|
|
||||||
log::info!("Creating new generation from {}", store_path);
|
log::info!("Creating new generation from {}", store_path);
|
||||||
install_nix_profile(&store_path, profile_dir, profile_name).map(print_out_and_err)?;
|
install_nix_profile(&store_path, profile_dir, profile_name)?;
|
||||||
|
|
||||||
log::info!("Registering GC root...");
|
log::info!("Registering GC root...");
|
||||||
create_gcroot(GCROOT_PATH, &profile_dir.join(profile_name))?;
|
create_gcroot(GCROOT_PATH, &profile_dir.join(profile_name))?;
|
||||||
|
|
@ -42,14 +42,16 @@ fn install_nix_profile(
|
||||||
store_path: &StorePath,
|
store_path: &StorePath,
|
||||||
profile_dir: &Path,
|
profile_dir: &Path,
|
||||||
profile_name: &Path,
|
profile_name: &Path,
|
||||||
) -> Result<process::Output> {
|
) -> Result<process::ExitStatus> {
|
||||||
DirBuilder::new().recursive(true).create(profile_dir)?;
|
DirBuilder::new().recursive(true).create(profile_dir)?;
|
||||||
process::Command::new("nix-env")
|
process::Command::new("nix-env")
|
||||||
.arg("--profile")
|
.arg("--profile")
|
||||||
.arg(profile_dir.join(profile_name))
|
.arg(profile_dir.join(profile_name))
|
||||||
.arg("--set")
|
.arg("--set")
|
||||||
.arg(&store_path.store_path)
|
.arg(&store_path.store_path)
|
||||||
.output()
|
.stdout(process::Stdio::inherit())
|
||||||
|
.stderr(process::Stdio::inherit())
|
||||||
|
.status()
|
||||||
.map_err(anyhow::Error::from)
|
.map_err(anyhow::Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,7 +78,8 @@ fn get_store_path(nix_build_result: process::Output) -> Result<StorePath> {
|
||||||
|
|
||||||
fn parse_nix_build_output(output: String) -> Result<StorePath> {
|
fn parse_nix_build_output(output: String) -> Result<StorePath> {
|
||||||
let expected_output_name = "out";
|
let expected_output_name = "out";
|
||||||
let results: Vec<NixBuildOutput> = serde_json::from_str(&output)?;
|
let results: Vec<NixBuildOutput> =
|
||||||
|
serde_json::from_str(&output).context("Error reading nix build output")?;
|
||||||
|
|
||||||
if let [result] = results.as_slice() {
|
if let [result] = results.as_slice() {
|
||||||
if let Some(store_path) = result.outputs.get(expected_output_name) {
|
if let Some(store_path) = result.outputs.get(expected_output_name) {
|
||||||
|
|
@ -97,20 +100,10 @@ fn run_nix_build(flake_uri: &str, flake_attr: &str) -> Result<process::Output> {
|
||||||
.arg("build")
|
.arg("build")
|
||||||
.arg(format!("{flake_uri}#{flake_attr}"))
|
.arg(format!("{flake_uri}#{flake_attr}"))
|
||||||
.arg("--json")
|
.arg("--json")
|
||||||
|
// Nix outputs progress info on stderr and the final output on stdout,
|
||||||
|
// so we inherit and output stderr directly to the terminal, but we
|
||||||
|
// capture stdout as the result of this call
|
||||||
|
.stderr(process::Stdio::inherit())
|
||||||
.output()
|
.output()
|
||||||
.map_err(anyhow::Error::from)
|
.map_err(anyhow::Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_out_and_err(output: process::Output) -> process::Output {
|
|
||||||
print_u8(&output.stdout);
|
|
||||||
print_u8(&output.stderr);
|
|
||||||
output
|
|
||||||
}
|
|
||||||
|
|
||||||
fn print_u8(bytes: &[u8]) {
|
|
||||||
str::from_utf8(bytes).map_or((), |s| {
|
|
||||||
if !s.trim().is_empty() {
|
|
||||||
log::info!("{}", s.trim())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue