state: improve progress fields, trace storage, platform mismatch detection

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I2a4ce79fef265cfa26df26a0b258dd746a6a6964
This commit is contained in:
raf 2025-12-17 11:54:53 +03:00
commit c57ef45679
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -18,10 +18,6 @@ pub type DerivationId = usize;
/// Unique identifier for activities /// Unique identifier for activities
pub type ActivityId = Id; pub type ActivityId = Id;
/// Store path representation /// Store path representation
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct StorePath { pub struct StorePath {
@ -85,9 +81,6 @@ impl Derivation {
} }
} }
/// Transfer information (download/upload) /// Transfer information (download/upload)
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct TransferInfo { pub struct TransferInfo {
@ -324,6 +317,20 @@ pub struct ActivityStatus {
pub text: String, pub text: String,
pub parent: Option<ActivityId>, pub parent: Option<ActivityId>,
pub phase: Option<String>, pub phase: Option<String>,
pub progress: Option<ActivityProgress>,
}
/// Activity progress for downloads/uploads/builds
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ActivityProgress {
/// Bytes completed
pub done: u64,
/// Total bytes expected
pub expected: u64,
/// Currently running transfers
pub running: u64,
/// Failed transfers
pub failed: u64,
} }
/// Build report for caching /// Build report for caching
@ -361,6 +368,7 @@ pub struct State {
pub activities: HashMap<ActivityId, ActivityStatus>, pub activities: HashMap<ActivityId, ActivityStatus>,
pub nix_errors: Vec<String>, pub nix_errors: Vec<String>,
pub build_logs: Vec<String>, pub build_logs: Vec<String>,
pub traces: Vec<String>,
pub build_platform: Option<String>, pub build_platform: Option<String>,
pub evaluation_state: EvalInfo, pub evaluation_state: EvalInfo,
next_store_path_id: StorePathId, next_store_path_id: StorePathId,
@ -390,6 +398,7 @@ impl State {
activities: HashMap::new(), activities: HashMap::new(),
nix_errors: Vec::new(), nix_errors: Vec::new(),
build_logs: Vec::new(), build_logs: Vec::new(),
traces: Vec::new(),
build_platform: None, build_platform: None,
evaluation_state: EvalInfo::default(), evaluation_state: EvalInfo::default(),
next_store_path_id: 0, next_store_path_id: 0,
@ -664,6 +673,30 @@ impl State {
.map(|(id, info)| (*id, info)) .map(|(id, info)| (*id, info))
.collect() .collect()
} }
/// Check if a derivation has a platform mismatch
#[must_use]
pub fn has_platform_mismatch(&self, id: DerivationId) -> bool {
if let (Some(build_platform), Some(info)) =
(&self.build_platform, self.get_derivation_info(id))
{
if let Some(drv_platform) = &info.platform {
return build_platform != drv_platform;
}
}
false
}
/// Get all derivations with platform mismatches
#[must_use]
pub fn platform_mismatches(&self) -> Vec<DerivationId> {
self
.derivation_infos
.keys()
.filter(|&&id| self.has_platform_mismatch(id))
.copied()
.collect()
}
} }
#[must_use] #[must_use]
@ -674,8 +707,6 @@ pub fn current_time() -> f64 {
.as_secs_f64() .as_secs_f64()
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;