commands/stack/switch/switch.go (58 lines of code) (raw):

package stackswitch import ( "fmt" "github.com/MakeNowJust/heredoc/v2" "github.com/spf13/cobra" "gitlab.com/gitlab-org/cli/commands/cmdutils" "gitlab.com/gitlab-org/cli/pkg/git" "gitlab.com/gitlab-org/cli/pkg/text" ) func NewCmdStackSwitch(f *cmdutils.Factory, gr git.GitRunner) *cobra.Command { stackSwitchCmd := &cobra.Command{ Use: "switch <stack-name>", Short: "Switch between stacks. (EXPERIMENTAL.)", Long: heredoc.Doc( "Switch between stacks to work on another stack created with \"glab stack create\".\n" + "To see the list of all stacks, check the `.git/stacked/` directory.\n" + text.ExperimentalString, ), Example: "$ glab stack switch <stack-name>", RunE: func(cmd *cobra.Command, args []string) error { if err := switchFunc(f, args[0]); err != nil { return fmt.Errorf("switching stacks failed: %w", err) } return nil }, Args: cobra.ExactArgs(1), } return stackSwitchCmd } func switchFunc(f *cmdutils.Factory, name string) error { currentStackTitle, err := git.GetCurrentStackTitle() if err != nil { return fmt.Errorf("error getting current stack: %v", err) } if currentStackTitle == name { // No need to switch, we're already on the right stack return nil } stacks, err := git.GetStacks() if err != nil { return fmt.Errorf("getting stacks: %v", err) } var foundStack *git.Stack for _, s := range stacks { if s.Title == name { foundStack = &s break } } if foundStack == nil { return fmt.Errorf("no stack named %q found", name) } err = git.SetLocalConfig("glab.currentstack", name) if err != nil { return fmt.Errorf("error setting local Git config: %w", err) } fmt.Fprintf(f.IO.StdOut, "Switched to stack %s.\n", name) return nil }