diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2017-03-01 15:03:28 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2017-03-01 15:49:07 +0100 |
commit | 3669015f5667f49e6161768c9fd2631c553d5045 (patch) | |
tree | 97fe6589112cc8716b7511e1af9905aed18e7c0d /helpers | |
parent | a0e3ff16456c9bfaf57086197ebb3d3654dd98f8 (diff) |
Handle Hugo version strings with patch level
Fixes #3025
Diffstat (limited to 'helpers')
-rw-r--r-- | helpers/hugo.go | 64 | ||||
-rw-r--r-- | helpers/hugo_test.go | 19 |
2 files changed, 83 insertions, 0 deletions
diff --git a/helpers/hugo.go b/helpers/hugo.go index 12d37b54d..1853fc4d7 100644 --- a/helpers/hugo.go +++ b/helpers/hugo.go @@ -15,6 +15,9 @@ package helpers import ( "fmt" + "strings" + + "github.com/spf13/cast" ) // HugoVersionNumber represents the current build version. @@ -61,3 +64,64 @@ func hugoVersionNoSuffix(version float32, patchVersion int) string { } return fmt.Sprintf("%.2f", version) } + +// CompareVersion compares the given version string or number against the +// running Hugo version. +// It returns -1 if the given version is less than, 0 if equal and 1 if greater than +// the running version. +func CompareVersion(version interface{}) int { + return compareVersions(HugoVersionNumber, HugoPatchVersion, version) +} + +func compareVersions(inVersion float32, inPatchVersion int, in interface{}) int { + switch d := in.(type) { + case float64: + return compareFloatVersions(inVersion, inPatchVersion, float32(d)) + case float32: + return compareFloatVersions(inVersion, inPatchVersion, d) + case int: + return compareFloatVersions(inVersion, inPatchVersion, float32(d)) + case int32: + return compareFloatVersions(inVersion, inPatchVersion, float32(d)) + case int64: + return compareFloatVersions(inVersion, inPatchVersion, float32(d)) + default: + s, err := cast.ToStringE(in) + if err != nil { + return -1 + } + + var ( + v float32 + p int + ) + + if strings.Count(s, ".") == 2 { + li := strings.LastIndex(s, ".") + p = cast.ToInt(s[li+1:]) + s = s[:li] + } + + v = float32(cast.ToFloat64(s)) + + if v == inVersion && p == inPatchVersion { + return 0 + } + + if v < inVersion || (v == inVersion && p < inPatchVersion) { + return -1 + } + + return 1 + } +} + +func compareFloatVersions(version float32, patchVersion int, v float32) int { + if v == version { + return 0 + } + if v < version { + return -1 + } + return 1 +} diff --git a/helpers/hugo_test.go b/helpers/hugo_test.go index d901395e2..b71517f71 100644 --- a/helpers/hugo_test.go +++ b/helpers/hugo_test.go @@ -17,6 +17,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestHugoVersion(t *testing.T) { @@ -26,3 +27,21 @@ func TestHugoVersion(t *testing.T) { assert.Equal(t, "0.15.2-DEV", hugoVersion(0.15, 2, "-DEV")) assert.Equal(t, "0.17.3", hugoVersionNoSuffix(0.16+0.01, 3)) } + +func TestCompareVersions(t *testing.T) { + require.Equal(t, 0, compareVersions(0.20, 0, 0.20)) + require.Equal(t, 0, compareVersions(0.20, 0, float32(0.20))) + require.Equal(t, 0, compareVersions(0.20, 0, float64(0.20))) + require.Equal(t, 1, compareVersions(0.19, 1, 0.20)) + require.Equal(t, 1, compareVersions(0.19, 3, "0.20.2")) + require.Equal(t, -1, compareVersions(0.19, 1, 0.01)) + require.Equal(t, 1, compareVersions(0, 1, 3)) + require.Equal(t, 1, compareVersions(0, 1, int32(3))) + require.Equal(t, 1, compareVersions(0, 1, int64(3))) + require.Equal(t, 0, compareVersions(0.20, 0, "0.20")) + require.Equal(t, 0, compareVersions(0.20, 1, "0.20.1")) + require.Equal(t, -1, compareVersions(0.20, 1, "0.20")) + require.Equal(t, 1, compareVersions(0.20, 0, "0.20.1")) + require.Equal(t, 1, compareVersions(0.20, 1, "0.20.2")) + require.Equal(t, 1, compareVersions(0.21, 1, "0.22.1")) +} |