From fc5f568c5d82f4a16982268fa67092e52be91fbe Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Tue, 28 Feb 2023 17:12:04 +0100 Subject: [PATCH] cmd/root: Don't use podman(1) when generating the completions Ever since commit bafbbe81c9220cb3, the shell completions are generated while building Toolbx using the 'completion' command. This involves running toolbox(1) itself, and hence invoking 'podman version' to decide if 'podman system migrate' is needed or not. Unfortunately, some build environments, like Fedora's, are set up inside a chroot(2) or systemd-nspawn(1) or similar, where 'podman version' may not work because it does various things with namespaces(7) and clone(2) that can, under certain circumstances, encounter an EPERM. Therefore, it's better to avoid using podman(1) when generating the shell completions, especially, since they are generated by Cobra itself and podman(1) is not involved at all. Note that podman(1) is needed when the generated shell completions are actually used in interactive command line environments. The shell completions invoke the hidden '__complete' command to get the results that are presented to the user, and, if needed, 'podman system migrate' will continue to be run as part of that. This partially reverts commit f3e005d0142d7ec76d5ac8f0a2f331a52fd46011 because podman(1) is now only an optional runtime dependency for the system tests. https://github.com/containers/podman/issues/17657 --- meson.build | 2 +- src/cmd/root.go | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index 6f044bb..653a3d3 100644 --- a/meson.build +++ b/meson.build @@ -18,12 +18,12 @@ subid_dep = cc.find_library('subid', has_headers: ['shadow/subid.h']) go = find_program('go') go_md2man = find_program('go-md2man') -podman = find_program('podman') bats = find_program('bats', required: false) codespell = find_program('codespell', required: false) htpasswd = find_program('htpasswd', required: false) openssl = find_program('openssl', required: false) +podman = find_program('podman', required: false) shellcheck = find_program('shellcheck', required: false) skopeo = find_program('skopeo', required: false) diff --git a/src/cmd/root.go b/src/cmd/root.go index 304b03d..9975ccc 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -166,7 +166,7 @@ func preRun(cmd *cobra.Command, args []string) error { logrus.Debugf("TOOLBOX_PATH is %s", toolboxPath) - if err := migrate(); err != nil { + if err := migrate(cmd, args); err != nil { return err } @@ -211,13 +211,18 @@ func rootRun(cmd *cobra.Command, args []string) error { return rootRunImpl(cmd, args) } -func migrate() error { +func migrate(cmd *cobra.Command, args []string) error { logrus.Debug("Migrating to newer Podman") if utils.IsInsideContainer() { return nil } + if cmdName, completionCmdName := cmd.Name(), completionCmd.Name(); cmdName == completionCmdName { + logrus.Debugf("Migration not needed: command %s doesn't need it", cmdName) + return nil + } + configDir, err := os.UserConfigDir() if err != nil { logrus.Debugf("Migrating to newer Podman: failed to get the user config directory: %s", err)