sources: Refreshed::is_clean decides the exit, where a test reaches it

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-31 09:10:07 +01:00
commit 715ec58180
3 changed files with 16 additions and 1 deletions

View file

@ -81,7 +81,7 @@ fn main() -> ExitCode {
let mut forge = HttpForge::new(&options.forge_url);
let mut journal = |report: &huginn_daemon::sources::Report| println!("{report}");
match refresh(&mut embedder, &mut index, &mut forge, &options.state_root, &mut journal) {
Ok(refreshed) if refreshed.failed.is_empty() && refreshed.retirement_withheld.is_none() => ExitCode::SUCCESS,
Ok(refreshed) if refreshed.is_clean() => ExitCode::SUCCESS,
Ok(refreshed) => {
if !refreshed.failed.is_empty() {
eprintln!("huginn-sources: {} repos failed: {}", refreshed.failed.len(), refreshed.failed.join(", "));

View file

@ -199,6 +199,13 @@ pub struct Refreshed {
pub retirement_withheld: Option<String>,
}
impl Refreshed {
/// Every repo converged and the catalog could be trusted to retire from.
pub fn is_clean(&self) -> bool {
self.failed.is_empty() && self.retirement_withheld.is_none()
}
}
/// Brings the collection to the forge's current state. A collection that
/// exists without Huginn's label is refused untouched. One repo's failure is
/// logged and the others go on; the caller exits nonzero if any failed.

View file

@ -380,6 +380,14 @@ fn a_repo_renamed_only_by_case_keeps_no_stale_points() {
assert_eq!(rig.index.cursors().into_iter().collect::<Vec<_>>(), [("demo".to_owned(), head)]);
}
/// A run is clean only when no repo failed and retirement was not withheld.
#[test]
fn a_run_is_clean_only_when_nothing_failed_and_retirement_was_not_withheld() {
assert!(Refreshed::default().is_clean());
assert!(!Refreshed { failed: vec!["Demo".into()], retirement_withheld: None }.is_clean());
assert!(!Refreshed { failed: Vec::new(), retirement_withheld: Some("short".into()) }.is_clean());
}
/// A mirror no cursor knows (a first ingest that never finished) is retired
/// with its points too.
#[test]