ref: 3669015f5667f49e6161768c9fd2631c553d5045
parent: a0e3ff16456c9bfaf57086197ebb3d3654dd98f8
author: Bjørn Erik Pedersen <[email protected]>
date: Wed Mar 1 10:03:28 EST 2017
Handle Hugo version strings with patch level Fixes #3025
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -1001,15 +1001,7 @@
config := tomlMeta.(map[string]interface{})
if minVersion, ok := config["min_version"]; ok {
- switch minVersion.(type) {
- case float32:
- return helpers.HugoVersionNumber < minVersion.(float32), fmt.Sprint(minVersion)
- case float64:
- return helpers.HugoVersionNumber < minVersion.(float64), fmt.Sprint(minVersion)
- default:
- return
- }
-
+ return helpers.CompareVersion(minVersion) > 0, fmt.Sprint(minVersion)
}
return
--- a/commands/new.go
+++ b/commands/new.go
@@ -314,7 +314,7 @@
homepage = "http://siteforthistheme.com/"
tags = []
features = []
-min_version = 0.19
+min_version = "0.19"
[author]
name = ""
--- a/helpers/hugo.go
+++ b/helpers/hugo.go
@@ -15,6 +15,9 @@
import (
"fmt"
+ "strings"
+
+ "github.com/spf13/cast"
)
// HugoVersionNumber represents the current build version.
@@ -60,4 +63,65 @@
return fmt.Sprintf("%.2f.%d", version, patchVersion)
}
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
}
--- a/helpers/hugo_test.go
+++ b/helpers/hugo_test.go
@@ -17,6 +17,7 @@
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestHugoVersion(t *testing.T) {
@@ -25,4 +26,22 @@
assert.Equal(t, "0.20", hugoVersionNoSuffix(0.20, 0))
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"))
}