fix: avoid printing banner in completion commands, add env PICOCLAW_NO_BANNER to control printing banner or not

This commit is contained in:
wyxloading 2026-03-10 16:40:18 +08:00
parent 26f623ed32
commit 66db91012d
2 changed files with 116 additions and 1 deletions

View file

@ -9,6 +9,7 @@ package main
import ( import (
"fmt" "fmt"
"os" "os"
"strings"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -61,8 +62,31 @@ const (
"\033[0m\r\n" "\033[0m\r\n"
) )
// shouldShowBanner returns true if the banner should be displayed.
// Banner is suppressed when:
// - PICOCLAW_NO_BANNER environment variable is set to "1" or "true"
// - Running shell completion commands (e.g., __complete, completion)
func shouldShowBanner() bool {
// Check environment variable
if noBanner := os.Getenv("PICOCLAW_NO_BANNER"); noBanner == "1" || strings.ToLower(noBanner) == "true" {
return false
}
// Check for shell completion commands
// Cobra uses "__complete" and "__completeNoDesc" for completion
for _, arg := range os.Args[1:] {
if strings.HasPrefix(arg, "__complete") || arg == "completion" {
return false
}
}
return true
}
func main() { func main() {
if shouldShowBanner() {
fmt.Printf("%s", banner) fmt.Printf("%s", banner)
}
cmd := NewPicoclawCommand() cmd := NewPicoclawCommand()
if err := cmd.Execute(); err != nil { if err := cmd.Execute(); err != nil {
os.Exit(1) os.Exit(1)

View file

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"os"
"slices" "slices"
"testing" "testing"
@ -54,3 +55,93 @@ func TestNewPicoclawCommand(t *testing.T) {
assert.False(t, subcmd.Hidden) assert.False(t, subcmd.Hidden)
} }
} }
func TestShouldShowBanner(t *testing.T) {
// Save original args to restore later
originalArgs := os.Args
defer func() { os.Args = originalArgs }()
tests := []struct {
name string
args []string
envVar string
expected bool
}{
{
name: "default shows banner",
args: []string{"picoclaw"},
envVar: "",
expected: true,
},
{
name: "normal command shows banner",
args: []string{"picoclaw", "version"},
envVar: "",
expected: true,
},
{
name: "__complete suppresses banner",
args: []string{"picoclaw", "__complete", "ver"},
envVar: "",
expected: false,
},
{
name: "__completeNoDesc suppresses banner",
args: []string{"picoclaw", "__completeNoDesc", "ver"},
envVar: "",
expected: false,
},
{
name: "completion command suppresses banner",
args: []string{"picoclaw", "completion", "bash"},
envVar: "",
expected: false,
},
{
name: "PICOCLAW_NO_BANNER=1 suppresses banner",
args: []string{"picoclaw", "version"},
envVar: "1",
expected: false,
},
{
name: "PICOCLAW_NO_BANNER=true suppresses banner",
args: []string{"picoclaw", "version"},
envVar: "true",
expected: false,
},
{
name: "PICOCLAW_NO_BANNER=TRUE suppresses banner",
args: []string{"picoclaw", "version"},
envVar: "TRUE",
expected: false,
},
{
name: "PICOCLAW_NO_BANNER=0 does not suppress banner",
args: []string{"picoclaw", "version"},
envVar: "0",
expected: true,
},
{
name: "PICOCLAW_NO_BANNER=false does not suppress banner",
args: []string{"picoclaw", "version"},
envVar: "false",
expected: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
os.Args = tt.args
if tt.envVar != "" {
t.Setenv("PICOCLAW_NO_BANNER", tt.envVar)
} else {
// Clear env var if not set in test
os.Unsetenv("PICOCLAW_NO_BANNER")
}
result := shouldShowBanner()
assert.Equal(t, tt.expected, result)
})
}
}