diff --git a/internal/shims/shims.go b/internal/shims/shims.go index 27472395c..a7b083fcd 100644 --- a/internal/shims/shims.go +++ b/internal/shims/shims.go @@ -373,7 +373,7 @@ func ToolExecutables(conf config.Config, plugin plugins.Plugin, version toolvers // ExecutablePaths returns a slice of absolute directory paths that tool // executables are contained in. func ExecutablePaths(conf config.Config, plugin plugins.Plugin, version toolversions.Version) (paths []string, err error) { - dirs, err := ExecutableDirs(plugin) + dirs, err := ExecutableDirs(conf, plugin, version) if err != nil { return []string{}, err } @@ -389,11 +389,17 @@ func ExecutablePaths(conf config.Config, plugin plugins.Plugin, version toolvers // ExecutableDirs returns a slice of relative directory names that tool executables are // contained in, *inside installs* -func ExecutableDirs(plugin plugins.Plugin) ([]string, error) { +func ExecutableDirs(conf config.Config, plugin plugins.Plugin, version toolversions.Version) ([]string, error) { var stdOut strings.Builder var stdErr strings.Builder - err := plugin.RunCallback("list-bin-paths", []string{}, map[string]string{}, &stdOut, &stdErr) + env := map[string]string{ + "ASDF_INSTALL_TYPE": version.Type, + "ASDF_INSTALL_VERSION": version.Value, + "ASDF_INSTALL_PATH": installs.InstallPath(conf, plugin, version), + } + + err := plugin.RunCallback("list-bin-paths", []string{}, env, &stdOut, &stdErr) if err != nil { if _, ok := err.(plugins.NoCallbackError); ok { // assume all executables are located in /bin directory diff --git a/internal/shims/shims_test.go b/internal/shims/shims_test.go index ae8c0f37a..d4caa45e6 100644 --- a/internal/shims/shims_test.go +++ b/internal/shims/shims_test.go @@ -490,9 +490,10 @@ func TestExecutablePaths(t *testing.T) { func TestExecutableDirs(t *testing.T) { conf, plugin := generateConfig(t) installVersion(t, conf, plugin, "1.2.3") + versionStruct := toolversions.Version{Type: "version", Value: "1.2.3"} t.Run("returns list only containing 'bin' when list-bin-paths callback missing", func(t *testing.T) { - executables, err := ExecutableDirs(plugin) + executables, err := ExecutableDirs(conf, plugin, versionStruct) assert.Nil(t, err) assert.Equal(t, executables, []string{"bin"}) }) @@ -502,10 +503,21 @@ func TestExecutableDirs(t *testing.T) { err := os.WriteFile(filepath.Join(plugin.Dir, "bin", "list-bin-paths"), data, 0o777) assert.Nil(t, err) - executables, err := ExecutableDirs(plugin) + executables, err := ExecutableDirs(conf, plugin, versionStruct) assert.Nil(t, err) assert.Equal(t, executables, []string{"foo", "bar"}) }) + + t.Run("returns environment variables that begin with ASDF_INSTALL", func(t *testing.T) { + data := []byte("echo ${ASDF_INSTALL_TYPE} ${ASDF_INSTALL_VERSION} ${ASDF_INSTALL_PATH}") + err := os.WriteFile(filepath.Join(plugin.Dir, "bin", "list-bin-paths"), data, 0o777) + assert.Nil(t, err) + + executables, err := ExecutableDirs(conf, plugin, versionStruct) + assert.Nil(t, err) + assert.Equal(t, []string{"version", "1.2.3"}, executables[0:2]) + assert.Contains(t, executables[2], "lua/1.2.3") + }) } // Helper functions