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:       &params.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:       &params.Default,
    43  			},
    44  			{
    45  				Name:        "branch",
    46  				Description: locale.Tl("flag_state_activate_branch_description", "Defines the branch to be used"),
    47  				Value:       &params.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(&params)
    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  }