Skip to content

Commit

Permalink
fix: downgrade issue
Browse files Browse the repository at this point in the history
Signed-off-by: Akash Kumar <[email protected]>
  • Loading branch information
AkashKumar7902 committed May 12, 2024
1 parent cfd80ed commit 6cfd463
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 31 deletions.
13 changes: 10 additions & 3 deletions pkg/mvs/mvs.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/hashicorp/go-version"
"golang.org/x/mod/module"
"kcl-lang.io/kpm/pkg/client"
"kcl-lang.io/kpm/pkg/errors"
errInt "kcl-lang.io/kpm/pkg/errors"
"kcl-lang.io/kpm/pkg/git"
"kcl-lang.io/kpm/pkg/oci"
pkg "kcl-lang.io/kpm/pkg/package"
Expand Down Expand Up @@ -98,11 +98,18 @@ func (r ReqsGraph) Previous(m module.Version) (module.Version, error) {
return m, nil
}

// copy the version to compare it later
v := m.Version

m.Version, err = semver.LeastOldCompatibleVersion(releases, m.Version)
if err != nil {
if err != nil && err != errInt.InvalidVersionFormat {
return module.Version{}, err
}

if v == m.Version {
return module.Version{Path: m.Path, Version: "none"}, nil
}

_, err = r.Vertex(m)
if err == graph.ErrVertexNotFound {
d := pkg.Dependency{
Expand Down Expand Up @@ -147,7 +154,7 @@ func getReleasesFromSource(properties graph.VertexProperties) ([]string, error)

// there must be only one property depending on the download source type
if len(properties.Attributes) != 1 {
return nil, errors.MultipleSources
return nil, errInt.MultipleSources
}

for k, v := range properties.Attributes {
Expand Down
11 changes: 5 additions & 6 deletions pkg/mvs/mvs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,12 +222,11 @@ func TestDowngrade(t *testing.T) {
assert.Equal(t, err, nil)

expectedReqs := []module.Version{
{Path: "test_with_external_deps", Version: "0.0.1"},
{Path: "argo-cd-order", Version: "0.2.0"},
{Path: "helloworld", Version: "0.1.1"},
{Path: "json_merge_patch", Version: "0.1.0"},
{Path: "k8s", Version: "1.27"},
{Path: "podinfo", Version: "0.1.1"},
{Path:"test_with_external_deps", Version:"0.0.1"},
{Path:"argo-cd-order", Version:"0.1.2"},
{Path:"helloworld", Version:"0.1.0"},
{Path:"json_merge_patch", Version:"0.1.0"},
{Path:"k8s", Version:"1.17"},
}
assert.Equal(t, downgrade, expectedReqs)
}
24 changes: 7 additions & 17 deletions pkg/semver/semver.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,33 +27,23 @@ func LatestVersion(versions []string) (string, error) {
return latest.Original(), nil
}

// LeastOldVersion returns the version that is most recent and less than the base version.
func LeastOldVersion(versions []string, baseVersion string) (string, error) {
base, err := version.NewVersion(baseVersion)
if err != nil {
return "", fmt.Errorf("invalid base version: %v", err)
}

var leastOld *version.Version
func OldestVersion(versions []string) (string, error) {
var oldest *version.Version
for _, v := range versions {
ver, err := version.NewVersion(v)
if err != nil {
return "", reporter.NewErrorEvent(reporter.FailedParseVersion, err, fmt.Sprintf("failed to parse version %s", v))
}

// Only consider versions less than the base version
if ver.LessThan(base) {
if leastOld == nil || ver.GreaterThan(leastOld) {
leastOld = ver
}
if oldest == nil || ver.LessThan(oldest) {
oldest = ver
}
}

if leastOld == nil {
if oldest == nil {
return "", errors.InvalidVersionFormat
}

return leastOld.Original(), nil
return oldest.Original(), nil
}

func filterCompatibleVersions(versions []string, baseVersion string) ([]string, error) {
Expand Down Expand Up @@ -87,5 +77,5 @@ func LeastOldCompatibleVersion(versions []string, baseVersion string) (string, e
if err != nil {
return "", err
}
return LeastOldVersion(compatibleVersions, baseVersion)
return OldestVersion(compatibleVersions)
}
10 changes: 5 additions & 5 deletions pkg/semver/semver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ func TestTheLatestTagWithMissingVersion(t *testing.T) {
assert.Equal(t, latest, "5.5")
}

func TestLeastOldVersion(t *testing.T) {
leastOld, err := LeastOldVersion([]string{"1.2.3", "1.4.0", "2.0.0", "1.3.5", "1.0.0"}, "1.2.0")
func TestOldestVersion(t *testing.T) {
oldest, err := OldestVersion([]string{"1.2.3", "1.4.0", "2.0.0", "1.3.5", "1.0.0"})
assert.Equal(t, err, nil)
assert.Equal(t, leastOld, "1.0.0")
assert.Equal(t, oldest, "1.0.0")

leastOld, err = LeastOldVersion([]string{"2.2.0", "2.4.0", "3.0.0", "2.3.5"}, "2.5.0")
oldest, err = OldestVersion([]string{"2.2.0", "2.4.0", "3.0.0", "2.3.5"})
assert.Equal(t, err, nil)
assert.Equal(t, leastOld, "2.4.0")
assert.Equal(t, oldest, "2.2.0")
}

func TestFilterCompatibleVersions(t *testing.T) {
Expand Down

0 comments on commit 6cfd463

Please sign in to comment.