diff --git a/cmd/podman/common/completion.go b/cmd/podman/common/completion.go index 75825f1ea18e..404e4c0764e6 100644 --- a/cmd/podman/common/completion.go +++ b/cmd/podman/common/completion.go @@ -25,6 +25,8 @@ import ( systemdDefine "github.com/containers/podman/v4/pkg/systemd/define" "github.com/containers/podman/v4/pkg/util" securejoin "github.com/cyphar/filepath-securejoin" + "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" ) @@ -1015,19 +1017,55 @@ func AutocompleteRestartOption(cmd *cobra.Command, args []string, toComplete str } // AutocompleteSecurityOption - Autocomplete security options options. -func AutocompleteSecurityOption(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - kv := keyValueCompletion{ - "apparmor=": nil, - "no-new-privileges": nil, - "seccomp=": func(s string) ([]string, cobra.ShellCompDirective) { return nil, cobra.ShellCompDirectiveDefault }, - "label=": func(s string) ([]string, cobra.ShellCompDirective) { - if strings.HasPrefix(s, "d") { - return []string{"disable"}, cobra.ShellCompDirectiveNoFileComp +// func AutocompleteSecurityOption(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { +// kv := keyValueCompletion{ +// "apparmor=": nil, +// "no-new-privileges": nil, +// "seccomp=": func(s string) ([]string, cobra.ShellCompDirective) { return nil, cobra.ShellCompDirectiveDefault }, +// "label=": func(s string) ([]string, cobra.ShellCompDirective) { +// if strings.HasPrefix(s, "d") { +// return []string{"disable"}, cobra.ShellCompDirectiveNoFileComp +// } +// return []string{"user:", "role:", "type:", "level:", "filetype:", "disable"}, cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveNoFileComp +// }, +// } +// return completeKeyValues(toComplete, kv) +// } + +func ActionSecurityOptions() carapace.Action { + return carapace.ActionMultiPartsN("=", 2, func(c carapace.Context) carapace.Action { + switch len(c.Parts) { + case 0: + return carapace.Batch( + carapace.ActionValues("apparmor", "seccomp", "label").Suffix("="), + carapace.ActionValues("no-new-privileges"), + ).ToA() + default: + switch c.Parts[0] { + case "seccomp": + return carapace.ActionFiles() + case "label": + return carapace.ActionMultiPartsN(":", 2, func(c carapace.Context) carapace.Action { + switch len(c.Parts) { + case 0: + return carapace.Batch( + carapace.ActionValues("user", "role", "type", "level", "filetype").Suffix(":"), + carapace.ActionValues("disable").Style(style.Red), + ).ToA() + default: + switch c.Parts[0] { + case "user": + return carapace.ActionValues("userA", "userB") // TODO correct completions + default: + return carapace.ActionValues() + } + } + }) + default: + return carapace.ActionValues() } - return []string{"user:", "role:", "type:", "level:", "filetype:", "disable"}, cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveNoFileComp - }, - } - return completeKeyValues(toComplete, kv) + } + }) } // AutocompleteStopSignal - Autocomplete stop signal options. diff --git a/cmd/podman/common/create.go b/cmd/podman/common/create.go index 5c4d903c7ed8..be33fcdcbc7e 100644 --- a/cmd/podman/common/create.go +++ b/cmd/podman/common/create.go @@ -9,6 +9,7 @@ import ( "github.com/containers/podman/v4/cmd/podman/registry" "github.com/containers/podman/v4/libpod/define" "github.com/containers/podman/v4/pkg/domain/entities" + "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -666,7 +667,10 @@ func DefineCreateFlags(cmd *cobra.Command, cf *entities.ContainerCreateOptions, securityOptFlagName, []string{}, "Security Options", ) - _ = cmd.RegisterFlagCompletionFunc(securityOptFlagName, AutocompleteSecurityOption) + // _ = cmd.RegisterFlagCompletionFunc(securityOptFlagName, AutocompleteSecurityOption) + carapace.Gen(cmd).FlagCompletion(carapace.ActionMap{ + securityOptFlagName: ActionSecurityOptions(), + }) subgidnameFlagName := "subgidname" createFlags.StringVar( diff --git a/cmd/podman/main.go b/cmd/podman/main.go index e635c3441fcb..a53dad08ebbd 100644 --- a/cmd/podman/main.go +++ b/cmd/podman/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "github.com/rsteube/carapace" "os" "path/filepath" "strconv" @@ -56,6 +57,7 @@ func main() { } rootCmd = parseCommands() + carapace.Gen(rootCmd) Execute() os.Exit(0)