From 05c29c3376a1b19acac553b0daed3ccc0c344048 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 12 Aug 2025 08:42:48 -0400 Subject: [PATCH] fix(logs): no longer output group prefixes if no logs present --- crates/turborepo-ui/src/output.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/crates/turborepo-ui/src/output.rs b/crates/turborepo-ui/src/output.rs index 8027270808d70..a1a5cdf520c5c 100644 --- a/crates/turborepo-ui/src/output.rs +++ b/crates/turborepo-ui/src/output.rs @@ -153,7 +153,10 @@ impl OutputClient { .flatten() .or(primary.footer); - if matches!(behavior, OutputClientBehavior::Grouped) { + // Only output group logs header and footers if there are logs to be printed + if matches!(behavior, OutputClientBehavior::Grouped) + && buffers.as_ref().is_some_and(|b| !b.is_empty()) + { let buffers = buffers .as_ref() .expect("grouped logging requires buffer to be present"); @@ -464,6 +467,29 @@ mod test { } } + #[test] + fn test_grouped_logs_no_output_no_marginals() -> io::Result<()> { + let sink = OutputSink::new(Vec::new(), Vec::new()); + let mut logger = sink.logger(OutputClientBehavior::Grouped); + logger.with_header_footer( + Some(Arc::new(|_| "header\n".into())), + Some(Arc::new(|_| "footer\n".into())), + ); + + // Don't write any logs + let logs = logger.finish(false)?; + + // Should have empty buffer since no logs were written + assert!(logs.is_none() || logs.unwrap().is_empty()); + + let SinkWriters { out, err } = Arc::into_inner(sink.writers).unwrap().into_inner().unwrap(); + // Headers and footers should not be written when there are no logs + assert_eq!(out, b""); + assert_eq!(err, b""); + + Ok(()) + } + #[test] fn assert_output_writer_sync() { // This is the bound required for a value to be held across an await