Skip to content

Commit d8d3862

Browse files
committed
feat: add version validation when using set command
These changes ensure that the specified version is available for the plugin. Fixes asdf-vm#1983
1 parent 21e47b2 commit d8d3862

File tree

3 files changed

+36
-14
lines changed

3 files changed

+36
-14
lines changed

internal/cli/cli.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,22 +1222,13 @@ func listAllCommand(logger *log.Logger, conf config.Config, toolName, filter str
12221222
return err
12231223
}
12241224

1225-
var stdout strings.Builder
1226-
var stderr strings.Builder
1227-
1228-
err = plugin.RunCallback("list-all", []string{}, map[string]string{}, &stdout, &stderr)
1225+
versions, err := plugin.GetAvailableVersions()
12291226
if err != nil {
1230-
fmt.Printf("Plugin %s's list-all callback script failed with output:\n", plugin.Name)
1231-
// Print to stderr
1232-
os.Stderr.WriteString(stderr.String())
1233-
os.Stderr.WriteString(stdout.String())
1234-
1227+
logger.Printf("%v", err)
12351228
cli.OsExiter(1)
12361229
return err
12371230
}
12381231

1239-
versions := strings.Split(stdout.String(), " ")
1240-
12411232
if filter != "" {
12421233
versions = filterByExactMatch(versions, filter)
12431234
}
@@ -1249,7 +1240,7 @@ func listAllCommand(logger *log.Logger, conf config.Config, toolName, filter str
12491240
}
12501241

12511242
for _, version := range versions {
1252-
fmt.Printf("%s\n", version)
1243+
logger.Printf("%s\n", version)
12531244
}
12541245

12551246
return nil

internal/cli/set/set.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io"
88
"os"
99
"path/filepath"
10+
"slices"
1011
"strings"
1112

1213
"github.com/asdf-vm/asdf/internal/config"
@@ -35,11 +36,15 @@ func Main(_ io.Writer, stderr io.Writer, args []string, home bool, parent bool,
3536
}
3637

3738
resolvedVersions := []string{}
38-
39+
plugin := plugins.New(conf, args[0])
40+
pluginAvailableVersions, err := plugin.GetAvailableVersions()
41+
if err != nil {
42+
return printError(stderr, fmt.Sprintf("error getting available plugin versions: %s", err))
43+
}
44+
3945
for _, version := range args[1:] {
4046
parsedVersion := toolversions.ParseFromCliArg(version)
4147
if parsedVersion.Type == "latest" {
42-
plugin := plugins.New(conf, args[0])
4348
resolvedVersion, err := versions.Latest(plugin, parsedVersion.Value)
4449
if err != nil {
4550
return fmt.Errorf("unable to resolve latest version for %s", plugin.Name)
@@ -49,6 +54,12 @@ func Main(_ io.Writer, stderr io.Writer, args []string, home bool, parent bool,
4954
}
5055
resolvedVersions = append(resolvedVersions, version)
5156
}
57+
58+
for _, version := range resolvedVersions {
59+
if !slices.Contains(pluginAvailableVersions, version) {
60+
return printError(stderr, fmt.Sprintf("version %s is not available for plugin %s\n", version, plugin.Name))
61+
}
62+
}
5263

5364
tv := toolversions.ToolVersions{Name: args[0], Versions: resolvedVersions}
5465

internal/plugins/plugins.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,26 @@ func (p Plugin) Update(conf config.Config, ref string, out, errout io.Writer) (s
298298
return newRef, nil
299299
}
300300

301+
// GetAvailableVersions retrieves all available versions of the plugin
302+
func (p Plugin) GetAvailableVersions() ([]string, error) {
303+
var stdout, stderr strings.Builder
304+
305+
err := p.RunCallback("list-all", []string{}, map[string]string{}, &stdout, &stderr)
306+
if err != nil {
307+
msg := fmt.Sprintf(
308+
"Plugin %s's list-all callback script failed with output:\nStderr:\n%v\nStdout:\n%v\n",
309+
p.Name, stderr.String(), stdout.String(),
310+
)
311+
312+
return nil, errors.New(msg)
313+
}
314+
315+
versions := strings.Split(stdout.String(), " ")
316+
return versions, nil
317+
}
318+
319+
320+
301321
// List takes config and flags for what to return and builds a list of plugins
302322
// representing the currently installed plugins on the system.
303323
func List(config config.Config, urls, refs bool) (plugins []Plugin, err error) {

0 commit comments

Comments
 (0)