From b5fd02da608fb0ee228472905a6ec12e25aa0973 Mon Sep 17 00:00:00 2001 From: Renz Date: Wed, 5 Nov 2025 13:55:41 +0000 Subject: [PATCH] fix: NullIndicator for truly silent TUI mode - no stdout at all --- internal/backup/engine.go | 18 +++++++++++++++--- internal/progress/progress.go | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/internal/backup/engine.go b/internal/backup/engine.go index 061dfb0..6035276 100644 --- a/internal/backup/engine.go +++ b/internal/backup/engine.go @@ -62,6 +62,11 @@ func NewWithProgress(cfg *config.Config, log logger.Logger, db database.Database // NewSilent creates a new backup engine in silent mode (for TUI) func NewSilent(cfg *config.Config, log logger.Logger, db database.Database, progressIndicator progress.Indicator) *Engine { + // If no indicator provided, use null indicator (no output) + if progressIndicator == nil { + progressIndicator = progress.NewNullIndicator() + } + detailedReporter := progress.NewDetailedReporter(progressIndicator, &loggerAdapter{logger: log}) return &Engine{ @@ -278,9 +283,16 @@ func (e *Engine) BackupCluster(ctx context.Context) error { } } - // Use a quiet progress indicator to avoid duplicate messages - quietProgress := progress.NewQuietLineByLine() - quietProgress.Start("Starting cluster backup (all databases)") + // Use appropriate progress indicator based on silent mode + var quietProgress progress.Indicator + if e.silent { + // In silent mode (TUI), use null indicator - no stdout output at all + quietProgress = progress.NewNullIndicator() + } else { + // In CLI mode, use quiet line-by-line output + quietProgress = progress.NewQuietLineByLine() + quietProgress.Start("Starting cluster backup (all databases)") + } // Ensure backup directory exists if err := os.MkdirAll(e.cfg.BackupDir, 0755); err != nil { diff --git a/internal/progress/progress.go b/internal/progress/progress.go index 22f8562..b68b760 100644 --- a/internal/progress/progress.go +++ b/internal/progress/progress.go @@ -395,4 +395,18 @@ func NewIndicator(interactive bool, indicatorType string) Indicator { default: return NewLineByLine() // Default to line-by-line for better compatibility } -} \ No newline at end of file +} + +// NullIndicator is a no-op indicator that produces no output (for TUI mode) +type NullIndicator struct{} + +// NewNullIndicator creates an indicator that does nothing +func NewNullIndicator() *NullIndicator { + return &NullIndicator{} +} + +func (n *NullIndicator) Start(message string) {} +func (n *NullIndicator) Update(message string) {} +func (n *NullIndicator) Complete(message string) {} +func (n *NullIndicator) Fail(message string) {} +func (n *NullIndicator) Stop() {} \ No newline at end of file