From 017005b0b1033e518ea7b243d0ff982039712de7 Mon Sep 17 00:00:00 2001 From: thibaud-lclr Date: Mon, 20 Apr 2026 14:24:43 +0200 Subject: [PATCH] fix(secretstore): disable loader during interactive bitwarden prompts --- secretstore/bitwarden.go | 6 ++---- secretstore/bitwarden_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/secretstore/bitwarden.go b/secretstore/bitwarden.go index 25765ca..362c019 100644 --- a/secretstore/bitwarden.go +++ b/secretstore/bitwarden.go @@ -42,6 +42,7 @@ type bitwardenInteractiveRunner func( var runBitwardenCLI bitwardenRunner = executeBitwardenCLI var runBitwardenInteractiveCLI bitwardenInteractiveRunner = executeBitwardenCLIInteractive +var startBitwardenLoaderFunc = startBitwardenLoader var bitwardenLoaderActive atomic.Bool var bitwardenDebugOutput io.Writer = os.Stderr @@ -638,7 +639,7 @@ func sanitizeBitwardenDebugArgs(args []string) []string { } func executeBitwardenCLI(command string, stdin []byte, args ...string) ([]byte, error) { - stopLoader := startBitwardenLoader() + stopLoader := startBitwardenLoaderFunc() defer stopLoader() cmd := exec.Command(command, args...) @@ -664,9 +665,6 @@ func executeBitwardenCLIInteractive( stdout, stderr io.Writer, args ...string, ) ([]byte, error) { - stopLoader := startBitwardenLoader() - defer stopLoader() - cmd := exec.Command(command, args...) if stdin != nil { cmd.Stdin = stdin diff --git a/secretstore/bitwarden_test.go b/secretstore/bitwarden_test.go index 5da8fe2..4b64c57 100644 --- a/secretstore/bitwarden_test.go +++ b/secretstore/bitwarden_test.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "io" + "os" "os/exec" "path/filepath" "regexp" @@ -484,6 +485,28 @@ func TestBitwardenLoaderFrameMovesAndWrapsTheWave(t *testing.T) { } } +func TestExecuteBitwardenCLIInteractiveSkipsLoader(t *testing.T) { + loaderStartCount := 0 + withBitwardenLoaderStarter(t, func() func() { + loaderStartCount++ + return func() {} + }) + + _, err := executeBitwardenCLIInteractive( + os.Args[0], + nil, + io.Discard, + io.Discard, + "-test.run=^$", + ) + if err != nil { + t.Fatalf("executeBitwardenCLIInteractive returned error: %v", err) + } + if loaderStartCount != 0 { + t.Fatalf("loader start count = %d, want 0 for interactive command", loaderStartCount) + } +} + var ansiControlSequencePattern = regexp.MustCompile(`\x1b\[[0-9;]*[A-Za-z]`) func stripANSIControlSequences(value string) string { @@ -552,6 +575,16 @@ func withBitwardenDebugOutput(t *testing.T, writer io.Writer) { }) } +func withBitwardenLoaderStarter(t *testing.T, starter func() func()) { + t.Helper() + + previous := startBitwardenLoaderFunc + startBitwardenLoaderFunc = starter + t.Cleanup(func() { + startBitwardenLoaderFunc = previous + }) +} + type fakeBitwardenCLI struct { command string itemsByID map[string]fakeBitwardenItem