Skip to content

Commit

Permalink
Use DB query directly instead of using FindHighestMatchingSemanticVer…
Browse files Browse the repository at this point in the history
…sion
  • Loading branch information
anujc25 committed Sep 19, 2023
1 parent 3397621 commit 5745cad
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 128 deletions.
2 changes: 1 addition & 1 deletion pkg/plugininventory/sqlite_inventory.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ func createPluginWhereClause(filter *PluginInventoryFilter) (string, error) {
whereClause = fmt.Sprintf("%s Version=RecommendedVersion AND", whereClause)
} else {
// We want a specific version of the plugin
whereClause = fmt.Sprintf("%s Version='%s' AND", whereClause, filter.Version)
whereClause = fmt.Sprintf("%s Version Like '%s%%' AND", whereClause, filter.Version)
}
}
if !filter.IncludeHidden {
Expand Down
43 changes: 14 additions & 29 deletions pkg/pluginmanager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -714,14 +714,12 @@ func installPlugin(pluginName, version string, target configtypes.Target, contex
if len(discoveries) == 0 {
return errors.New(errorNoDiscoverySourcesFound)
}
// not passing version to the discovery criteria to get all supported/available versions
// of the plugins and then use the `FindHighestMatchingSemanticVersion` to find the
// correct version of the plugins among the list
criteria := &discovery.PluginDiscoveryCriteria{
Name: pluginName,
Target: target,
OS: runtime.GOOS,
Arch: runtime.GOARCH,
Name: pluginName,
Target: target,
Version: version,
OS: runtime.GOOS,
Arch: runtime.GOARCH,
}
errorList := make([]error, 0)
availablePlugins, err := discoverSpecificPlugins(discoveries, discovery.WithPluginDiscoveryCriteria(criteria))
Expand Down Expand Up @@ -762,12 +760,12 @@ func installPlugin(pluginName, version string, target configtypes.Target, contex
}

if len(matchedPlugins) == 1 {
return installOrUpgradePlugin(&matchedPlugins[0], version, false)
return installOrUpgradePlugin(&matchedPlugins[0], matchedPlugins[0].RecommendedVersion, false)
}

for i := range matchedPlugins {
if matchedPlugins[i].Target == target {
return installOrUpgradePlugin(&matchedPlugins[i], version, false)
return installOrUpgradePlugin(&matchedPlugins[i], matchedPlugins[i].RecommendedVersion, false)
}
}
errorList = append(errorList, errors.Errorf(missingTargetStr, pluginName))
Expand Down Expand Up @@ -797,12 +795,12 @@ func legacyPluginInstall(pluginName, version string, target configtypes.Target)
}

if len(matchedPlugins) == 1 {
return installOrUpgradePlugin(&matchedPlugins[0], version, false)
return installOrUpgradePlugin(&matchedPlugins[0], matchedPlugins[0].RecommendedVersion, false)
}

for i := range matchedPlugins {
if matchedPlugins[i].Target == target {
return installOrUpgradePlugin(&matchedPlugins[i], version, false)
return installOrUpgradePlugin(&matchedPlugins[i], matchedPlugins[i].RecommendedVersion, false)
}
}

Expand Down Expand Up @@ -949,9 +947,9 @@ func GetRecommendedVersionOfPlugin(pluginName string, target configtypes.Target)
}

