Skip to content

Commit 23eadcd

Browse files
authored
Merge pull request #5936 from thaJeztah/plugin_manager_cleanups
cli-plugins/manager: minor cleanups and refactoring
2 parents 3b45f3c + 091421f commit 23eadcd

File tree

3 files changed

+28
-34
lines changed

3 files changed

+28
-34
lines changed

cli-plugins/manager/hooks.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,10 @@ func invokeAndCollectHooks(ctx context.Context, cfg *configfile.ConfigFile, root
6464
return nil
6565
}
6666

67-
pluginDirs, err := getPluginDirs(cfg)
68-
if err != nil {
69-
return nil
70-
}
67+
pluginDirs := getPluginDirs(cfg)
7168
nextSteps := make([]string, 0, len(pluginsCfg))
72-
for pluginName, cfg := range pluginsCfg {
73-
match, ok := pluginMatch(cfg, subCmdStr)
69+
for pluginName, pluginCfg := range pluginsCfg {
70+
match, ok := pluginMatch(pluginCfg, subCmdStr)
7471
if !ok {
7572
continue
7673
}

cli-plugins/manager/manager.go

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,16 @@ func IsNotFound(err error) bool {
6161
// 3. Platform-specific defaultSystemPluginDirs.
6262
//
6363
// [ConfigFile.CLIPluginsExtraDirs]: https://pkg.go.dev/github.com/docker/[email protected]+incompatible/cli/config/configfile#ConfigFile.CLIPluginsExtraDirs
64-
func getPluginDirs(cfg *configfile.ConfigFile) ([]string, error) {
64+
func getPluginDirs(cfg *configfile.ConfigFile) []string {
6565
var pluginDirs []string
6666

6767
if cfg != nil {
6868
pluginDirs = append(pluginDirs, cfg.CLIPluginsExtraDirs...)
6969
}
70-
pluginDir, err := config.Path("cli-plugins")
71-
if err != nil {
72-
return nil, err
73-
}
74-
70+
pluginDir := filepath.Join(config.Dir(), "cli-plugins")
7571
pluginDirs = append(pluginDirs, pluginDir)
7672
pluginDirs = append(pluginDirs, defaultSystemPluginDirs...)
77-
return pluginDirs, nil
73+
return pluginDirs
7874
}
7975

8076
func addPluginCandidatesFromDir(res map[string][]string, d string) {
@@ -116,10 +112,7 @@ func listPluginCandidates(dirs []string) map[string][]string {
116112

117113
// GetPlugin returns a plugin on the system by its name
118114
func GetPlugin(name string, dockerCLI config.Provider, rootcmd *cobra.Command) (*Plugin, error) {
119-
pluginDirs, err := getPluginDirs(dockerCLI.ConfigFile())
120-
if err != nil {
121-
return nil, err
122-
}
115+
pluginDirs := getPluginDirs(dockerCLI.ConfigFile())
123116
return getPlugin(name, pluginDirs, rootcmd)
124117
}
125118

@@ -145,16 +138,20 @@ func getPlugin(name string, pluginDirs []string, rootcmd *cobra.Command) (*Plugi
145138

146139
// ListPlugins produces a list of the plugins available on the system
147140
func ListPlugins(dockerCli config.Provider, rootcmd *cobra.Command) ([]Plugin, error) {
148-
pluginDirs, err := getPluginDirs(dockerCli.ConfigFile())
149-
if err != nil {
150-
return nil, err
151-
}
152-
141+
pluginDirs := getPluginDirs(dockerCli.ConfigFile())
153142
candidates := listPluginCandidates(pluginDirs)
143+
if len(candidates) == 0 {
144+
return nil, nil
145+
}
154146

155147
var plugins []Plugin
156148
var mu sync.Mutex
157-
eg, _ := errgroup.WithContext(context.TODO())
149+
ctx := rootcmd.Context()
150+
if ctx == nil {
151+
// Fallback, mostly for tests that pass a bare cobra.command
152+
ctx = context.Background()
153+
}
154+
eg, _ := errgroup.WithContext(ctx)
158155
cmds := rootcmd.Commands()
159156
for _, paths := range candidates {
160157
func(paths []string) {
@@ -202,10 +199,7 @@ func PluginRunCommand(dockerCli config.Provider, name string, rootcmd *cobra.Com
202199
return nil, errPluginNotFound(name)
203200
}
204201
exename := addExeSuffix(metadata.NamePrefix + name)
205-
pluginDirs, err := getPluginDirs(dockerCli.ConfigFile())
206-
if err != nil {
207-
return nil, err
208-
}
202+
pluginDirs := getPluginDirs(dockerCli.ConfigFile())
209203

210204
for _, d := range pluginDirs {
211205
path := filepath.Join(d, exename)

cli-plugins/manager/manager_test.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package manager
22

33
import (
4+
"path/filepath"
45
"strings"
56
"testing"
67

@@ -81,6 +82,12 @@ func TestListPluginCandidates(t *testing.T) {
8182
assert.DeepEqual(t, candidates, exp)
8283
}
8384

85+
func TestListPluginCandidatesEmpty(t *testing.T) {
86+
tmpDir := t.TempDir()
87+
candidates := listPluginCandidates([]string{tmpDir, filepath.Join(tmpDir, "no-such-dir")})
88+
assert.Assert(t, len(candidates) == 0)
89+
}
90+
8491
// Regression test for https://github.com/docker/cli/issues/5643.
8592
// Check that inaccessible directories that come before accessible ones are ignored
8693
// and do not prevent the latter from being processed.
@@ -166,14 +173,11 @@ func TestErrPluginNotFound(t *testing.T) {
166173
func TestGetPluginDirs(t *testing.T) {
167174
cli := test.NewFakeCli(nil)
168175

169-
pluginDir, err := config.Path("cli-plugins")
170-
assert.NilError(t, err)
176+
pluginDir := filepath.Join(config.Dir(), "cli-plugins")
171177
expected := append([]string{pluginDir}, defaultSystemPluginDirs...)
172178

173-
var pluginDirs []string
174-
pluginDirs, err = getPluginDirs(cli.ConfigFile())
179+
pluginDirs := getPluginDirs(cli.ConfigFile())
175180
assert.Equal(t, strings.Join(expected, ":"), strings.Join(pluginDirs, ":"))
176-
assert.NilError(t, err)
177181

178182
extras := []string{
179183
"foo", "bar", "baz",
@@ -182,7 +186,6 @@ func TestGetPluginDirs(t *testing.T) {
182186
cli.SetConfigFile(&configfile.ConfigFile{
183187
CLIPluginsExtraDirs: extras,
184188
})
185-
pluginDirs, err = getPluginDirs(cli.ConfigFile())
189+
pluginDirs = getPluginDirs(cli.ConfigFile())
186190
assert.DeepEqual(t, expected, pluginDirs)
187-
assert.NilError(t, err)
188191
}

0 commit comments

Comments
 (0)