diff --git a/cmd/account/groups/groups.go b/cmd/account/groups/groups.go index d67eb3e41f..9f2a4e89df 100755 --- a/cmd/account/groups/groups.go +++ b/cmd/account/groups/groups.go @@ -163,10 +163,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) } @@ -231,10 +231,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) } @@ -375,10 +375,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) } @@ -468,10 +468,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 846f2b13a9..06d410fc33 100755 --- a/cmd/account/service-principals/service-principals.go +++ b/cmd/account/service-principals/service-principals.go @@ -161,10 +161,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) } @@ -230,10 +230,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) } @@ -373,10 +373,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) } @@ -468,10 +468,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 07d6aff8bf..57218bafc6 100755 --- a/cmd/account/users/users.go +++ b/cmd/account/users/users.go @@ -170,10 +170,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) } @@ -246,10 +246,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) } @@ -389,10 +389,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) } @@ -484,10 +484,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 0e838578bc..595c03218b 100755 --- a/cmd/workspace/groups/groups.go +++ b/cmd/workspace/groups/groups.go @@ -163,10 +163,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) } @@ -231,10 +231,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) } @@ -373,10 +373,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) } @@ -466,10 +466,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 e70abfc1c5..76737b4517 100755 --- a/cmd/workspace/service-principals/service-principals.go +++ b/cmd/workspace/service-principals/service-principals.go @@ -161,10 +161,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) } @@ -230,10 +230,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) } @@ -373,10 +373,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) } @@ -468,10 +468,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 d309fcd4a5..c9ea805942 100755 --- a/cmd/workspace/users/users.go +++ b/cmd/workspace/users/users.go @@ -174,10 +174,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) } @@ -250,10 +250,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) } @@ -478,10 +478,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) } @@ -644,10 +644,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`) -}