Enable remote shell completion without a running endpoint

The problem is that we always unconditionally setup up the
`ContainerEngine/ImageEngine`. This requires an running
endpoint. Most completions (e.g. flag names) do not need
them and should not fail. This commit makes sure we only
setup the engines as needed in the completions.

Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
This commit is contained in:
Paul Holzinger
2020-11-20 17:49:24 +01:00
parent 042d4884ea
commit bf11bb769f
2 changed files with 118 additions and 70 deletions

View File

@ -12,6 +12,7 @@ import (
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/registries" "github.com/containers/podman/v2/pkg/registries"
"github.com/containers/podman/v2/pkg/rootless"
systemdGen "github.com/containers/podman/v2/pkg/systemd/generate" systemdGen "github.com/containers/podman/v2/pkg/systemd/generate"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -36,7 +37,35 @@ const (
type keyValueCompletion map[string]func(s string) ([]string, cobra.ShellCompDirective) type keyValueCompletion map[string]func(s string) ([]string, cobra.ShellCompDirective)
func getContainers(toComplete string, cType completeType, statuses ...string) ([]string, cobra.ShellCompDirective) { func setupContainerEngine(cmd *cobra.Command) (entities.ContainerEngine, error) {
containerEngine, err := registry.NewContainerEngine(cmd, []string{})
if err != nil {
cobra.CompErrorln(err.Error())
return nil, err
}
if !registry.IsRemote() && rootless.IsRootless() {
err := containerEngine.SetupRootless(registry.Context(), cmd)
if err != nil {
return nil, err
}
}
return containerEngine, nil
}
func setupImageEngine(cmd *cobra.Command) (entities.ImageEngine, error) {
imageEngine, err := registry.NewImageEngine(cmd, []string{})
if err != nil {
return nil, err
}
// we also need to set up the container engine since this
// is required to setup the rootless namespace
if _, err = setupContainerEngine(cmd); err != nil {
return nil, err
}
return imageEngine, nil
}
func getContainers(cmd *cobra.Command, toComplete string, cType completeType, statuses ...string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{} suggestions := []string{}
listOpts := entities.ContainerListOptions{ listOpts := entities.ContainerListOptions{
Filters: make(map[string][]string), Filters: make(map[string][]string),
@ -47,7 +76,12 @@ func getContainers(toComplete string, cType completeType, statuses ...string) ([
listOpts.Filters["status"] = statuses listOpts.Filters["status"] = statuses
} }
containers, err := registry.ContainerEngine().ContainerList(registry.GetContext(), listOpts) engine, err := setupContainerEngine(cmd)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveNoFileComp
}
containers, err := engine.ContainerList(registry.GetContext(), listOpts)
if err != nil { if err != nil {
cobra.CompErrorln(err.Error()) cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError return nil, cobra.ShellCompDirectiveError
@ -68,7 +102,7 @@ func getContainers(toComplete string, cType completeType, statuses ...string) ([
return suggestions, cobra.ShellCompDirectiveNoFileComp return suggestions, cobra.ShellCompDirectiveNoFileComp
} }
func getPods(toComplete string, cType completeType, statuses ...string) ([]string, cobra.ShellCompDirective) { func getPods(cmd *cobra.Command, toComplete string, cType completeType, statuses ...string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{} suggestions := []string{}
listOpts := entities.PodPSOptions{ listOpts := entities.PodPSOptions{
Filters: make(map[string][]string), Filters: make(map[string][]string),
@ -77,7 +111,12 @@ func getPods(toComplete string, cType completeType, statuses ...string) ([]strin
listOpts.Filters["status"] = statuses listOpts.Filters["status"] = statuses
} }
pods, err := registry.ContainerEngine().PodPs(registry.GetContext(), listOpts) engine, err := setupContainerEngine(cmd)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveNoFileComp
}
pods, err := engine.PodPs(registry.GetContext(), listOpts)
if err != nil { if err != nil {
cobra.CompErrorln(err.Error()) cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError return nil, cobra.ShellCompDirectiveError
@ -98,11 +137,16 @@ func getPods(toComplete string, cType completeType, statuses ...string) ([]strin
return suggestions, cobra.ShellCompDirectiveNoFileComp return suggestions, cobra.ShellCompDirectiveNoFileComp
} }
func getVolumes(toComplete string) ([]string, cobra.ShellCompDirective) { func getVolumes(cmd *cobra.Command, toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{} suggestions := []string{}
lsOpts := entities.VolumeListOptions{} lsOpts := entities.VolumeListOptions{}
volumes, err := registry.ContainerEngine().VolumeList(registry.GetContext(), lsOpts) engine, err := setupContainerEngine(cmd)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveNoFileComp
}
volumes, err := engine.VolumeList(registry.GetContext(), lsOpts)
if err != nil { if err != nil {
cobra.CompErrorln(err.Error()) cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError return nil, cobra.ShellCompDirectiveError
@ -116,11 +160,16 @@ func getVolumes(toComplete string) ([]string, cobra.ShellCompDirective) {
return suggestions, cobra.ShellCompDirectiveNoFileComp return suggestions, cobra.ShellCompDirectiveNoFileComp
} }
func getImages(toComplete string) ([]string, cobra.ShellCompDirective) { func getImages(cmd *cobra.Command, toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{} suggestions := []string{}
listOptions := entities.ImageListOptions{} listOptions := entities.ImageListOptions{}
images, err := registry.ImageEngine().List(registry.GetContext(), listOptions) engine, err := setupImageEngine(cmd)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveNoFileComp
}
images, err := engine.List(registry.GetContext(), listOptions)
if err != nil { if err != nil {
cobra.CompErrorln(err.Error()) cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError return nil, cobra.ShellCompDirectiveError
@ -171,11 +220,16 @@ func getRegistries() ([]string, cobra.ShellCompDirective) {
return regs, cobra.ShellCompDirectiveNoFileComp return regs, cobra.ShellCompDirectiveNoFileComp
} }
func getNetworks(toComplete string) ([]string, cobra.ShellCompDirective) { func getNetworks(cmd *cobra.Command, toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{} suggestions := []string{}
networkListOptions := entities.NetworkListOptions{} networkListOptions := entities.NetworkListOptions{}
networks, err := registry.ContainerEngine().NetworkList(registry.Context(), networkListOptions) engine, err := setupContainerEngine(cmd)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveNoFileComp
}
networks, err := engine.NetworkList(registry.Context(), networkListOptions)
if err != nil { if err != nil {
cobra.CompErrorln(err.Error()) cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError return nil, cobra.ShellCompDirectiveError
@ -266,7 +320,7 @@ func AutocompleteContainers(cmd *cobra.Command, args []string, toComplete string
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getContainers(toComplete, completeDefault) return getContainers(cmd, toComplete, completeDefault)
} }
// AutocompleteContainersCreated - Autocomplete only created container names. // AutocompleteContainersCreated - Autocomplete only created container names.
@ -274,7 +328,7 @@ func AutocompleteContainersCreated(cmd *cobra.Command, args []string, toComplete
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getContainers(toComplete, completeDefault, "created") return getContainers(cmd, toComplete, completeDefault, "created")
} }
// AutocompleteContainersExited - Autocomplete only exited container names. // AutocompleteContainersExited - Autocomplete only exited container names.
@ -282,7 +336,7 @@ func AutocompleteContainersExited(cmd *cobra.Command, args []string, toComplete
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getContainers(toComplete, completeDefault, "exited") return getContainers(cmd, toComplete, completeDefault, "exited")
} }
// AutocompleteContainersPaused - Autocomplete only paused container names. // AutocompleteContainersPaused - Autocomplete only paused container names.
@ -290,7 +344,7 @@ func AutocompleteContainersPaused(cmd *cobra.Command, args []string, toComplete
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getContainers(toComplete, completeDefault, "paused") return getContainers(cmd, toComplete, completeDefault, "paused")
} }
// AutocompleteContainersRunning - Autocomplete only running container names. // AutocompleteContainersRunning - Autocomplete only running container names.
@ -298,7 +352,7 @@ func AutocompleteContainersRunning(cmd *cobra.Command, args []string, toComplete
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getContainers(toComplete, completeDefault, "running") return getContainers(cmd, toComplete, completeDefault, "running")
} }
// AutocompleteContainersStartable - Autocomplete only created and exited container names. // AutocompleteContainersStartable - Autocomplete only created and exited container names.
@ -306,7 +360,7 @@ func AutocompleteContainersStartable(cmd *cobra.Command, args []string, toComple
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getContainers(toComplete, completeDefault, "created", "exited") return getContainers(cmd, toComplete, completeDefault, "created", "exited")
} }
// AutocompletePods - Autocomplete all pod names. // AutocompletePods - Autocomplete all pod names.
@ -314,7 +368,7 @@ func AutocompletePods(cmd *cobra.Command, args []string, toComplete string) ([]s
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getPods(toComplete, completeDefault) return getPods(cmd, toComplete, completeDefault)
} }
// AutocompletePodsRunning - Autocomplete only running pod names. // AutocompletePodsRunning - Autocomplete only running pod names.
@ -323,7 +377,7 @@ func AutocompletePodsRunning(cmd *cobra.Command, args []string, toComplete strin
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getPods(toComplete, completeDefault, "running", "degraded") return getPods(cmd, toComplete, completeDefault, "running", "degraded")
} }
// AutocompleteContainersAndPods - Autocomplete container names and pod names. // AutocompleteContainersAndPods - Autocomplete container names and pod names.
@ -331,8 +385,8 @@ func AutocompleteContainersAndPods(cmd *cobra.Command, args []string, toComplete
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
containers, _ := getContainers(toComplete, completeDefault) containers, _ := getContainers(cmd, toComplete, completeDefault)
pods, _ := getPods(toComplete, completeDefault) pods, _ := getPods(cmd, toComplete, completeDefault)
return append(containers, pods...), cobra.ShellCompDirectiveNoFileComp return append(containers, pods...), cobra.ShellCompDirectiveNoFileComp
} }
@ -341,8 +395,8 @@ func AutocompleteContainersAndImages(cmd *cobra.Command, args []string, toComple
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
containers, _ := getContainers(toComplete, completeDefault) containers, _ := getContainers(cmd, toComplete, completeDefault)
images, _ := getImages(toComplete) images, _ := getImages(cmd, toComplete)
return append(containers, images...), cobra.ShellCompDirectiveNoFileComp return append(containers, images...), cobra.ShellCompDirectiveNoFileComp
} }
@ -351,7 +405,7 @@ func AutocompleteVolumes(cmd *cobra.Command, args []string, toComplete string) (
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getVolumes(toComplete) return getVolumes(cmd, toComplete)
} }
// AutocompleteImages - Autocomplete images. // AutocompleteImages - Autocomplete images.
@ -359,7 +413,7 @@ func AutocompleteImages(cmd *cobra.Command, args []string, toComplete string) ([
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getImages(toComplete) return getImages(cmd, toComplete)
} }
// AutocompleteCreateRun - Autocomplete only the fist argument as image and then do file completion. // AutocompleteCreateRun - Autocomplete only the fist argument as image and then do file completion.
@ -368,7 +422,7 @@ func AutocompleteCreateRun(cmd *cobra.Command, args []string, toComplete string)
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
if len(args) < 1 { if len(args) < 1 {
return getImages(toComplete) return getImages(cmd, toComplete)
} }
// TODO: add path completion for files in the image // TODO: add path completion for files in the image
return nil, cobra.ShellCompDirectiveDefault return nil, cobra.ShellCompDirectiveDefault
@ -387,7 +441,7 @@ func AutocompleteNetworks(cmd *cobra.Command, args []string, toComplete string)
if !validCurrentCmdLine(cmd, args, toComplete) { if !validCurrentCmdLine(cmd, args, toComplete) {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
return getNetworks(toComplete) return getNetworks(cmd, toComplete)
} }
// AutocompleteCpCommand - Autocomplete podman cp command args. // AutocompleteCpCommand - Autocomplete podman cp command args.
@ -396,7 +450,7 @@ func AutocompleteCpCommand(cmd *cobra.Command, args []string, toComplete string)
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
} }
if len(args) < 2 { if len(args) < 2 {
containers, _ := getContainers(toComplete, completeDefault) containers, _ := getContainers(cmd, toComplete, completeDefault)
for _, container := range containers { for _, container := range containers {
// TODO: Add path completion for inside the container if possible // TODO: Add path completion for inside the container if possible
if strings.HasPrefix(container, toComplete) { if strings.HasPrefix(container, toComplete) {
@ -464,7 +518,7 @@ func AutocompleteCreateAttach(cmd *cobra.Command, args []string, toComplete stri
// -> host,container:[name],ns:[path],private // -> host,container:[name],ns:[path],private
func AutocompleteNamespace(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { func AutocompleteNamespace(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
kv := keyValueCompletion{ kv := keyValueCompletion{
"container:": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(s, completeDefault) }, "container:": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(cmd, s, completeDefault) },
"ns:": func(s string) ([]string, cobra.ShellCompDirective) { return nil, cobra.ShellCompDirectiveDefault }, "ns:": func(s string) ([]string, cobra.ShellCompDirective) { return nil, cobra.ShellCompDirectiveDefault },
"host": nil, "host": nil,
"private": nil, "private": nil,
@ -623,7 +677,7 @@ func AutocompleteMountFlag(cmd *cobra.Command, args []string, toComplete string)
// AutocompleteVolumeFlag - Autocomplete volume flag options. // AutocompleteVolumeFlag - Autocomplete volume flag options.
// -> volumes and paths // -> volumes and paths
func AutocompleteVolumeFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { func AutocompleteVolumeFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
volumes, _ := getVolumes(toComplete) volumes, _ := getVolumes(cmd, toComplete)
directive := cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveDefault directive := cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveDefault
if strings.Contains(toComplete, ":") { if strings.Contains(toComplete, ":") {
// add space after second path // add space after second path
@ -753,15 +807,15 @@ var containerStatuses = []string{"created", "running", "paused", "stopped", "exi
// AutocompletePsFilters - Autocomplete ps filter options. // AutocompletePsFilters - Autocomplete ps filter options.
func AutocompletePsFilters(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { func AutocompletePsFilters(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
kv := keyValueCompletion{ kv := keyValueCompletion{
"id=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(s, completeIDs) }, "id=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(cmd, s, completeIDs) },
"name=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(s, completeNames) }, "name=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(cmd, s, completeNames) },
"status=": func(_ string) ([]string, cobra.ShellCompDirective) { "status=": func(_ string) ([]string, cobra.ShellCompDirective) {
return containerStatuses, cobra.ShellCompDirectiveNoFileComp return containerStatuses, cobra.ShellCompDirectiveNoFileComp
}, },
"ancestor": func(s string) ([]string, cobra.ShellCompDirective) { return getImages(s) }, "ancestor": func(s string) ([]string, cobra.ShellCompDirective) { return getImages(cmd, s) },
"before=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(s, completeDefault) }, "before=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(cmd, s, completeDefault) },
"since=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(s, completeDefault) }, "since=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(cmd, s, completeDefault) },
"volume=": func(s string) ([]string, cobra.ShellCompDirective) { return getVolumes(s) }, "volume=": func(s string) ([]string, cobra.ShellCompDirective) { return getVolumes(cmd, s) },
"health=": func(_ string) ([]string, cobra.ShellCompDirective) { "health=": func(_ string) ([]string, cobra.ShellCompDirective) {
return []string{define.HealthCheckHealthy, return []string{define.HealthCheckHealthy,
define.HealthCheckUnhealthy}, cobra.ShellCompDirectiveNoFileComp define.HealthCheckUnhealthy}, cobra.ShellCompDirectiveNoFileComp
@ -776,14 +830,14 @@ func AutocompletePsFilters(cmd *cobra.Command, args []string, toComplete string)
// AutocompletePodPsFilters - Autocomplete pod ps filter options. // AutocompletePodPsFilters - Autocomplete pod ps filter options.
func AutocompletePodPsFilters(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { func AutocompletePodPsFilters(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
kv := keyValueCompletion{ kv := keyValueCompletion{
"id=": func(s string) ([]string, cobra.ShellCompDirective) { return getPods(s, completeIDs) }, "id=": func(s string) ([]string, cobra.ShellCompDirective) { return getPods(cmd, s, completeIDs) },
"name=": func(s string) ([]string, cobra.ShellCompDirective) { return getPods(s, completeNames) }, "name=": func(s string) ([]string, cobra.ShellCompDirective) { return getPods(cmd, s, completeNames) },
"status=": func(_ string) ([]string, cobra.ShellCompDirective) { "status=": func(_ string) ([]string, cobra.ShellCompDirective) {
return []string{"stopped", "running", return []string{"stopped", "running",
"paused", "exited", "dead", "created", "degraded"}, cobra.ShellCompDirectiveNoFileComp "paused", "exited", "dead", "created", "degraded"}, cobra.ShellCompDirectiveNoFileComp
}, },
"ctr-ids=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(s, completeIDs) }, "ctr-ids=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(cmd, s, completeIDs) },
"ctr-names=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(s, completeNames) }, "ctr-names=": func(s string) ([]string, cobra.ShellCompDirective) { return getContainers(cmd, s, completeNames) },
"ctr-number=": nil, "ctr-number=": nil,
"ctr-status=": func(_ string) ([]string, cobra.ShellCompDirective) { "ctr-status=": func(_ string) ([]string, cobra.ShellCompDirective) {
return containerStatuses, cobra.ShellCompDirectiveNoFileComp return containerStatuses, cobra.ShellCompDirectiveNoFileComp

View File

@ -113,6 +113,28 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {
return nil return nil
} }
cfg := registry.PodmanConfig()
// --connection is not as "special" as --remote so we can wait and process it here
conn := cmd.Root().LocalFlags().Lookup("connection")
if conn != nil && conn.Changed {
cfg.Engine.ActiveService = conn.Value.String()
var err error
cfg.URI, cfg.Identity, err = cfg.ActiveDestination()
if err != nil {
return errors.Wrap(err, "failed to resolve active destination")
}
if err := cmd.Root().LocalFlags().Set("url", cfg.URI); err != nil {
return errors.Wrap(err, "failed to override --url flag")
}
if err := cmd.Root().LocalFlags().Set("identity", cfg.Identity); err != nil {
return errors.Wrap(err, "failed to override --identity flag")
}
}
// Special case if command is hidden completion command ("__complete","__completeNoDesc") // Special case if command is hidden completion command ("__complete","__completeNoDesc")
// Since __completeNoDesc is an alias the cm.Name is always __complete // Since __completeNoDesc is an alias the cm.Name is always __complete
if cmd.Name() == cobra.ShellCompRequestCmd { if cmd.Name() == cobra.ShellCompRequestCmd {
@ -129,37 +151,9 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {
flag.Hidden = true flag.Hidden = true
}) })
} }
// No need for further setup when completing commands with subcommands. // No need for further setup the completion logic setups the engines as needed.
if compCmd.HasSubCommands() { requireCleanup = false
requireCleanup = false return nil
return nil
}
}
cfg := registry.PodmanConfig()
// --connection is not as "special" as --remote so we can wait and process it here
var connErr error
conn := cmd.Root().LocalFlags().Lookup("connection")
if conn != nil && conn.Changed {
cfg.Engine.ActiveService = conn.Value.String()
var err error
cfg.URI, cfg.Identity, err = cfg.ActiveDestination()
if err != nil {
connErr = errors.Wrap(err, "failed to resolve active destination")
}
if err := cmd.Root().LocalFlags().Set("url", cfg.URI); err != nil {
connErr = errors.Wrap(err, "failed to override --url flag")
}
if err := cmd.Root().LocalFlags().Set("identity", cfg.Identity); err != nil {
connErr = errors.Wrap(err, "failed to override --identity flag")
}
}
if connErr != nil {
return connErr
} }
// Prep the engines // Prep the engines