summaryrefslogtreecommitdiffstats
path: root/helpers
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-01 15:03:28 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-01 15:49:07 +0100
commit3669015f5667f49e6161768c9fd2631c553d5045 (patch)
tree97fe6589112cc8716b7511e1af9905aed18e7c0d /helpers
parenta0e3ff16456c9bfaf57086197ebb3d3654dd98f8 (diff)
Handle Hugo version strings with patch level
Fixes #3025
Diffstat (limited to 'helpers')
-rw-r--r--helpers/hugo.go64
-rw-r--r--helpers/hugo_test.go19
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"))
+}