Skip to content

Commit da71a33

Browse files
committed
feat: Add plugin directory environment variable expansion in cli-plugins/manager/manager.go
test: Add test for plugin directory environment variable expansion Signed-off-by: Paulchen <[email protected]>
1 parent 903e9b3 commit da71a33

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

cli-plugins/manager/manager.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,24 @@ func (e errPluginNotFound) Error() string {
4141
// [ConfigFile.CLIPluginsExtraDirs]: https://pkg.go.dev/github.com/docker/[email protected]+incompatible/cli/config/configfile#ConfigFile.CLIPluginsExtraDirs
4242
func getPluginDirs(cfg *configfile.ConfigFile) []string {
4343
var pluginDirs []string
44-
4544
if cfg != nil {
46-
pluginDirs = append(pluginDirs, cfg.CLIPluginsExtraDirs...)
45+
pluginDirs = append(pluginDirs, expandEnvVars(cfg.CLIPluginsExtraDirs)...)
4746
}
4847
pluginDir := filepath.Join(config.Dir(), "cli-plugins")
4948
pluginDirs = append(pluginDirs, pluginDir)
5049
pluginDirs = append(pluginDirs, defaultSystemPluginDirs...)
5150
return pluginDirs
5251
}
5352

53+
// Resolve statements like $HOME in plugin directory paths
54+
func expandEnvVars(pluginDirs []string) []string {
55+
var replacedPluginDirs []string
56+
for _, dir := range pluginDirs {
57+
replacedPluginDirs = append(replacedPluginDirs, os.ExpandEnv(dir))
58+
}
59+
return replacedPluginDirs
60+
}
61+
5462
func addPluginCandidatesFromDir(res map[string][]string, d string) {
5563
dentries, err := os.ReadDir(d)
5664
// Silently ignore any directories which we cannot list (e.g. due to

cli-plugins/manager/manager_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,30 @@ func TestListPluginCandidatesEmpty(t *testing.T) {
8686
assert.Assert(t, len(candidates) == 0)
8787
}
8888

89+
func TestPluginDirEnvironmentVariableExpansion(t *testing.T) {
90+
pluginDir := "plugins1"
91+
t.Setenv("MY_PLUGIN_DIR", pluginDir)
92+
dir := fs.NewDir(t, t.Name(),
93+
fs.WithDir("${MY_PLUGIN_DIR}",
94+
fs.WithFile("docker-plugin1", ""),
95+
),
96+
)
97+
defer dir.Remove()
98+
99+
t.Setenv("DOCKER_CLI_E2E_PLUGINS_EXTRA_DIRS", dir.Join(pluginDir))
100+
101+
cli := test.NewFakeCli(nil)
102+
cli.SetConfigFile(&configfile.ConfigFile{CLIPluginsExtraDirs: []string{"$DOCKER_CLI_E2E_PLUGINS_EXTRA_DIRS"}})
103+
104+
pluginDirs := getPluginDirs(cli.ConfigFile())
105+
expected := []string{
106+
dir.Join(pluginDir),
107+
filepath.Join(config.Dir(), "cli-plugins"),
108+
}
109+
expected = append(expected, defaultSystemPluginDirs...)
110+
assert.DeepEqual(t, expected, pluginDirs)
111+
}
112+
89113
// Regression test for https://github.com/docker/cli/issues/5643.
90114
// Check that inaccessible directories that come before accessible ones are ignored
91115
// and do not prevent the latter from being processed.

0 commit comments

Comments
 (0)