diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bd54331 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +fmtcoverage.html diff --git a/tagcmp.go b/tagcmp.go index 090e115..2498a56 100644 --- a/tagcmp.go +++ b/tagcmp.go @@ -187,6 +187,30 @@ func (t Tag) IsCompatible(tag Tag) bool { return true } +// IsUpgradeCompatible chekcs if upTag is compatible with a pinned version tag. +// I.e. pinning to 22-fpm should return true if upTag is 22.2.0-fpm but not 22.2.0-alpine or 23.0.0-fpm +func (pin Tag) IsUpgradeCompatible(upTag Tag) bool { + if pin.Suffix != upTag.Suffix { + return false + } + if pin.Major != upTag.Major { + return false + } + if pin.MissingMinor { + return true + } + if pin.Minor != upTag.Minor { + return false + } + if pin.MissingPatch { + return true + } + if pin.Patch != upTag.Patch { + return false + } + return true +} + // UpgradeDelta returns a TagDelta object which is the difference between an old and new tag // It can contain negative numbers if comparing with an older tag. func (curTag Tag) UpgradeDelta(newTag Tag) (TagDelta, error) { diff --git a/tagcmp_test.go b/tagcmp_test.go index 87612bf..279df98 100644 --- a/tagcmp_test.go +++ b/tagcmp_test.go @@ -886,6 +886,52 @@ func TestDeltaString(t *testing.T) { } } +func TestIsUpgradeCompatible(t *testing.T) { + testsTrue := [][]string{ + {"22-fpm", "22-fpm"}, + {"22-fpm", "22.0-fpm"}, + {"22-fpm", "22.0.0-fpm"}, + {"22-fpm", "22.2.0-fpm"}, + {"22-fpm", "22.0.0-fpm"}, + {"22.2-fpm", "22.2-fpm"}, + {"22.2-fpm", "22.2.0-fpm"}, + {"22.2.2-fpm", "22.2.2-fpm"}, + } + testsFalse := [][]string{ + {"22-fpm", "22-alpine"}, + {"22-fpm", "23-fpm"}, + {"22-fpm", "21-fpm"}, + {"22.2-fpm", "22.0.2-fpm"}, + {"22.2.0-fpm", "22.2.2-fpm"}, + } + for _, test := range testsTrue { + pin, err := tagcmp.Parse(test[0]) + if err != nil { + t.Error(err) + } + upTag, err := tagcmp.Parse(test[1]) + if err != nil { + t.Error(err) + } + if !pin.IsUpgradeCompatible(upTag) { + t.Errorf("pin %s should be upgradable to %s but returned false", test[0], test[1]) + } + } + for _, test := range testsFalse { + pin, err := tagcmp.Parse(test[0]) + if err != nil { + t.Error(err) + } + upTag, err := tagcmp.Parse(test[1]) + if err != nil { + t.Error(err) + } + if pin.IsUpgradeCompatible(upTag) { + t.Errorf("pin %s should not be upgradable to %s but returned true", test[0], test[1]) + } + } +} + func TestUpgradeDelta(t *testing.T) { pairs := []struct { t1 string