Handle Hugo version strings with patch level
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 1 Mar 2017 14:03:28 +0000 (15:03 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 1 Mar 2017 14:49:07 +0000 (15:49 +0100)
Fixes #3025

commands/hugo.go
commands/new.go
helpers/hugo.go
helpers/hugo_test.go

index 65a3a955690bc3fcaeacc626161af2bcee9ab788..6bb786904be1418e18e86181cde6a69cf3d47d64 100644 (file)
@@ -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
index 6a8cd8565a6bed6d2e31453add6ffa3494e2ab69..fbecb6854e5b63e5787bd6da1fd6d7dfdca78497 100644 (file)
@@ -314,7 +314,7 @@ description = ""
 homepage = "http://siteforthistheme.com/"
 tags = []
 features = []
-min_version = 0.19
+min_version = "0.19"
 
 [author]
   name = ""
index 12d37b54dc7f21be07f05114cefe897198df926d..1853fc4d72aadcc7248ab61ded55cc7fe9e432f1 100644 (file)
@@ -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
+}
index d901395e2737eccf221fa1fc1387d1bc1b3ba96a..b71517f71b7028c57973797a8352540598e789e2 100644 (file)
@@ -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"))
+}