github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/cmd/state/internal/cmdtree/activate.go (about) 1 package cmdtree 2 3 import ( 4 "errors" 5 "os" 6 "os/exec" 7 8 "github.com/ActiveState/cli/internal/analytics/constants" 9 "github.com/ActiveState/cli/internal/captain" 10 "github.com/ActiveState/cli/internal/locale" 11 "github.com/ActiveState/cli/internal/primer" 12 "github.com/ActiveState/cli/internal/rtutils" 13 "github.com/ActiveState/cli/internal/runners/activate" 14 "github.com/ActiveState/cli/internal/sighandler" 15 "github.com/ActiveState/cli/pkg/project" 16 ) 17 18 const activateCmdName = "activate" 19 20 func newActivateCommand(prime *primer.Values) *captain.Command { 21 runner := activate.NewActivate(prime) 22 23 params := activate.ActivateParams{ 24 Namespace: &project.Namespaced{}, 25 } 26 27 cmd := captain.NewCommand( 28 activateCmdName, 29 "", 30 locale.T("activate_project"), 31 prime, 32 []*captain.Flag{ 33 { 34 Name: "path", 35 Shorthand: "", 36 Description: locale.T("flag_state_activate_path_description"), 37 Value: ¶ms.PreferredPath, 38 }, 39 { 40 Name: "default", 41 Description: locale.Tl("flag_state_activate_default_description", "Configures the project to always be available for use"), 42 Value: ¶ms.Default, 43 }, 44 { 45 Name: "branch", 46 Description: locale.Tl("flag_state_activate_branch_description", "Defines the branch to be used"), 47 Value: ¶ms.Branch, 48 }, 49 }, 50 []*captain.Argument{ 51 { 52 Name: locale.T("arg_state_activate_namespace"), 53 Description: locale.T("arg_state_activate_namespace_description"), 54 Value: params.Namespace, 55 }, 56 }, 57 func(_ *captain.Command, _ []string) (rerr error) { 58 as := sighandler.NewAwaitingSigHandler(os.Interrupt) 59 sighandler.Push(as) 60 defer rtutils.Closer(sighandler.Pop, &rerr) 61 err := as.WaitForFunc(func() error { 62 return runner.Run(¶ms) 63 }) 64 65 // Try to report why the activation failed 66 if err != nil { 67 an := prime.Analytics() 68 var serr interface{ Signal() os.Signal } 69 if errors.As(err, &serr) { 70 an.Event(constants.CatActivationFlow, "user-interrupt-error") 71 } 72 if locale.IsInputError(err) { 73 // Failed due to user input 74 an.Event(constants.CatActivationFlow, "user-input-error") 75 } else { 76 var exitErr = &exec.ExitError{} 77 if !errors.As(err, &exitErr) { 78 // Failed due to an error we might need to address 79 an.Event(constants.CatActivationFlow, "error") 80 } else { 81 // Failed due to user subshell actions / events 82 an.Event(constants.CatActivationFlow, "user-exit-error") 83 } 84 } 85 } 86 87 return err 88 }, 89 ) 90 cmd.SetGroup(EnvironmentUsageGroup) 91 cmd.DeprioritizeInHelpListing() 92 return cmd 93 }