func installOrUpgradePlugin(p *discovery.Discovered, version string, installTestPlugin bool) error {
version, err := findMatchingPluginVersion(p, version)
if err != nil {
return err
// If the version requested was the RecommendedVersion, we should set it explicitly
if version == "" || version == cli.VersionLatest {
version = p.RecommendedVersion
}

if p.Target == configtypes.TargetUnknown {
Expand Down Expand Up @@ -990,19 +988,6 @@ func installOrUpgradePlugin(p *discovery.Discovered, version string, installTest
return updatePluginInfoAndInitializePlugin(p, plugin)
}

func findMatchingPluginVersion(p *discovery.Discovered, version string) (string, error) {
// If the version requested was the RecommendedVersion, we should set it explicitly
if version == "" || version == cli.VersionLatest {
return p.RecommendedVersion, nil
}

matchingVersion := utils.FindHighestMatchingSemanticVersion(p.SupportedVersions, version)
if matchingVersion == "" {
return "", errors.Errorf("unable to find plugin '%v' with version '%v' for target '%s'", p.Name, version, string(p.Target))
}
return matchingVersion, nil
}

func getPluginFromCache(p *discovery.Discovered, version string) *cli.PluginInfo {
pluginArtifact, err := p.Distribution.DescribeArtifact(version, runtime.GOOS, runtime.GOARCH)
if err != nil {
Expand Down Expand Up @@ -1344,13 +1329,13 @@ func InstallPluginsFromLocalSource(pluginName, version string, target configtype
}

if len(matchedPlugins) == 1 {
return installOrUpgradePlugin(&matchedPlugins[0], version, installTestPlugin)
return installOrUpgradePlugin(&matchedPlugins[0], matchedPlugins[0].RecommendedVersion, installTestPlugin)
}

for i := range matchedPlugins {
// Install all plugins otherwise include all matching plugins
if pluginName == cli.AllPlugins || matchedPlugins[i].Target == target {
err = installOrUpgradePlugin(&matchedPlugins[i], version, installTestPlugin)
err = installOrUpgradePlugin(&matchedPlugins[i], matchedPlugins[i].RecommendedVersion, installTestPlugin)
if err != nil {
errList = append(errList, err)
}
Expand Down
69 changes: 0 additions & 69 deletions pkg/utils/semver.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package utils

import (
"sort"
"strings"

"github.com/Masterminds/semver"
)
Expand Down Expand Up @@ -44,71 +43,3 @@ func IsNewVersion(incomingVersionStr, existingVersionStr string) bool {
// Compare versions
return incomingVersion.Compare(existingVersion) > 0 // Return true if new version is available
}

func FindHighestMatchingSemanticVersion(versions []string, matchVersion string) string {
prefixMatchedVersion := []string{}
for i := range versions {
if strings.HasPrefix(versions[i], matchVersion) {
prefixMatchedVersion = append(prefixMatchedVersion, versions[i])
}
}

if len(prefixMatchedVersion) == 0 {
return ""
}

highestVersion := prefixMatchedVersion[0]

for i := 1; i < len(prefixMatchedVersion); i++ {
if CompareVersions(prefixMatchedVersion[i], highestVersion) == 1 {
highestVersion = prefixMatchedVersion[i]
}
}

return highestVersion
}

// CompareVersions compares two semantic version strings and returns an integer
//
// 0 if v1 == v2
// 1 if v1 > v2
// -1 if v1 < v2
func CompareVersions(v1, v2 string) int {
parts1 := strings.Split(v1, ".")
parts2 := strings.Split(v2, ".")

for i := 0; i < len(parts1) && i < len(parts2); i++ {
num1 := parseVersionPart(parts1[i])
num2 := parseVersionPart(parts2[i])

if num1 > num2 {
return 1
} else if num1 < num2 {
return -1
}
}

if len(parts1) > len(parts2) {
return 1
} else if len(parts1) < len(parts2) {
return -1
}

return 0
}

func parseVersionPart(part string) int {
// Remove any leading 'v' character
part = strings.TrimPrefix(part, "v")

// Convert the part to an integer
num := 0
for _, char := range part {
if char < '0' || char > '9' {
break
}
num = num*10 + int(char-'0')
}

return num
}
29 changes: 0 additions & 29 deletions pkg/utils/semver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,32 +118,3 @@ func TestIsNewVersion(t *testing.T) {
})
}
}

func TestFindHighestSemanticVersion(t *testing.T) {
tests := []struct {
versions []string
matchVersion string
expected string
}{
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.10.11"}, "", "v2.10.11"},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.10.11"}, "v2", "v2.10.11"},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.10.11"}, "v2.10", "v2.10.11"},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.10.11"}, "v2.10.11", "v2.10.11"},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.10.11"}, "v2.10.12", ""},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.10.11"}, "v2.11", ""},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.10.11"}, "v3", ""},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.0.1"}, "v1", "v1.1.1"},
{[]string{"v1.0.0", "v1.1.1", "v2.0.0", "v2.0.1"}, "v1.0", "v1.0.0"},
{[]string{"v1.0.0"}, "v1", "v1.0.0"},
{[]string{}, "v1", ""},
}

for _, test := range tests {
t.Run("", func(t *testing.T) {
result := FindHighestMatchingSemanticVersion(test.versions, test.matchVersion)
if result != test.expected {
t.Errorf("Expected %s, but got %s for input %v", test.expected, result, test.versions)
}
})
}
}

0 comments on commit 5745cad

Please sign in to comment.