diff --git a/internal/sdk.go b/internal/sdk.go index f5d6c1e6..373de3b0 100644 --- a/internal/sdk.go +++ b/internal/sdk.go @@ -231,12 +231,25 @@ func (b *Sdk) EnvKeys(version Version) (*env.Envs, error) { } func (b *Sdk) PreUse(version Version, scope UseScope) (Version, error) { + installedSdks := b.getLocalSdkPackages() if !b.Plugin.HasFunction("PreUse") { logger.Debug("plugin does not have PreUse function") + installedVersions := make(util.VersionSort, 0, len(installedSdks)) + for _, sdk := range installedSdks { + installedVersions = append(installedVersions, string(sdk.Main.Version)) + } + sort.Sort(installedVersions) + prefix := string(version) + "." + for _, v := range installedVersions { + if strings.HasPrefix(v, prefix) { + version = Version(v) + break + } + } return version, nil } - newVersion, err := b.Plugin.PreUse(version, b.Current(), scope, b.sdkManager.PathMeta.WorkingDirectory, b.getLocalSdkPackages()) + newVersion, err := b.Plugin.PreUse(version, b.Current(), scope, b.sdkManager.PathMeta.WorkingDirectory, installedSdks) if err != nil { return "", fmt.Errorf("plugin [PreUse] error: err:%w", err) } diff --git a/internal/util/verison.go b/internal/util/verison.go index 455f33af..f16b59bb 100644 --- a/internal/util/verison.go +++ b/internal/util/verison.go @@ -21,6 +21,20 @@ import ( "strings" ) +type VersionSort []string + +func (s VersionSort) Len() int { + return len(s) +} + +func (s VersionSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s VersionSort) Less(i, j int) bool { + return CompareVersion(s[i], s[j]) > 0 +} + func CompareVersion(v1, v2 string) int { parts1 := strings.Split(v1, ".") parts2 := strings.Split(v2, ".")