From 131cee951f4f67c961218b1f936d8206c0858f70 Mon Sep 17 00:00:00 2001 From: Stefan Prodan Date: Mon, 30 Mar 2026 11:52:01 +0300 Subject: [PATCH] Replace yacspin with briandowns/spinner for progress indication Signed-off-by: Stefan Prodan --- go.mod | 4 ++-- go.sum | 4 ++-- internal/build/build.go | 42 ++++++++--------------------------------- internal/build/diff.go | 6 +++--- 4 files changed, 15 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index 7554accd..4b0fd526 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ replace gopkg.in/yaml.v3 => gopkg.in/yaml.v3 v3.0.1 require ( github.com/Masterminds/semver/v3 v3.4.0 github.com/ProtonMail/go-crypto v1.3.0 + github.com/briandowns/spinner v1.23.2 github.com/cyphar/filepath-securejoin v0.6.1 github.com/distribution/distribution/v3 v3.0.0 github.com/fluxcd/cli-utils v0.37.2-flux.1 @@ -40,6 +41,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/go-containerregistry v0.20.7 github.com/hashicorp/go-cleanhttp v0.5.2 + github.com/hashicorp/go-retryablehttp v0.7.8 github.com/homeport/dyff v1.10.2 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/manifoldco/promptui v0.9.0 @@ -49,7 +51,6 @@ require ( github.com/onsi/gomega v1.39.1 github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 github.com/spf13/cobra v1.10.2 - github.com/theckman/yacspin v0.13.12 golang.org/x/crypto v0.48.0 golang.org/x/term v0.40.0 golang.org/x/text v0.34.0 @@ -162,7 +163,6 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru/arc/v2 v2.0.5 // indirect github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect diff --git a/go.sum b/go.sum index 3aed1cda..71b72d45 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/briandowns/spinner v1.23.2 h1:Zc6ecUnI+YzLmJniCfDNaMbW0Wid1d5+qcTq4L2FW8w= +github.com/briandowns/spinner v1.23.2/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= @@ -535,8 +537,6 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= -github.com/theckman/yacspin v0.13.12 h1:CdZ57+n0U6JMuh2xqjnjRq5Haj6v1ner2djtLQRzJr4= -github.com/theckman/yacspin v0.13.12/go.mod h1:Rd2+oG2LmQi5f3zC3yeZAOl245z8QOvrH4OPOJNZxLg= github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 h1:JwtAtbp7r/7QSyGz8mKUbYJBg2+6Cd7OjM8o/GNOcVo= diff --git a/internal/build/build.go b/internal/build/build.go index 7deca47c..0b9148d1 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -30,7 +30,7 @@ import ( "sync" "time" - "github.com/theckman/yacspin" + "github.com/briandowns/spinner" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -81,7 +81,7 @@ type Builder struct { action kustomize.Action kustomization *kustomizev1.Kustomization timeout time.Duration - spinner *yacspin.Spinner + spinner *spinner.Spinner dryRun bool strictSubst bool recursive bool @@ -111,22 +111,9 @@ func WithTimeout(timeout time.Duration) BuilderOptionFunc { func WithProgressBar() BuilderOptionFunc { return func(b *Builder) error { - // Add a spinner - cfg := yacspin.Config{ - Frequency: 100 * time.Millisecond, - CharSet: yacspin.CharSets[59], - Suffix: "Kustomization diffing...", - SuffixAutoColon: true, - Message: spinnerDryRunMessage, - StopCharacter: "✓", - StopColors: []string{"fgGreen"}, - } - spinner, err := yacspin.New(cfg) - if err != nil { - return fmt.Errorf("failed to create spinner: %w", err) - } - b.spinner = spinner - + s := spinner.New(spinner.CharSets[14], 100*time.Millisecond) + s.Suffix = " Kustomization diffing... " + spinnerDryRunMessage + b.spinner = s return nil } } @@ -215,7 +202,7 @@ func withClientConfigFrom(in *Builder) BuilderOptionFunc { } } -// withClientConfigFrom copies spinner field +// withSpinnerFrom copies the spinner field from another Builder. func withSpinnerFrom(in *Builder) BuilderOptionFunc { return func(b *Builder) error { b.spinner = in.spinner @@ -746,12 +733,7 @@ func (b *Builder) StartSpinner() error { if b.spinner == nil { return nil } - - err := b.spinner.Start() - if err != nil { - return fmt.Errorf("failed to start spinner: %w", err) - } - + b.spinner.Start() return nil } @@ -759,14 +741,6 @@ func (b *Builder) StopSpinner() error { if b.spinner == nil { return nil } - - status := b.spinner.Status() - if status == yacspin.SpinnerRunning || status == yacspin.SpinnerPaused { - err := b.spinner.Stop() - if err != nil { - return fmt.Errorf("failed to stop spinner: %w", err) - } - } - + b.spinner.Stop() return nil } diff --git a/internal/build/diff.go b/internal/build/diff.go index 4485dd0f..2464fc26 100644 --- a/internal/build/diff.go +++ b/internal/build/diff.go @@ -173,14 +173,14 @@ func (b *Builder) diff() (string, bool, error) { // finished with Kustomization diff if b.spinner != nil { - b.spinner.Message(spinnerDryRunMessage) + b.spinner.Suffix = " " + spinnerDryRunMessage } } } } if b.spinner != nil { - b.spinner.Message("processing inventory") + b.spinner.Suffix = " processing inventory" } if b.kustomization.Spec.Prune && len(diffErrs) == 0 { @@ -204,7 +204,7 @@ func (b *Builder) diff() (string, bool, error) { func (b *Builder) kustomizationDiff(kustomization *kustomizev1.Kustomization) (string, bool, error) { if b.spinner != nil { - b.spinner.Message(fmt.Sprintf("%s in %s", spinnerDryRunMessage, kustomization.Name)) + b.spinner.Suffix = " " + fmt.Sprintf("%s in %s", spinnerDryRunMessage, kustomization.Name) } sourceRef := kustomization.Spec.SourceRef.DeepCopy()