Only print status when activities change or enough time has passed.

This commit is contained in:
Tom Alexander
2026-04-02 18:21:00 -04:00
parent 9083a09455
commit 606832f505
2 changed files with 35 additions and 3 deletions

View File

@@ -2,6 +2,7 @@ use std::fmt::Display;
use std::num::TryFromIntError; use std::num::TryFromIntError;
use std::str::Utf8Error; use std::str::Utf8Error;
use std::string::FromUtf8Error; use std::string::FromUtf8Error;
use std::time::SystemTimeError;
use crate::nix_util::ActivityIdAlreadyInTreeError; use crate::nix_util::ActivityIdAlreadyInTreeError;
use crate::nix_util::ActivityIdNotInTreeError; use crate::nix_util::ActivityIdNotInTreeError;
@@ -24,6 +25,7 @@ pub(crate) enum CustomError {
TryFromIntError(#[allow(dead_code)] TryFromIntError), TryFromIntError(#[allow(dead_code)] TryFromIntError),
ActivityIdNotInTreeError(#[allow(dead_code)] ActivityIdNotInTreeError), ActivityIdNotInTreeError(#[allow(dead_code)] ActivityIdNotInTreeError),
ActivityIdAlreadyInTreeError(#[allow(dead_code)] ActivityIdAlreadyInTreeError), ActivityIdAlreadyInTreeError(#[allow(dead_code)] ActivityIdAlreadyInTreeError),
SystemTime(#[allow(dead_code)] SystemTimeError),
} }
impl Display for CustomError { impl Display for CustomError {
@@ -127,3 +129,9 @@ impl From<ActivityIdAlreadyInTreeError> for CustomError {
CustomError::ActivityIdAlreadyInTreeError(value) CustomError::ActivityIdAlreadyInTreeError(value)
} }
} }
impl From<SystemTimeError> for CustomError {
fn from(value: SystemTimeError) -> Self {
CustomError::SystemTime(value)
}
}

View File

@@ -1,4 +1,7 @@
use std::borrow::Cow; use std::borrow::Cow;
use std::time::Duration;
use std::time::Instant;
use std::time::SystemTime;
use sqlx::Row; use sqlx::Row;
use tokio::process::Child; use tokio::process::Child;
@@ -37,6 +40,7 @@ use super::nix_output_stream::NixMessage;
pub(crate) struct RunningBuild<'db> { pub(crate) struct RunningBuild<'db> {
db_handle: &'db DbHandle, db_handle: &'db DbHandle,
activity_tree: ActivityTree, activity_tree: ActivityTree,
last_announce: Option<Instant>,
} }
impl<'db> RunningBuild<'db> { impl<'db> RunningBuild<'db> {
@@ -44,6 +48,7 @@ impl<'db> RunningBuild<'db> {
Ok(RunningBuild { Ok(RunningBuild {
db_handle, db_handle,
activity_tree: ActivityTree::new(), activity_tree: ActivityTree::new(),
last_announce: None,
}) })
} }
@@ -55,6 +60,8 @@ impl<'db> RunningBuild<'db> {
where where
TN: AsRef<str>, TN: AsRef<str>,
{ {
let foo = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?;
let now = Instant::now();
let build_id: i64 = sqlx::query( let build_id: i64 = sqlx::query(
r#"INSERT INTO build (start_time, target) SELECT unixepoch('now'), ? RETURNING id"#, r#"INSERT INTO build (start_time, target) SELECT unixepoch('now'), ? RETURNING id"#,
) )
@@ -318,7 +325,7 @@ impl<'db> RunningBuild<'db> {
activity_result_progress.failed, activity_result_progress.failed,
); );
self.print_current_status(); self.maybe_print_current_status();
} }
ActivityResultMessage::SetExpected(activity_result_set_expected) => { ActivityResultMessage::SetExpected(activity_result_set_expected) => {
let activity_id = self let activity_id = self
@@ -329,7 +336,7 @@ impl<'db> RunningBuild<'db> {
.get_mut_activity() .get_mut_activity()
.set_expected(activity_result_set_expected.expected); .set_expected(activity_result_set_expected.expected);
self.print_current_status(); self.maybe_print_current_status();
} }
ActivityResultMessage::PostBuildLogLine( ActivityResultMessage::PostBuildLogLine(
_activity_result_post_build_log_line, _activity_result_post_build_log_line,
@@ -341,7 +348,23 @@ impl<'db> RunningBuild<'db> {
Ok(()) Ok(())
} }
fn print_current_status(&self) -> () { fn maybe_print_current_status(&mut self) -> () {
let last_announce = match self.last_announce {
Some(instant) => instant,
None => {
// If we haven't announced before, always announce.
return self.print_current_status();
}
};
let now = Instant::now();
let time_since_last_announce = now.duration_since(last_announce);
if time_since_last_announce > Duration::new(5, 0) {
return self.print_current_status();
}
}
fn print_current_status(&mut self) -> () {
let mut tree = String::new(); let mut tree = String::new();
let draw_order = self.get_draw_order(); let draw_order = self.get_draw_order();
for dag_entry in draw_order { for dag_entry in draw_order {
@@ -378,6 +401,7 @@ impl<'db> RunningBuild<'db> {
} else { } else {
print!("\n{}\n", tree); print!("\n{}\n", tree);
} }
self.last_announce = Some(Instant::now());
} }
fn get_draw_order(&self) -> Vec<DrawDagEntry> { fn get_draw_order(&self) -> Vec<DrawDagEntry> {