Add parsing and finding the failed derivation

Signed-off-by: Marcel Müller <neikos@neikos.email>
This commit is contained in:
Marcel Müller 2026-01-10 12:13:18 +01:00
parent a7986584d5
commit 85c6a8f169
9 changed files with 985 additions and 76 deletions

View file

@ -6,6 +6,17 @@ license.workspace = true
authors.workspace = true
readme.workspace = true
[[test]]
name = "sample-logs"
harness = false
[dependencies]
serde.workspace = true
serde_json.workspace = true
serde_repr.workspace = true
thiserror = { workspace = true }
displaydoc = { workspace = true }
itertools = "0.14"
[dev-dependencies]
datatest-stable.workspace = true

184
nix-json/src/helpers.rs Normal file
View file

@ -0,0 +1,184 @@
use std::collections::HashMap;
use displaydoc::Display;
use itertools::Itertools;
use thiserror::Error;
use crate::NixBuildLogLine;
#[derive(Debug, PartialEq, Eq)]
pub enum LogBuildState {
NotStarted,
Started,
Failed,
Succeeded,
}
#[derive(Debug)]
pub struct LogBuildStatus {
state: LogBuildState,
store_path: String,
log_lines: Vec<String>,
}
impl LogBuildStatus {
pub fn is_failed(&self) -> bool {
self.state != LogBuildState::Succeeded
}
pub fn log_lines(&self) -> &[String] {
&self.log_lines
}
}
/// Accumulated build status of different nix-builds
///
/// This helper can ingest [`NixBuildLogLine`] and keep track of the state of whatever is
/// being built. It then potentially emits note-events one can then use in their tool to respond to
/// various statuses
#[derive(Debug, Default)]
pub struct NixBuildState {
raw_log_lines: Vec<NixBuildLogLine>,
builds: HashMap<u64, LogBuildStatus>,
actions: HashMap<u64, Vec<NixBuildLogLine>>,
build_succeeded: Option<bool>,
next_stop_is_cause: bool,
}
#[derive(Debug, Error, Display)]
pub enum NixBuildStateError {
/// An error occured while parsing a log line
JsonParse(serde_json::Error),
}
impl NixBuildState {
pub fn from_log_lines(log_lines: impl AsRef<str>) -> Result<NixBuildState, NixBuildStateError> {
let lines: Vec<NixBuildLogLine> = log_lines
.as_ref()
.trim()
.lines()
.map(|line| {
serde_json::from_str(line.trim().trim_start_matches("@nix "))
.map_err(NixBuildStateError::JsonParse)
})
.collect::<Result<_, _>>()?;
let mut state = NixBuildState::default();
lines.into_iter().for_each(|line| {
state.handle_log_line(line);
});
Ok(state)
}
pub fn handle_log_line(&mut self, log_line: NixBuildLogLine) -> Option<NixBuildEvent> {
self.raw_log_lines.push(log_line.clone());
if let Some(id) = log_line.id() {
let entry = self.actions.entry(id).or_default();
entry.push(log_line.clone());
}
match log_line {
NixBuildLogLine::Start(nix_log_start_action) => {
self.handle_start_action(nix_log_start_action)
}
NixBuildLogLine::Stop(nix_log_stop_action) => {
self.handle_stop_action(nix_log_stop_action)
}
NixBuildLogLine::Result(nix_log_result_action) => {
self.handle_result_action(nix_log_result_action)
}
NixBuildLogLine::Msg(nix_log_msg_action) => self.handle_log_action(nix_log_msg_action),
}
}
pub fn is_failed(&self) -> bool {
self.build_succeeded != Some(true)
}
fn handle_start_action(
&mut self,
nix_log_start_action: crate::NixLogStartAction,
) -> Option<NixBuildEvent> {
match nix_log_start_action.kind {
crate::ActivityKind::Build => {
self.builds.insert(
nix_log_start_action.id,
LogBuildStatus {
state: LogBuildState::Started,
store_path: nix_log_start_action.fields[0].as_str().unwrap().to_string(),
log_lines: vec![],
},
);
None
}
_ => None,
}
}
fn handle_stop_action(
&mut self,
nix_log_stop_action: crate::NixLogStopAction,
) -> Option<NixBuildEvent> {
let log_build_status = self.builds.get_mut(&nix_log_stop_action.id)?;
if self.next_stop_is_cause {
self.next_stop_is_cause = false;
log_build_status.state = LogBuildState::Failed;
} else if log_build_status.state == LogBuildState::Started {
log_build_status.state = LogBuildState::Succeeded;
}
None
}
fn handle_result_action(
&mut self,
nix_log_result_action: crate::NixLogResultAction,
) -> Option<NixBuildEvent> {
match nix_log_result_action.kind {
crate::ResultKind::FileLinked => {}
crate::ResultKind::BuildLogLine => {}
crate::ResultKind::UntrustedPath => {}
crate::ResultKind::CorruptedPath => {}
crate::ResultKind::SetPhase => {}
crate::ResultKind::Progress => {
let Some((_done, _expected, _running, failed)) = nix_log_result_action
.fields
.iter()
.map(|field| field.as_u64().unwrap())
.collect_tuple()
else {
panic!("Unexpected amount of fields for progress");
};
if failed > 0 {
self.build_succeeded = Some(false);
self.next_stop_is_cause = true;
}
}
crate::ResultKind::SetExpected => {}
crate::ResultKind::PostBuildLogLine => {}
crate::ResultKind::FetchStatus => {}
}
None
}
fn handle_log_action(
&self,
nix_log_msg_action: crate::NixLogMsgAction,
) -> Option<NixBuildEvent> {
None
}
pub fn get_derivation(&self, drv: &str) -> Option<&LogBuildStatus> {
self.builds.values().find(|b| b.store_path == drv)
}
}
pub enum NixBuildEvent {}

