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:
Ludovic Fernandez 2024-08-22 23:28:56 +02:00 committed by GitHub
parent 2f53f2cf7a
commit f0c1904363
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 96 additions and 0 deletions

View File

@ -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
}

View File

@ -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)
})
}
}

View File

@ -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