From 7b6134f35e25f8457b0c406aed731f080893436e Mon Sep 17 00:00:00 2001 From: p4u1 Date: Fri, 10 Nov 2023 12:03:10 +0100 Subject: [PATCH] add bash completion for abra cmd --- cli/app/cmd.go | 41 +++++++++++++++++++++++++++++--- pkg/autocomplete/autocomplete.go | 10 ++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/cli/app/cmd.go b/cli/app/cmd.go index 9073ce92..002eecfa 100644 --- a/cli/app/cmd.go +++ b/cli/app/cmd.go @@ -10,6 +10,7 @@ import ( "strings" "coopcloud.tech/abra/cli/internal" + "coopcloud.tech/abra/pkg/app" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" @@ -45,6 +46,17 @@ Example: }, Before: internal.SubCommandBefore, Subcommands: []cli.Command{appCmdListCommand}, + BashComplete: func(ctx *cli.Context) { + args := ctx.Args() + switch len(args) { + case 0: + autocomplete.AppNameComplete(ctx) + case 1: + autocomplete.ServiceNameComplete(args.Get(0)) + case 2: + cmdNameComplete(args.Get(0)) + } + }, Action: func(c *cli.Context) error { app := internal.ValidateApp(c) @@ -187,6 +199,20 @@ func parseCmdArgs(args []string, isLocal bool) (bool, string) { return hasCmdArgs, parsedCmdArgs } +func cmdNameComplete(appName string) { + app, err := app.Get(appName) + if err != nil { + return + } + cmdNames, _ := getShCmdNames(app) + if err != nil { + return + } + for _, n := range cmdNames { + fmt.Println(n) + } +} + var appCmdListCommand = cli.Command{ Name: "list", Aliases: []string{"ls"}, @@ -222,13 +248,11 @@ var appCmdListCommand = cli.Command{ } } - abraShPath := fmt.Sprintf("%s/%s/%s", config.RECIPES_DIR, app.Recipe, "abra.sh") - cmdNames, err := config.ReadAbraShCmdNames(abraShPath) + cmdNames, err := getShCmdNames(app) if err != nil { logrus.Fatal(err) } - sort.Strings(cmdNames) for _, cmdName := range cmdNames { fmt.Println(cmdName) } @@ -236,3 +260,14 @@ var appCmdListCommand = cli.Command{ return nil }, } + +func getShCmdNames(app config.App) ([]string, error) { + abraShPath := fmt.Sprintf("%s/%s/%s", config.RECIPES_DIR, app.Recipe, "abra.sh") + cmdNames, err := config.ReadAbraShCmdNames(abraShPath) + if err != nil { + return nil, err + } + + sort.Strings(cmdNames) + return cmdNames, nil +} diff --git a/pkg/autocomplete/autocomplete.go b/pkg/autocomplete/autocomplete.go index 807422fb..9d5075d6 100644 --- a/pkg/autocomplete/autocomplete.go +++ b/pkg/autocomplete/autocomplete.go @@ -25,6 +25,16 @@ func AppNameComplete(c *cli.Context) { } } +func ServiceNameComplete(appName string) { + serviceNames, err := config.GetAppServiceNames(appName) + if err != nil { + return + } + for _, s := range serviceNames { + fmt.Println(s) + } +} + // RecipeNameComplete completes recipe names. func RecipeNameComplete(c *cli.Context) { catl, err := recipe.ReadRecipeCatalogue(false)