diff --git a/cmd/account/groups/groups.go b/cmd/account/groups/groups.go index c7052fadec..56c88940b4 100755 --- a/cmd/account/groups/groups.go +++ b/cmd/account/groups/groups.go @@ -160,10 +160,10 @@ func newDelete() *cobra.Command { a := cmdctx.AccountClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Groups drop-down.") names, err := a.Groups.GroupDisplayNameToIdMap(ctx, iam.ListAccountGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Groups drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -228,10 +228,10 @@ func newGet() *cobra.Command { a := cmdctx.AccountClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Groups drop-down.") names, err := a.Groups.GroupDisplayNameToIdMap(ctx, iam.ListAccountGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Groups drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -372,10 +372,10 @@ func newPatch() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Groups drop-down.") names, err := a.Groups.GroupDisplayNameToIdMap(ctx, iam.ListAccountGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Groups drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -465,10 +465,10 @@ func newUpdate() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Groups drop-down.") names, err := a.Groups.GroupDisplayNameToIdMap(ctx, iam.ListAccountGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Groups drop-down. Please manually specify required arguments. Original error: %w", err) } diff --git a/cmd/account/service-principals/service-principals.go b/cmd/account/service-principals/service-principals.go index 27445db4cc..a3e9d8d36d 100755 --- a/cmd/account/service-principals/service-principals.go +++ b/cmd/account/service-principals/service-principals.go @@ -158,10 +158,10 @@ func newDelete() *cobra.Command { a := cmdctx.AccountClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Service Principals drop-down.") names, err := a.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListAccountServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -227,10 +227,10 @@ func newGet() *cobra.Command { a := cmdctx.AccountClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Service Principals drop-down.") names, err := a.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListAccountServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -370,10 +370,10 @@ func newPatch() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Service Principals drop-down.") names, err := a.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListAccountServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -465,10 +465,10 @@ func newUpdate() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Service Principals drop-down.") names, err := a.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListAccountServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } diff --git a/cmd/account/users/users.go b/cmd/account/users/users.go index 8474a79613..61ca4e3711 100755 --- a/cmd/account/users/users.go +++ b/cmd/account/users/users.go @@ -167,10 +167,10 @@ func newDelete() *cobra.Command { a := cmdctx.AccountClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Users drop-down.") names, err := a.Users.UserUserNameToIdMap(ctx, iam.ListAccountUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Users drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -243,10 +243,10 @@ func newGet() *cobra.Command { a := cmdctx.AccountClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Users drop-down.") names, err := a.Users.UserUserNameToIdMap(ctx, iam.ListAccountUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Users drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -386,10 +386,10 @@ func newPatch() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Users drop-down.") names, err := a.Users.UserUserNameToIdMap(ctx, iam.ListAccountUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Users drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -481,10 +481,10 @@ func newUpdate() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Account Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Account Users drop-down.") names, err := a.Users.UserUserNameToIdMap(ctx, iam.ListAccountUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Account Users drop-down. Please manually specify required arguments. Original error: %w", err) } diff --git a/cmd/workspace/groups/groups.go b/cmd/workspace/groups/groups.go index afbfb05a69..d54c97b1db 100755 --- a/cmd/workspace/groups/groups.go +++ b/cmd/workspace/groups/groups.go @@ -160,10 +160,10 @@ func newDelete() *cobra.Command { w := cmdctx.WorkspaceClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Groups drop-down.") names, err := w.Groups.GroupDisplayNameToIdMap(ctx, iam.ListGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Groups drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -228,10 +228,10 @@ func newGet() *cobra.Command { w := cmdctx.WorkspaceClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Groups drop-down.") names, err := w.Groups.GroupDisplayNameToIdMap(ctx, iam.ListGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Groups drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -370,10 +370,10 @@ func newPatch() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Groups drop-down.") names, err := w.Groups.GroupDisplayNameToIdMap(ctx, iam.ListGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Groups drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -463,10 +463,10 @@ func newUpdate() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Groups drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Groups drop-down.") names, err := w.Groups.GroupDisplayNameToIdMap(ctx, iam.ListGroupsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Groups drop-down. Please manually specify required arguments. Original error: %w", err) } diff --git a/cmd/workspace/repos/overrides.go b/cmd/workspace/repos/overrides.go index 8110c2aa48..72f58bb501 100644 --- a/cmd/workspace/repos/overrides.go +++ b/cmd/workspace/repos/overrides.go @@ -141,10 +141,10 @@ func updateOverride(updateCmd *cobra.Command, updateReq *workspace.UpdateRepoReq func repoArgumentToRepoID(ctx context.Context, w *databricks.WorkspaceClient, args []string) (int64, error) { // ---- Begin copy from cmd/workspace/repos/repos.go ---- if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No REPO_ID argument specified. Loading names for Repos drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No REPO_ID argument specified. Loading names for Repos drop-down.") names, err := w.Repos.RepoInfoPathToIdMap(ctx, workspace.ListReposRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return 0, fmt.Errorf("failed to load names for Repos drop-down. Please manually specify required arguments. Original error: %w", err) } diff --git a/cmd/workspace/service-principals/service-principals.go b/cmd/workspace/service-principals/service-principals.go index 9bf6dc5591..7cf186a53f 100755 --- a/cmd/workspace/service-principals/service-principals.go +++ b/cmd/workspace/service-principals/service-principals.go @@ -158,10 +158,10 @@ func newDelete() *cobra.Command { w := cmdctx.WorkspaceClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Service Principals drop-down.") names, err := w.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -227,10 +227,10 @@ func newGet() *cobra.Command { w := cmdctx.WorkspaceClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Service Principals drop-down.") names, err := w.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -370,10 +370,10 @@ func newPatch() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Service Principals drop-down.") names, err := w.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -465,10 +465,10 @@ func newUpdate() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Service Principals drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Service Principals drop-down.") names, err := w.ServicePrincipals.ServicePrincipalDisplayNameToIdMap(ctx, iam.ListServicePrincipalsRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Service Principals drop-down. Please manually specify required arguments. Original error: %w", err) } diff --git a/cmd/workspace/users/users.go b/cmd/workspace/users/users.go index 340ddade3f..40d0158b12 100755 --- a/cmd/workspace/users/users.go +++ b/cmd/workspace/users/users.go @@ -171,10 +171,10 @@ func newDelete() *cobra.Command { w := cmdctx.WorkspaceClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Users drop-down.") names, err := w.Users.UserUserNameToIdMap(ctx, iam.ListUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Users drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -247,10 +247,10 @@ func newGet() *cobra.Command { w := cmdctx.WorkspaceClient(ctx) if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Users drop-down.") names, err := w.Users.UserUserNameToIdMap(ctx, iam.ListUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Users drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -475,10 +475,10 @@ func newPatch() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Users drop-down.") names, err := w.Users.UserUserNameToIdMap(ctx, iam.ListUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Users drop-down. Please manually specify required arguments. Original error: %w", err) } @@ -641,10 +641,10 @@ func newUpdate() *cobra.Command { } } if len(args) == 0 { - promptSpinner := cmdio.Spinner(ctx) - promptSpinner <- "No ID argument specified. Loading names for Users drop-down." + sp := cmdio.NewSpinner(ctx) + sp.Update("No ID argument specified. Loading names for Users drop-down.") names, err := w.Users.UserUserNameToIdMap(ctx, iam.ListUsersRequest{}) - close(promptSpinner) + sp.Close() if err != nil { return fmt.Errorf("failed to load names for Users drop-down. Please manually specify required arguments. Original error: %w", err) } diff --git a/libs/cmdio/io.go b/libs/cmdio/io.go index 125196b58e..da22c3b492 100644 --- a/libs/cmdio/io.go +++ b/libs/cmdio/io.go @@ -181,11 +181,6 @@ func RunSelect(ctx context.Context, prompt *promptui.Select) (int, string, error return prompt.Run() } -func Spinner(ctx context.Context) chan string { - c := fromContext(ctx) - return c.Spinner(ctx) -} - // NewSpinner creates a new spinner for displaying progress indicators. // The returned spinner should be closed when done to release resources. // diff --git a/libs/cmdio/spinner.go b/libs/cmdio/spinner.go index e9ca438f9b..9557710524 100644 --- a/libs/cmdio/spinner.go +++ b/libs/cmdio/spinner.go @@ -165,31 +165,3 @@ func (c *cmdIO) NewSpinner(ctx context.Context) *spinner { return sp } - -// Spinner returns a channel for updating spinner status messages. -// Send messages to update the suffix, close the channel to stop. -// The spinner runs until the channel is closed or context is cancelled. -func (c *cmdIO) Spinner(ctx context.Context) chan string { - updates := make(chan string) - sp := c.NewSpinner(ctx) - - // Bridge goroutine: channel -> spinner.Update() - go func() { - defer sp.Close() - - for { - select { - case <-ctx.Done(): - return - case msg, ok := <-updates: - if !ok { - // Channel closed - return - } - sp.Update(msg) - } - } - }() - - return updates -} diff --git a/libs/cmdio/spinner_test.go b/libs/cmdio/spinner_test.go index 942c7ef75d..2e0fbd2222 100644 --- a/libs/cmdio/spinner_test.go +++ b/libs/cmdio/spinner_test.go @@ -103,18 +103,6 @@ func TestSpinnerStructNonInteractive(t *testing.T) { // Should complete without error in non-interactive mode } -func TestSpinnerBackwardCompatibility(t *testing.T) { - ctx := t.Context() - ctx, _ = NewTestContextWithStderr(ctx) - - // Old API should still work - spinner := Spinner(ctx) - spinner <- "old api message" - close(spinner) - - // No panics = success -} - func TestSpinnerStructContextCancellation(t *testing.T) { ctx := t.Context() ctx, _ = NewTestContextWithStderr(ctx) diff --git a/libs/gorules/rule_cmdio_spinner.go b/libs/gorules/rule_cmdio_spinner.go deleted file mode 100644 index b9c702db56..0000000000 --- a/libs/gorules/rule_cmdio_spinner.go +++ /dev/null @@ -1,12 +0,0 @@ -package gorules - -import "github.com/quasilyte/go-ruleguard/dsl" - -// NoNewCmdioSpinner forbids new calls to cmdio.Spinner except in cmd/workspace/ and cmd/account/ directories. -// This rule ensures that spinner usage is limited to auto-generated workspace and account commands. -func NoNewCmdioSpinner(m dsl.Matcher) { - m.Match(`cmdio.Spinner($*_)`). - Where(!m.File().PkgPath.Matches(`.*/cmd/workspace/.*`) && - !m.File().PkgPath.Matches(`.*/cmd/account/.*`)). - Report(`cmdio.Spinner is deprecated, no new call sites allowed. Use cmdio.NewSpinner() instead`) -}