diff --git a/commands/hugo.go b/commands/hugo.go index 65a3a9556..6bb786904 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -1001,15 +1001,7 @@ func (c *commandeer) isThemeVsHugoVersionMismatch() (mismatch bool, requiredMinV 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 diff --git a/commands/new.go b/commands/new.go index 6a8cd8565..fbecb6854 100644 --- a/commands/new.go +++ b/commands/new.go @@ -314,7 +314,7 @@ description = "" homepage = "http://siteforthistheme.com/" tags = [] features = [] -min_version = 0.19 +min_version = "0.19" [author] name = "" 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")) +}