feat: check that Go version use to build is greater or equals to the Go version of the project (#4938)
This commit is contained in:
parent
2f53f2cf7a
commit
f0c1904363
@ -1,8 +1,11 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"go/version"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
hcversion "github.com/hashicorp/go-version"
|
hcversion "github.com/hashicorp/go-version"
|
||||||
@ -108,3 +111,37 @@ func trimGoVersion(v string) string {
|
|||||||
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getRuntimeGoVersion() string {
|
||||||
|
goVersion := runtime.Version()
|
||||||
|
|
||||||
|
parts := strings.Fields(goVersion)
|
||||||
|
|
||||||
|
if len(parts) == 0 {
|
||||||
|
return goVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
// When using GOEXPERIMENT, the version returned might look something like "go1.23.0 X:boringcrypto".
|
||||||
|
return parts[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkGoVersion(goVersion string) error {
|
||||||
|
langVersion := version.Lang(getRuntimeGoVersion())
|
||||||
|
|
||||||
|
runtimeVersion, err := hcversion.NewVersion(strings.TrimPrefix(langVersion, "go"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
targetedVersion, err := hcversion.NewVersion(trimGoVersion(goVersion))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if runtimeVersion.LessThan(targetedVersion) {
|
||||||
|
return fmt.Errorf("the Go language version (%s) used to build golangci-lint is lower than the targeted Go version (%s)",
|
||||||
|
langVersion, goVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestIsGoGreaterThanOrEqual(t *testing.T) {
|
func TestIsGoGreaterThanOrEqual(t *testing.T) {
|
||||||
@ -131,3 +132,56 @@ func Test_trimGoVersion(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_checkGoVersion(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
version string
|
||||||
|
require require.ErrorAssertionFunc
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "version greater than runtime version (patch)",
|
||||||
|
version: "1.30.1",
|
||||||
|
require: require.Error,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "version greater than runtime version (family)",
|
||||||
|
version: "1.30",
|
||||||
|
require: require.Error,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "version greater than runtime version (RC)",
|
||||||
|
version: "1.30.0-rc1",
|
||||||
|
require: require.Error,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "version equals to runtime version",
|
||||||
|
version: getRuntimeGoVersion(),
|
||||||
|
require: require.NoError,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "version lower than runtime version (patch)",
|
||||||
|
version: "1.19.1",
|
||||||
|
require: require.NoError,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "version lower than runtime version (family)",
|
||||||
|
version: "1.19",
|
||||||
|
require: require.NoError,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "version lower than runtime version (RC)",
|
||||||
|
version: "1.19.0-rc1",
|
||||||
|
require: require.NoError,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
err := checkGoVersion(test.version)
|
||||||
|
test.require(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -74,6 +74,11 @@ func (l *Loader) Load(opts LoadOptions) error {
|
|||||||
|
|
||||||
l.handleGoVersion()
|
l.handleGoVersion()
|
||||||
|
|
||||||
|
err = checkGoVersion(l.cfg.Run.Go)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
err = l.handleEnableOnlyOption()
|
err = l.handleEnableOnlyOption()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
Loading…
x
Reference in New Issue
Block a user