From 5e6d14c89a09e360656b81212fb7a7400f3bb082 Mon Sep 17 00:00:00 2001 From: Yedaya Katsman Date: Sun, 16 Feb 2025 23:21:04 +0200 Subject: [PATCH] WIP: Complete paths for some transports left to do: - Dir transports - containers-storage - need some dependency? - Count args - stop completing transports --- cmd/skopeo/completions.go | 28 +++++++++++++++++++++++++--- cmd/skopeo/copy.go | 2 +- cmd/skopeo/delete.go | 2 +- cmd/skopeo/inspect.go | 2 +- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/cmd/skopeo/completions.go b/cmd/skopeo/completions.go index e0d923fc3f..682d432ef4 100644 --- a/cmd/skopeo/completions.go +++ b/cmd/skopeo/completions.go @@ -4,10 +4,32 @@ import ( "github.com/containers/image/v5/tarball" "github.com/containers/image/v5/transports" "github.com/spf13/cobra" + "strings" ) -// autocompleteSupportedTransports list all supported transports with the colon suffix. -func autocompleteSupportedTransports(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { +func autocompleteTransports(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + directive := cobra.ShellCompDirectiveNoSpace + // We still don't have a transport + if !strings.Contains(toComplete, ":") { + transports := supportedTransportSuggestions() + return transports, directive | cobra.ShellCompDirectiveNoFileComp + } + if strings.HasPrefix(toComplete, "oci-archive:") || strings.HasPrefix(toComplete, "docker-archive:") || strings.HasPrefix(toComplete, "sif:") || strings.HasPrefix(toComplete, "oci:") { + return nil, directive + } + if toComplete == "docker:" { + return []string{"docker://"}, directive | cobra.ShellCompDirectiveNoFileComp + } + if strings.HasPrefix(toComplete, "dir:") { + // This doesn't seem to actually work, at least in bash. It completes regular files as well. + return nil, cobra.ShellCompDirectiveFilterDirs + } + return nil, directive | cobra.ShellCompDirectiveNoFileComp + +} + +// supportedTransportSuggestions list all supported transports with the colon suffix. +func supportedTransportSuggestions() []string { tps := transports.ListNames() suggestions := make([]string, 0, len(tps)) for _, tp := range tps { @@ -18,5 +40,5 @@ func autocompleteSupportedTransports(cmd *cobra.Command, args []string, toComple suggestions = append(suggestions, tp+":") } } - return suggestions, cobra.ShellCompDirectiveNoFileComp | cobra.ShellCompDirectiveNoSpace + return suggestions } diff --git a/cmd/skopeo/copy.go b/cmd/skopeo/copy.go index db13c998eb..cf6cb68f3f 100644 --- a/cmd/skopeo/copy.go +++ b/cmd/skopeo/copy.go @@ -71,7 +71,7 @@ See skopeo(1) section "IMAGE NAMES" for the expected format `, strings.Join(transports.ListNames(), ", ")), RunE: commandAction(opts.run), Example: `skopeo copy docker://quay.io/skopeo/stable:latest docker://registry.example.com/skopeo:latest`, - ValidArgsFunction: autocompleteSupportedTransports, + ValidArgsFunction: autocompleteTransports, } adjustUsage(cmd) flags := cmd.Flags() diff --git a/cmd/skopeo/delete.go b/cmd/skopeo/delete.go index 84ed5f972b..2f4e38480c 100644 --- a/cmd/skopeo/delete.go +++ b/cmd/skopeo/delete.go @@ -37,7 +37,7 @@ See skopeo(1) section "IMAGE NAMES" for the expected format `, strings.Join(transports.ListNames(), ", ")), RunE: commandAction(opts.run), Example: `skopeo delete docker://registry.example.com/example/pause:latest`, - ValidArgsFunction: autocompleteSupportedTransports, + ValidArgsFunction: autocompleteTransports, } adjustUsage(cmd) flags := cmd.Flags() diff --git a/cmd/skopeo/inspect.go b/cmd/skopeo/inspect.go index e969caa4c1..402314fe73 100644 --- a/cmd/skopeo/inspect.go +++ b/cmd/skopeo/inspect.go @@ -53,7 +53,7 @@ See skopeo(1) section "IMAGE NAMES" for the expected format Example: `skopeo inspect docker://registry.fedoraproject.org/fedora skopeo inspect --config docker://docker.io/alpine skopeo inspect --format "Name: {{.Name}} Digest: {{.Digest}}" docker://registry.access.redhat.com/ubi8`, - ValidArgsFunction: autocompleteSupportedTransports, + ValidArgsFunction: autocompleteTransports, } adjustUsage(cmd) flags := cmd.Flags()