| 
									
										
										
										
											2015-12-07 19:57:01 +01:00
										 |  |  | // Copyright 2015 The Hugo Authors. All rights reserved.
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2015-11-23 22:16:36 -05:00
										 |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							| 
									
										
										
										
											2015-11-23 22:16:36 -05:00
										 |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package helpers
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"fmt"
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	"strings"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 09:15:12 +01:00
										 |  |  | 	"github.com/gohugoio/hugo/compare"
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	"github.com/spf13/cast"
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | // HugoVersion represents the Hugo build version.
 | 
					
						
							|  |  |  | type HugoVersion struct {
 | 
					
						
							| 
									
										
										
										
											2016-12-26 14:03:50 +01:00
										 |  |  | 	// Major and minor version.
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | 	Number float32
 | 
					
						
							| 
									
										
										
										
											2016-12-26 14:03:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Increment this for bug releases
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | 	PatchLevel int
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// HugoVersionSuffix is the suffix used in the Hugo version string.
 | 
					
						
							|  |  |  | 	// It will be blank for release versions.
 | 
					
						
							|  |  |  | 	Suffix string
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 09:15:12 +01:00
										 |  |  | var (
 | 
					
						
							|  |  |  | 	_ compare.Eqer     = (*HugoVersionString)(nil)
 | 
					
						
							|  |  |  | 	_ compare.Comparer = (*HugoVersionString)(nil)
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type HugoVersionString string
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | func (v HugoVersion) String() string {
 | 
					
						
							|  |  |  | 	return hugoVersion(v.Number, v.PatchLevel, v.Suffix)
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 09:15:12 +01:00
										 |  |  | func (v HugoVersion) Version() HugoVersionString {
 | 
					
						
							|  |  |  | 	return HugoVersionString(v.String())
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (h HugoVersionString) String() string {
 | 
					
						
							|  |  |  | 	return string(h)
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Implements compare.Comparer
 | 
					
						
							|  |  |  | func (h HugoVersionString) Compare(other interface{}) int {
 | 
					
						
							|  |  |  | 	v := MustParseHugoVersion(h.String())
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 	return compareVersionsWithSuffix(v.Number, v.PatchLevel, v.Suffix, other)
 | 
					
						
							| 
									
										
										
										
											2018-02-22 09:15:12 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Implements compare.Eqer
 | 
					
						
							|  |  |  | func (h HugoVersionString) Eq(other interface{}) bool {
 | 
					
						
							|  |  |  | 	s, err := cast.ToStringE(other)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return false
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return s == h.String()
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | var versionSuffixes = []string{"-test", "-DEV"}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-02 14:25:05 +02:00
										 |  |  | // ParseHugoVersion parses a version string.
 | 
					
						
							| 
									
										
										
										
											2017-07-05 10:23:07 +02:00
										 |  |  | func ParseHugoVersion(s string) (HugoVersion, error) {
 | 
					
						
							|  |  |  | 	var vv HugoVersion
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 	for _, suffix := range versionSuffixes {
 | 
					
						
							|  |  |  | 		if strings.HasSuffix(s, suffix) {
 | 
					
						
							|  |  |  | 			vv.Suffix = suffix
 | 
					
						
							|  |  |  | 			s = strings.TrimSuffix(s, suffix)
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2017-07-05 10:23:07 +02:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	v, p := parseVersion(s)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vv.Number = v
 | 
					
						
							|  |  |  | 	vv.PatchLevel = p
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return vv, nil
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-02 14:25:05 +02:00
										 |  |  | // MustParseHugoVersion parses a version string
 | 
					
						
							|  |  |  | // and panics if any error occurs.
 | 
					
						
							| 
									
										
										
										
											2017-07-05 10:23:07 +02:00
										 |  |  | func MustParseHugoVersion(s string) HugoVersion {
 | 
					
						
							|  |  |  | 	vv, err := ParseHugoVersion(s)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		panic(err)
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return vv
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | // ReleaseVersion represents the release version.
 | 
					
						
							|  |  |  | func (v HugoVersion) ReleaseVersion() HugoVersion {
 | 
					
						
							|  |  |  | 	v.Suffix = ""
 | 
					
						
							|  |  |  | 	return v
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2016-03-24 14:27:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | // Next returns the next Hugo release version.
 | 
					
						
							|  |  |  | func (v HugoVersion) Next() HugoVersion {
 | 
					
						
							|  |  |  | 	return HugoVersion{Number: v.Number + 0.01}
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-02 14:25:05 +02:00
										 |  |  | // Prev returns the previous Hugo release version.
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | func (v HugoVersion) Prev() HugoVersion {
 | 
					
						
							|  |  |  | 	return HugoVersion{Number: v.Number - 0.01}
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | // NextPatchLevel returns the next patch/bugfix Hugo version.
 | 
					
						
							|  |  |  | // This will be a patch increment on the previous Hugo version.
 | 
					
						
							|  |  |  | func (v HugoVersion) NextPatchLevel(level int) HugoVersion {
 | 
					
						
							|  |  |  | 	return HugoVersion{Number: v.Number - 0.01, PatchLevel: level}
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 16:59:05 +02:00
										 |  |  | // CurrentHugoVersion represents the current build version.
 | 
					
						
							|  |  |  | // This should be the only one.
 | 
					
						
							|  |  |  | var CurrentHugoVersion = HugoVersion{
 | 
					
						
							| 
									
										
										
										
											2018-04-30 06:50:00 +00:00
										 |  |  | 	Number:     0.41,
 | 
					
						
							|  |  |  | 	PatchLevel: 0,
 | 
					
						
							|  |  |  | 	Suffix:     "-DEV",
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-26 14:03:50 +01:00
										 |  |  | func hugoVersion(version float32, patchVersion int, suffix string) string {
 | 
					
						
							|  |  |  | 	if patchVersion > 0 {
 | 
					
						
							| 
									
										
										
										
											2017-03-01 14:34:40 +01:00
										 |  |  | 		return fmt.Sprintf("%.2f.%d%s", version, patchVersion, suffix)
 | 
					
						
							| 
									
										
										
										
											2016-12-26 14:03:50 +01:00
										 |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2017-03-01 14:34:40 +01:00
										 |  |  | 	return fmt.Sprintf("%.2f%s", version, suffix)
 | 
					
						
							| 
									
										
										
										
											2015-03-18 12:23:13 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | // 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 {
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 	return compareVersionsWithSuffix(CurrentHugoVersion.Number, CurrentHugoVersion.PatchLevel, CurrentHugoVersion.Suffix, version)
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func compareVersions(inVersion float32, inPatchVersion int, in interface{}) int {
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 	return compareVersionsWithSuffix(inVersion, inPatchVersion, "", in)
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func compareVersionsWithSuffix(inVersion float32, inPatchVersion int, suffix string, in interface{}) int {
 | 
					
						
							|  |  |  | 	var c int
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	switch d := in.(type) {
 | 
					
						
							|  |  |  | 	case float64:
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		c = compareFloatVersions(inVersion, float32(d))
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	case float32:
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		c = compareFloatVersions(inVersion, d)
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	case int:
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		c = compareFloatVersions(inVersion, float32(d))
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	case int32:
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		c = compareFloatVersions(inVersion, float32(d))
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	case int64:
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		c = compareFloatVersions(inVersion, float32(d))
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	default:
 | 
					
						
							|  |  |  | 		s, err := cast.ToStringE(in)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return -1
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		v, err := ParseHugoVersion(s)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return -1
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		if v.Number == inVersion && v.PatchLevel == inPatchVersion {
 | 
					
						
							|  |  |  | 			return strings.Compare(suffix, v.Suffix)
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 		if v.Number < inVersion || (v.Number == inVersion && v.PatchLevel < inPatchVersion) {
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 			return -1
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return 1
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2018-02-22 17:16:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if c == 0 && suffix != "" {
 | 
					
						
							|  |  |  | 		return 1
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return c
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 10:23:07 +02:00
										 |  |  | func parseVersion(s string) (float32, int) {
 | 
					
						
							|  |  |  | 	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))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return v, p
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-01 23:49:24 +01:00
										 |  |  | func compareFloatVersions(version float32, v float32) int {
 | 
					
						
							| 
									
										
										
										
											2017-03-01 15:03:28 +01:00
										 |  |  | 	if v == version {
 | 
					
						
							|  |  |  | 		return 0
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	if v < version {
 | 
					
						
							|  |  |  | 		return -1
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return 1
 | 
					
						
							|  |  |  | }
 |