View file

@ -1,49 +1,106 @@
use std::collections::HashMap;
use serde::Deserialize;
use serde_repr::Deserialize_repr;
#[derive(Debug, Deserialize)]
pub mod helpers;
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "action", rename_all = "lowercase")]
pub enum NixBuildLogLine {
Start(NixLogStartAction),
Stop(NixLogStartAction),
Stop(NixLogStopAction),
Result(NixLogResultAction),
Msg(NixLogMsgAction),
}
#[derive(Debug, Deserialize)]
impl NixBuildLogLine {
pub fn id(&self) -> Option<u64> {
match self {
NixBuildLogLine::Start(NixLogStartAction { id, .. })
| NixBuildLogLine::Stop(NixLogStopAction { id })
| NixBuildLogLine::Result(NixLogResultAction { id, .. }) => Some(*id),
NixBuildLogLine::Msg(..) => None,
}
}
}
/// What kind of activity was logged
///
/// This definition mirrors the one in nixcpp. As it can evolve, the enum is marked as
/// `non_exhaustive` and may get extended later on.
#[derive(Debug, Clone, Copy, Deserialize_repr, PartialEq, Eq, Hash)]
#[repr(u32)]
#[non_exhaustive]
pub enum ActivityKind {
Unknown = 0,
CopyPath = 100,
FileTransfer = 101,
Realise = 102,
CopyPaths = 103,
Builds = 104,
Build = 105,
OptimiseStore = 106,
VerifyPaths = 107,
Substitute = 108,
QueryPathInfo = 109,
PostBuildHook = 110,
BuildWaiting = 111,
FetchTree = 112,
}
/// What kind of result information was logged
///
/// This definition mirrors the one in nixcpp. As it can evolve, the enum is marked as
/// `non_exhaustive` and may get extended later on.
#[derive(Debug, Clone, Copy, Deserialize_repr, PartialEq, Eq, Hash)]
#[repr(u32)]
#[non_exhaustive]
pub enum ResultKind {
FileLinked = 100,
BuildLogLine = 101,
UntrustedPath = 102,
CorruptedPath = 103,
SetPhase = 104,
Progress = 105,
SetExpected = 106,
PostBuildLogLine = 107,
FetchStatus = 108,
}
#[derive(Debug, Clone, Deserialize)]
pub struct NixLogResultAction {
pub id: i64,
pub id: u64,
#[serde(rename = "type")]
pub kind: i64,
pub kind: ResultKind,
#[serde(default)]
pub fields: Vec<serde_json::Value>,
}
#[derive(Debug, Deserialize)]
#[derive(Debug, Clone, Deserialize)]
pub struct NixLogStopAction {
pub id: i64,
pub id: u64,
}
#[derive(Debug, Deserialize)]
#[derive(Debug, Clone, Deserialize)]
pub struct NixLogMsgAction {
pub level: Option<i64>,
pub msg: String,
}
#[derive(Debug, Deserialize)]
#[derive(Debug, Clone, Deserialize)]
pub struct NixLogStartAction {
pub id: i64,
pub level: Option<i64>,
pub parent: Option<i64>,
pub id: u64,
pub level: i64,
pub parent: i64,
pub text: Option<String>,
#[serde(rename = "type")]
pub kind: Option<i64>,
pub kind: ActivityKind,
#[serde(default)]
pub fields: Vec<serde_json::Value>,
}
#[derive(Debug, Deserialize)]
#[derive(Debug, Clone, Deserialize)]
pub struct RawNixDerivationInfoOutput(HashMap<String, RawNixDerivationInfo>);
impl RawNixDerivationInfoOutput {
@ -52,45 +109,15 @@ impl RawNixDerivationInfoOutput {
}
}
#[derive(Debug, Deserialize)]
#[derive(Debug, Clone, Deserialize)]
pub struct RawNixDerivationInfo {
args: Vec<String>,
builder: String,
pub args: Vec<String>,
pub builder: String,
#[serde(rename = "inputDrvs")]
input_derivations: HashMap<String, serde_json::Value>,
pub input_derivations: HashMap<String, serde_json::Value>,
#[serde(rename = "inputSrcs")]
input_sources: Vec<String>,
name: String,
outputs: HashMap<String, HashMap<String, String>>,
system: String,
}
impl RawNixDerivationInfo {
pub fn args(&self) -> &[String] {
&self.args
}
pub fn builder(&self) -> &str {
&self.builder
}
pub fn input_derivations(&self) -> &HashMap<String, serde_json::Value> {
&self.input_derivations
}
pub fn input_sources(&self) -> &[String] {
&self.input_sources
}
pub fn name(&self) -> &str {
&self.name
}
pub fn outputs(&self) -> &HashMap<String, HashMap<String, String>> {
&self.outputs
}
pub fn system(&self) -> &str {
&self.system
}
pub input_sources: Vec<String>,
pub name: String,
pub outputs: HashMap<String, HashMap<String, String>>,
pub system: String,
}

