diff --git a/src/bpm-package/go.mod b/src/bpm-package/go.mod index c58762b..929a675 100644 --- a/src/bpm-package/go.mod +++ b/src/bpm-package/go.mod @@ -8,6 +8,9 @@ require ( gopkg.in/yaml.v3 v3.0.1 ) -require github.com/drone/envsubst v1.0.3 // indirect +require ( + github.com/drone/envsubst v1.0.3 // indirect + github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f // indirect +) replace bpm-utils-shared => ../bpm-utils-shared diff --git a/src/bpm-package/go.sum b/src/bpm-package/go.sum index 06586f3..abb56e5 100644 --- a/src/bpm-package/go.sum +++ b/src/bpm-package/go.sum @@ -2,6 +2,8 @@ github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f h1:xt29M2T6STgldg+WEP51gGePQCsQvklmP2eIhPIBK3g= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f/go.mod h1:i4sF0l1fFnY1aiw08QQSwVAFxHEm311Me3WsU/X7nL0= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/src/bpm-repo/go.mod b/src/bpm-repo/go.mod index df2f975..d87a5d0 100644 --- a/src/bpm-repo/go.mod +++ b/src/bpm-repo/go.mod @@ -8,6 +8,9 @@ require ( gopkg.in/yaml.v3 v3.0.1 ) -require github.com/drone/envsubst v1.0.3 // indirect +require ( + github.com/drone/envsubst v1.0.3 // indirect + github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f // indirect +) replace bpm-utils-shared => ../bpm-utils-shared diff --git a/src/bpm-repo/go.sum b/src/bpm-repo/go.sum index 06586f3..abb56e5 100644 --- a/src/bpm-repo/go.sum +++ b/src/bpm-repo/go.sum @@ -2,6 +2,8 @@ github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f h1:xt29M2T6STgldg+WEP51gGePQCsQvklmP2eIhPIBK3g= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f/go.mod h1:i4sF0l1fFnY1aiw08QQSwVAFxHEm311Me3WsU/X7nL0= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/src/bpm-repo/main.go b/src/bpm-repo/main.go index b691040..95e3a46 100644 --- a/src/bpm-repo/main.go +++ b/src/bpm-repo/main.go @@ -327,7 +327,11 @@ func checkVersionsFunc(repo string) { keys := slices.Collect(maps.Keys(pkgsWithUpdates)) sort.Strings(keys) for _, pkg := range keys { - fmt.Printf("Update available for package (%s): %s -> %s", pkg, pkgsWithUpdates[pkg].OldVersion, pkgsWithUpdates[pkg].NewVersion) + if bpmutilsshared.CompareVersions(pkgsWithUpdates[pkg].NewVersion, pkgsWithUpdates[pkg].OldVersion) >= 0 { + fmt.Printf("Update available for package (%s): %s -> %s", pkg, pkgsWithUpdates[pkg].OldVersion, pkgsWithUpdates[pkg].NewVersion) + } else { + fmt.Printf("Downgrade(?) available for package (%s): %s -> %s", pkg, pkgsWithUpdates[pkg].OldVersion, pkgsWithUpdates[pkg].NewVersion) + } if cachedVersions[pkg].OnHold { fmt.Print(" (On hold)") } diff --git a/src/bpm-setup/go.mod b/src/bpm-setup/go.mod index beac012..8699e39 100644 --- a/src/bpm-setup/go.mod +++ b/src/bpm-setup/go.mod @@ -8,6 +8,9 @@ require ( gopkg.in/yaml.v3 v3.0.1 ) -require github.com/drone/envsubst v1.0.3 // indirect +require ( + github.com/drone/envsubst v1.0.3 // indirect + github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f // indirect +) replace bpm-utils-shared => ../bpm-utils-shared diff --git a/src/bpm-setup/go.sum b/src/bpm-setup/go.sum index 06586f3..abb56e5 100644 --- a/src/bpm-setup/go.sum +++ b/src/bpm-setup/go.sum @@ -2,6 +2,8 @@ github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f h1:xt29M2T6STgldg+WEP51gGePQCsQvklmP2eIhPIBK3g= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f/go.mod h1:i4sF0l1fFnY1aiw08QQSwVAFxHEm311Me3WsU/X7nL0= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/src/bpm-utils-shared/go.mod b/src/bpm-utils-shared/go.mod index 34566b5..9acc68b 100644 --- a/src/bpm-utils-shared/go.mod +++ b/src/bpm-utils-shared/go.mod @@ -5,3 +5,5 @@ go 1.23 require gopkg.in/yaml.v3 v3.0.1 require github.com/drone/envsubst v1.0.3 + +require github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f // indirect diff --git a/src/bpm-utils-shared/go.sum b/src/bpm-utils-shared/go.sum index 2c93c5b..b639e84 100644 --- a/src/bpm-utils-shared/go.sum +++ b/src/bpm-utils-shared/go.sum @@ -2,6 +2,8 @@ github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f h1:xt29M2T6STgldg+WEP51gGePQCsQvklmP2eIhPIBK3g= +github.com/knqyf263/go-rpm-version v0.0.0-20240918084003-2afd7dc6a38f/go.mod h1:i4sF0l1fFnY1aiw08QQSwVAFxHEm311Me3WsU/X7nL0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/src/bpm-utils-shared/package.go b/src/bpm-utils-shared/package.go index 2601185..b55bf52 100644 --- a/src/bpm-utils-shared/package.go +++ b/src/bpm-utils-shared/package.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/drone/envsubst" + version "github.com/knqyf263/go-rpm-version" "gopkg.in/yaml.v3" ) @@ -179,3 +180,69 @@ func (pkgDownload *PackageDownload) CalculateChecksum(pkgInfo *PackageInfo) (str return "", fmt.Errorf("unknown download type (%s)", pkgDownload.Type) } } + +func CompareVersions(version1, version2 string) int { + v1 := version.NewVersion(version1) + v2 := version.NewVersion(version2) + + return v1.Compare(v2) +} + +func SplitPkgNameAndVersion(pkg string) (string, string, string) { + if strings.Contains(pkg, ">=") { + pkgSplit := strings.SplitN(pkg, ">=", 2) + pkgName := pkgSplit[0] + pkgVersion := pkgSplit[1] + + return pkgName, ">=", pkgVersion + } else if strings.Contains(pkg, ">") { + pkgSplit := strings.SplitN(pkg, ">", 2) + pkgName := pkgSplit[0] + pkgVersion := pkgSplit[1] + + return pkgName, ">", pkgVersion + } else if strings.Contains(pkg, "<=") { + pkgSplit := strings.SplitN(pkg, "<=", 2) + pkgName := pkgSplit[0] + pkgVersion := pkgSplit[1] + + return pkgName, "<=", pkgVersion + } else if strings.Contains(pkg, "<") { + pkgSplit := strings.SplitN(pkg, "<", 2) + pkgName := pkgSplit[0] + pkgVersion := pkgSplit[1] + + return pkgName, "<", pkgVersion + } else if strings.Contains(pkg, "=") { + pkgSplit := strings.SplitN(pkg, "=", 2) + pkgName := pkgSplit[0] + pkgVersion := pkgSplit[1] + + return pkgName, "=", pkgVersion + } + + return pkg, "", "" +} + +func EvaluateDependency(pkg, matchVersion string) bool { + _, comparisonSymbol, pkgVersion := SplitPkgNameAndVersion(pkg) + + switch comparisonSymbol { + case ">=": + return CompareVersions(matchVersion, pkgVersion) >= 0 + case ">": + return CompareVersions(matchVersion, pkgVersion) > 0 + case "<=": + return CompareVersions(matchVersion, pkgVersion) <= 0 + case "<": + return CompareVersions(matchVersion, pkgVersion) < 0 + case "=": + if cutPkgVersion, ok := strings.CutSuffix(pkgVersion, "*"); ok { + return strings.HasPrefix(matchVersion, cutPkgVersion) + } else { + return CompareVersions(matchVersion, pkgVersion) == 0 + } + default: + return true + } +}