diff --git a/cmd/glab/main.go b/cmd/glab/main.go index d0e8ad08924142d0189418c808e298f2e4354679..0ac047757ed03a308802250c6214a82e2a4e14e4 100644 --- a/cmd/glab/main.go +++ b/cmd/glab/main.go @@ -16,6 +16,7 @@ import ( "github.com/mgutz/ansi" surveyCore "github.com/AlecAivazis/survey/v2/core" + "gitlab.com/gitlab-org/cli/commands" "gitlab.com/gitlab-org/cli/commands/alias/expand" "gitlab.com/gitlab-org/cli/commands/cmdutils" @@ -109,37 +110,30 @@ func main() { } cmd, _, err := rootCmd.Traverse(expandedArgs) - if err != nil || cmd == rootCmd { - originalArgs := expandedArgs - isShell := false + // If a command was not found during traversal it will always return the rootCmd + // which has no parent. + if err != nil || !cmd.HasParent() { + var ( + originalArgs = expandedArgs + isShell bool + ) + + if debug { + fmt.Printf("%v -> %v\n", originalArgs, expandedArgs) + } + expandedArgs, isShell, err = expand.ExpandAlias(cfg, os.Args, nil) if err != nil { cmdFactory.IO.LogInfof("Failed to process alias: %s\n", err) os.Exit(2) } - if debug { - fmt.Printf("%v -> %v\n", originalArgs, expandedArgs) - } - if isShell { - externalCmd := exec.Command(expandedArgs[0], expandedArgs[1:]...) - externalCmd.Stderr = os.Stderr - externalCmd.Stdout = os.Stdout - externalCmd.Stdin = os.Stdin - preparedCmd := run.PrepareCmd(externalCmd) - - err = preparedCmd.Run() - if err != nil { - if ee, ok := err.(*exec.ExitError); ok { - os.Exit(ee.ExitCode()) - } - - cmdFactory.IO.LogInfof("failed to run external command: %s", err) - os.Exit(3) - } + runCmd(cmdFactory, expandedArgs) + } - os.Exit(0) + if isPlugin(expandedArgs) { + runPlugin(cmdFactory, expandedArgs) } } @@ -243,3 +237,39 @@ func maybeOverrideDefaultHost(f *cmdutils.Factory, cfg config.Config) { glinstance.OverrideDefault(customGLHost) } } + +func isPlugin(args []string) bool { + if len(args) == 0 { + return false + } + searchTerm := "glab-" + args[0] + _, err := exec.LookPath(searchTerm) + return err == nil +} + +func runCmd(utils *cmdutils.Factory, args []string) { + externalCmd := exec.Command(args[0], args[1:]...) + externalCmd.Stderr = os.Stderr + externalCmd.Stdout = os.Stdout + externalCmd.Stdin = os.Stdin + + preparedCmd := run.PrepareCmd(externalCmd) + if err := preparedCmd.Run(); err != nil { + handleCmdError(utils, err) + } + + os.Exit(0) +} + +func runPlugin(utils *cmdutils.Factory, args []string) { + args[0] = "glab-" + args[0] + runCmd(utils, args) +} + +func handleCmdError(utils *cmdutils.Factory, err error) { + utils.IO.LogInfof("failed to run external command: %s", err) + if ee, ok := err.(*exec.ExitError); ok { + os.Exit(ee.ExitCode()) + } + os.Exit(3) +} diff --git a/commands/root.go b/commands/root.go index 4131d3122ff6fece3b94c57bc40d22f69e65b0ad..170fdf02252775e4884a09aedf57630b17cea573 100644 --- a/commands/root.go +++ b/commands/root.go @@ -6,6 +6,7 @@ import ( "github.com/MakeNowJust/heredoc/v2" "github.com/spf13/cobra" "github.com/spf13/pflag" + aliasCmd "gitlab.com/gitlab-org/cli/commands/alias" apiCmd "gitlab.com/gitlab-org/cli/commands/api" authCmd "gitlab.com/gitlab-org/cli/commands/auth"