// Copyright (c) The OpenTofu Authors // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2023 HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package command import ( "bytes" "fmt" "strings" "github.com/posener/complete" "github.com/opentofu/opentofu/internal/tfdiags" ) type WorkspaceListCommand struct { Meta LegacyName bool } func (c *WorkspaceListCommand) Run(args []string) int { ctx := c.CommandContext() args = c.Meta.process(args) envCommandShowWarning(c.Ui, c.LegacyName) cmdFlags := c.Meta.defaultFlagSet("workspace list") c.Meta.varFlagSet(cmdFlags) cmdFlags.Usage = func() { c.Ui.Error(c.Help()) } if err := cmdFlags.Parse(args); err != nil { c.Ui.Error(fmt.Sprintf("Error parsing command-line flags: %s\n", err.Error())) return 1 } args = cmdFlags.Args() configPath, err := modulePath(args) if err != nil { c.Ui.Error(err.Error()) return 1 } // Load the encryption configuration enc, encDiags := c.EncryptionFromPath(ctx, configPath) if encDiags.HasErrors() { c.showDiagnostics(encDiags) return 1 } var diags tfdiags.Diagnostics backendConfig, backendDiags := c.loadBackendConfig(ctx, configPath) diags = diags.Append(backendDiags) if diags.HasErrors() { c.showDiagnostics(diags) return 1 } // Load the backend b, backendDiags := c.Backend(ctx, &BackendOpts{ Config: backendConfig, }, enc.State()) diags = diags.Append(backendDiags) if backendDiags.HasErrors() { c.showDiagnostics(diags) return 1 } // This command will not write state c.ignoreRemoteVersionConflict(b) states, err := b.Workspaces(ctx) if err != nil { c.Ui.Error(err.Error()) return 1 } env, isOverridden := c.WorkspaceOverridden(ctx) var out bytes.Buffer for _, s := range states { if s == env { out.WriteString("* ") } else { out.WriteString(" ") } out.WriteString(s + "\n") } c.Ui.Output(out.String()) if isOverridden { c.Ui.Output(envIsOverriddenNote) } return 0 } func (c *WorkspaceListCommand) AutocompleteArgs() complete.Predictor { return complete.PredictDirs("") } func (c *WorkspaceListCommand) AutocompleteFlags() complete.Flags { return nil } func (c *WorkspaceListCommand) Help() string { helpText := ` Usage: tofu [global options] workspace list [options] List OpenTofu workspaces. Options: -var 'foo=bar' Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable. -var-file=filename Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file. ` return strings.TrimSpace(helpText) } func (c *WorkspaceListCommand) Synopsis() string { return "List Workspaces" }