View file

@ -0,0 +1,388 @@
{
"failed_derivations": [
"/nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv"
]
}
------
@nix {"action":"msg","level":2,"msg":"path '/home/neikos/projects/nixie-ci/nix-json/tests/logs' does not contain a 'flake.nix', searching up"}
@nix {"action":"start","id":8659607551475712,"level":4,"parent":0,"text":"evaluating derivation 'git+file:///home/neikos/projects/nixie-ci#packages.x86_64-linux.crate'","type":0}
@nix {"action":"msg","level":1,"msg":"\u001b[35;1mwarning:\u001b[0m Git tree '/home/neikos/projects/nixie-ci' is dirty"}
@nix {"action":"stop","id":8659607551475712}
@nix {"action":"start","id":8659689155854336,"level":6,"parent":0,"text":"querying info about missing paths","type":0}
@nix {"action":"stop","id":8659689155854336}
@nix {"action":"msg","level":3,"msg":"this derivation will be built:"}
@nix {"action":"msg","level":3,"msg":" /nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv"}
@nix {"action":"start","id":8659689155854337,"level":0,"parent":0,"text":"","type":102}
@nix {"action":"start","id":8659689155854338,"level":0,"parent":0,"text":"","type":104}
@nix {"action":"start","id":8659689155854339,"level":0,"parent":0,"text":"","type":103}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"start","id":8659689155854340,"level":6,"parent":0,"text":"querying info about missing paths","type":0}
@nix {"action":"stop","id":8659689155854340}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,2,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,3,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,4,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,5,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,6,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,7,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,8,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,9,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,10,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,11,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,12,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,13,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,14,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,15,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,16,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,17,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,18,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,17,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,16,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,15,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,14,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,13,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,12,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,11,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,10,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,9,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,8,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,7,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,6,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,5,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,4,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,3,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,2,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[0,1,0,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"start","fields":["/nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv","",1,1],"id":8659689155854341,"level":3,"parent":0,"text":"building '/nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv'","type":105}
@nix {"action":"result","fields":[0,1,1,0],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":["doRemapPathPrefix not set, will not configure any source remapping"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["Running phase: unpackPhase"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["unpackPhase"],"id":8659689155854341,"type":104}
@nix {"action":"result","fields":["unpacking source archive /nix/store/hh34dp1dhbm7jwdpjfr2j5g6gv7z257s-nks4j57rv95pwii0ghpw7l9ha8j7p054-source"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["source root is nks4j57rv95pwii0ghpw7l9ha8j7p054-source"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["Running phase: patchPhase"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["patchPhase"],"id":8659689155854341,"type":104}
@nix {"action":"result","fields":["Executing configureCargoCommonVars"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["decompressing cargo artifacts from /nix/store/yqqzj6ya9rq2i13bz3m9yzrj7s7h4ld5-cargo-package-deps-0.1.0/target.tar.zst to target"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["Running phase: updateAutotoolsGnuConfigScriptsPhase"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["updateAutotoolsGnuConfigScriptsPhase"],"id":8659689155854341,"type":104}
@nix {"action":"result","fields":["Running phase: configurePhase"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["configurePhase"],"id":8659689155854341,"type":104}
@nix {"action":"result","fields":["will append /build/nks4j57rv95pwii0ghpw7l9ha8j7p054-source/.cargo-home/config.toml with contents of /nix/store/b42z6lmgpb5qyjs89dfc0jg4gdd7sj17-vendor-cargo-deps/config.toml"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["default configurePhase, nothing to do"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["Running phase: buildPhase"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["buildPhase"],"id":8659689155854341,"type":104}
@nix {"action":"result","fields":["+++ command cargo --version"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["cargo 1.91.0 (ea2d97820 2025-10-10)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["+++ command cargo build --release --message-format json-render-diagnostics --all-features --all"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Compiling\u001b[0m nix-json v0.1.0 (/build/nks4j57rv95pwii0ghpw7l9ha8j7p054-source/nix-json)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `nix_log_stop_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnix-json/src/helpers.rs:78:9\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m78\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m nix_log_stop_action: crate::NixLogStopAction,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_nix_log_stop_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `nix_log_msg_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnix-json/src/helpers.rs:102:9\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m102\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m nix_log_msg_action: crate::NixLogMsgAction,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_nix_log_msg_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: fields `state`, `store_path`, and `log_lines` are never read\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnix-json/src/helpers.rs:15:5\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m14\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0mpub struct LogBuildStatus {\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--------------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mfields in this struct\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m15\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m state: LogBuildState,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m16\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m store_path: String,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m17\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m log_lines: Vec<String>,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `LogBuildStatus` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Compiling\u001b[0m nixie-build v0.1.0 (/build/nks4j57rv95pwii0ghpw7l9ha8j7p054-source/nixie-build)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: field `output_name` is never read\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnixie-build/src/lib.rs:178:5\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m177\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0mpub struct NixBuildOutput {\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--------------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mfield in this struct\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m178\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m output_name: String,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `NixBuildOutput` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[33mwarning\u001b[0m: `nix-json` (lib) generated 3 warnings"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[33mwarning\u001b[0m: `nixie-build` (lib) generated 1 warning"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Finished\u001b[0m `release` profile [optimized] target(s) in 0.26s"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["searching for bins/libs to install from cargo build log at cargoBuildLogukvD.json"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["searching for bins/libs complete"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["Running phase: checkPhase"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["checkPhase"],"id":8659689155854341,"type":104}
@nix {"action":"result","fields":["+++ command cargo test --release --all-features --all"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `nix_log_stop_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnix-json/src/helpers.rs:78:9\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m78\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m nix_log_stop_action: crate::NixLogStopAction,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_nix_log_stop_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `nix_log_msg_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnix-json/src/helpers.rs:102:9\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m102\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m nix_log_msg_action: crate::NixLogMsgAction,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_nix_log_msg_action`\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: fields `state`, `store_path`, and `log_lines` are never read\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnix-json/src/helpers.rs:15:5\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m14\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0mpub struct LogBuildStatus {\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--------------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mfields in this struct\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m15\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m state: LogBuildState,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m16\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m store_path: String,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m17\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m log_lines: Vec<String>,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `LogBuildStatus` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Compiling\u001b[0m nix-json v0.1.0 (/build/nks4j57rv95pwii0ghpw7l9ha8j7p054-source/nix-json)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[33mwarning\u001b[0m: `nix-json` (lib) generated 3 warnings"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: field `output_name` is never read\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0mnixie-build/src/lib.rs:178:5\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m177\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0mpub struct NixBuildOutput {\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--------------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mfield in this struct\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m\u001b[1m\u001b[38;5;12m178\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m output_name: String,\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `NixBuildOutput` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\u001b[0m"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Compiling\u001b[0m nixie-build v0.1.0 (/build/nks4j57rv95pwii0ghpw7l9ha8j7p054-source/nixie-build)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[33mwarning\u001b[0m: `nixie-build` (lib) generated 1 warning"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[33mwarning\u001b[0m: `nix-json` (lib test) generated 3 warnings (3 duplicates)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[33mwarning\u001b[0m: `nixie-build` (lib test) generated 1 warning (1 duplicate)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Finished\u001b[0m `release` profile [optimized] target(s) in 0.74s"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Running\u001b[0m unittests src/lib.rs (target/release/deps/nix_json-51e4504eafbaf912)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["running 0 tests"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[92m Running\u001b[0m unittests src/lib.rs (target/release/deps/nixie_build-8de1641dbedfe4a7)"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["running 1 test"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["test tests::check_unpure ... FAILED"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["failures:"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["---- tests::check_unpure stdout ----"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["thread 'tests::check_unpure' (195) panicked at nixie-build/src/lib.rs:128:18:"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["failures:"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[" tests::check_unpure"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[""],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":["\u001b[1m\u001b[91merror\u001b[0m: test failed, to rerun pass `-p nixie-build --lib`"],"id":8659689155854341,"type":101}
@nix {"action":"result","fields":[0,1,0,1],"id":8659689155854338,"type":105}
@nix {"action":"result","fields":[0,0,0,0],"id":8659689155854339,"type":105}
@nix {"action":"result","fields":[101,0],"id":8659689155854337,"type":106}
@nix {"action":"result","fields":[100,0],"id":8659689155854337,"type":106}
@nix {"action":"stop","id":8659689155854341}
@nix {"action":"stop","id":8659689155854339}
@nix {"action":"stop","id":8659689155854338}
@nix {"action":"stop","id":8659689155854337}
@nix {"action":"msg","column":null,"file":null,"level":0,"line":null,"msg":"\u001b[31;1merror:\u001b[0m \u001b[35;1m\u001b[0mCannot build '\u001b[35;1m/nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv\u001b[0m'.\n Reason: \u001b[31;1mbuilder failed with exit code 101\u001b[0m.\n Output paths:\n \u001b[35;1m/nix/store/5h3c9bsxy2m6hqxb2gd236c7g76yb7gp-cargo-package-0.1.0\u001b[0m\n Last 25 log lines:\n >\n > running 0 tests\n >\n > test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n >\n > \u001b[1m\u001b[92m Running\u001b[0m unittests src/lib.rs (target/release/deps/nixie_build-8de1641dbedfe4a7)\n >\n > running 1 test\n > test tests::check_unpure ... FAILED\n >\n > failures:\n >\n > ---- tests::check_unpure stdout ----\n >\n > thread 'tests::check_unpure' (195) panicked at nixie-build/src/lib.rs:128:18:\n > called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\n > note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n >\n >\n > failures:\n > tests::check_unpure\n >\n > test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n >\n > \u001b[1m\u001b[91merror\u001b[0m: test failed, to rerun pass `-p nixie-build --lib`\n For full logs, run:\n \u001b[1mnix log /nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv\u001b[0m\u001b[0m","raw_msg":"\u001b[35;1m\u001b[0mCannot build '\u001b[35;1m/nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv\u001b[0m'.\nReason: \u001b[31;1mbuilder failed with exit code 101\u001b[0m.\nOutput paths:\n \u001b[35;1m/nix/store/5h3c9bsxy2m6hqxb2gd236c7g76yb7gp-cargo-package-0.1.0\u001b[0m\nLast 25 log lines:\n> \n> running 0 tests\n> \n> test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n> \n> \u001b[1m\u001b[92m Running\u001b[0m unittests src/lib.rs (target/release/deps/nixie_build-8de1641dbedfe4a7)\n> \n> running 1 test\n> test tests::check_unpure ... FAILED\n> \n> failures:\n> \n> ---- tests::check_unpure stdout ----\n> \n> thread 'tests::check_unpure' (195) panicked at nixie-build/src/lib.rs:128:18:\n> called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\n> note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n> \n> \n> failures:\n> tests::check_unpure\n> \n> test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n> \n> \u001b[1m\u001b[91merror\u001b[0m: test failed, to rerun pass `-p nixie-build --lib`\nFor full logs, run:\n \u001b[1mnix log /nix/store/pg0y4mmralfpb0l4f0pdbihicanh74w3-cargo-package-0.1.0.drv\u001b[0m\u001b[0m"}

View file

@ -0,0 +1,37 @@
use std::path::Path;
use serde::Deserialize;
datatest_stable::harness! {
{
test = test_failures, root = "tests/logs", pattern = r".*.failure.log"
},
}
#[derive(Debug, Deserialize)]
struct FailureInfoHeader {
failed_derivations: Vec<String>,
}
fn test_failures(_path: &Path, content: String) -> datatest_stable::Result<()> {
let (header, content) = content.split_once("------").unwrap();
let header: FailureInfoHeader = serde_json::from_str(header).unwrap();
let build_state = nix_json::helpers::NixBuildState::from_log_lines(content)?;
assert!(build_state.is_failed());
for drv in header.failed_derivations {
let state = build_state
.get_derivation(&drv)
.unwrap_or_else(|| panic!("Expected {drv} to be present in build state"));
assert!(
state.is_failed(),
"derivation {drv} was found, but it was not marked as failed"
);
}
Ok(())
}