Skip to content

Commit 5bcb80e

Browse files
committed
Preserve order in which tools are defined
1 parent f1d5fb7 commit 5bcb80e

File tree

2 files changed

+27
-20
lines changed

2 files changed

+27
-20
lines changed

internal/resolve/resolve.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,23 @@ import (
1717

1818
// ToolVersions represents a tool along with versions specified for it
1919
type ToolVersions struct {
20+
Name string
2021
Versions []string
2122
Directory string
2223
Source string
2324
}
2425

2526
// AllVersions takes a set of plugins and a directory and resolves all tools to one or more
2627
// versions. This includes tools without a corresponding plugin.
27-
func AllVersions(conf config.Config, plugins []plugins.Plugin, directory string) (versions map[string]ToolVersions, err error) {
28-
resolvedToolVersions := map[string]ToolVersions{}
28+
func AllVersions(conf config.Config, plugins []plugins.Plugin, directory string) (versions []ToolVersions, err error) {
29+
resolvedToolVersions := map[string]bool{}
30+
var finalVersions []ToolVersions
31+
2932
for _, plugin := range plugins {
3033
version, envVariableName, found := findVersionsInEnv(plugin.Name)
3134
if found {
32-
resolvedToolVersions[plugin.Name] = ToolVersions{Versions: version, Source: envVariableName}
35+
resolvedToolVersions[plugin.Name] = true
36+
finalVersions = append(finalVersions, ToolVersions{Name: plugin.Name, Versions: version, Source: envVariableName})
3337
}
3438
}
3539

@@ -41,7 +45,8 @@ func AllVersions(conf config.Config, plugins []plugins.Plugin, directory string)
4145
return versions, err
4246
}
4347
if found {
44-
resolvedToolVersions[plugin.Name] = version
48+
resolvedToolVersions[plugin.Name] = true
49+
finalVersions = append(finalVersions, version)
4550
}
4651
}
4752
}
@@ -51,21 +56,22 @@ func AllVersions(conf config.Config, plugins []plugins.Plugin, directory string)
5156
if allVersions, err := toolversions.GetAllToolsAndVersions(filepath); err == nil {
5257
for _, v := range allVersions {
5358
if _, isPluginResolved := resolvedToolVersions[v.Name]; !isPluginResolved {
54-
resolvedToolVersions[v.Name] = ToolVersions{Versions: v.Versions, Source: conf.DefaultToolVersionsFilename, Directory: iterDir}
59+
resolvedToolVersions[v.Name] = true
60+
finalVersions = append(finalVersions, ToolVersions{Name: v.Name, Versions: v.Versions, Source: conf.DefaultToolVersionsFilename, Directory: iterDir})
5561
}
5662
}
5763
}
5864
}
5965
}
60-
return resolvedToolVersions, nil
66+
return finalVersions, nil
6167
}
6268

6369
// Version takes a plugin and a directory and resolves the tool to one or more
6470
// versions. Only returns results for the provided plugin.
6571
func Version(conf config.Config, plugin plugins.Plugin, directory string) (versions ToolVersions, found bool, err error) {
6672
version, envVariableName, found := findVersionsInEnv(plugin.Name)
6773
if found {
68-
return ToolVersions{Versions: version, Source: envVariableName}, true, nil
74+
return ToolVersions{Name: plugin.Name, Versions: version, Source: envVariableName}, true, nil
6975
}
7076

7177
for iterDir := range iterDirectories(conf, directory) {
@@ -121,7 +127,7 @@ func findVersionsInDir(conf config.Config, plugin plugins.Plugin, directory stri
121127
if _, err = os.Stat(filepath); err == nil {
122128
versions, found, err := toolversions.FindToolVersions(filepath, plugin.Name)
123129
if found || err != nil {
124-
return ToolVersions{Versions: versions, Source: conf.DefaultToolVersionsFilename, Directory: directory}, found, err
130+
return ToolVersions{Name: plugin.Name, Versions: versions, Source: conf.DefaultToolVersionsFilename, Directory: directory}, found, err
125131
}
126132
}
127133

@@ -174,7 +180,7 @@ func findVersionsInLegacyFile(plugin plugins.Plugin, directory string) (versions
174180
if len(versionsSlice) == 0 || (len(versionsSlice) == 1 && versionsSlice[0] == "") {
175181
return versions, false, nil
176182
}
177-
return ToolVersions{Versions: versionsSlice, Source: filename, Directory: directory}, err == nil, err
183+
return ToolVersions{Name: plugin.Name, Versions: versionsSlice, Source: filename, Directory: directory}, err == nil, err
178184
}
179185
}
180186

internal/versions/versions.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,36 +78,37 @@ func (e VersionAlreadyInstalledError) Error() string {
7878
// installed, but it may be multiple versions if multiple versions for the tool
7979
// are specified in the .tool-versions file.
8080
func InstallAll(conf config.Config, dir string, stdOut io.Writer, stdErr io.Writer) (failures []error) {
81-
plugins, err := plugins.List(conf, false, false)
81+
installedPlugins, err := plugins.List(conf, false, false)
8282
if err != nil {
8383
return []error{fmt.Errorf("unable to list plugins: %w", err)}
8484
}
85+
pluginsMap := map[string]plugins.Plugin{}
86+
for _, plugin := range installedPlugins {
87+
pluginsMap[plugin.Name] = plugin
88+
}
8589

86-
toolVersions, err := resolve.AllVersions(conf, plugins, dir)
90+
toolVersions, err := resolve.AllVersions(conf, installedPlugins, dir)
8791
if err != nil {
8892
return []error{fmt.Errorf("unable to resolve versions: %w", err)}
8993
}
9094

91-
// Ideally we should install these in the order they are specified in the
92-
// closest .tool-versions file, but for now that is too complicated to
93-
// implement.
94-
for _, plugin := range plugins {
95-
if toolVersion, isPluginResolved := toolVersions[plugin.Name]; isPluginResolved {
96-
delete(toolVersions, plugin.Name)
95+
for _, toolVersion := range toolVersions {
96+
if plugin, isPluginResolved := pluginsMap[toolVersion.Name]; isPluginResolved {
97+
delete(pluginsMap, plugin.Name)
9798
for _, version := range toolVersion.Versions {
9899
err := InstallOneVersion(conf, plugin, version, false, stdOut, stdErr)
99100
if err != nil {
100101
failures = append(failures, err)
101102
}
102103
}
103104
} else {
104-
err := NoVersionSetError{toolName: plugin.Name}
105+
err = MissingPluginError{toolName: toolVersion.Name}
105106
failures = append(failures, err)
106107
}
107108
}
108109

109-
for toolName := range toolVersions {
110-
err = MissingPluginError{toolName: toolName}
110+
for _, plugin := range pluginsMap {
111+
err := NoVersionSetError{toolName: plugin.Name}
111112
failures = append(failures, err)
112113
}
113114

0 commit comments

Comments
 (0)