Skip to content

Commit

Permalink
feat: check that Go version use to build is greater or equals to the …
Browse files Browse the repository at this point in the history
…Go version of the project (#4938)
  • Loading branch information
ldez committed Aug 22, 2024
1 parent 2f53f2c commit f0c1904
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 0 deletions.
37 changes: 37 additions & 0 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package config

import (
"fmt"
"go/version"
"os"
"regexp"
"runtime"
"strings"

hcversion "github.com/hashicorp/go-version"
Expand Down Expand Up @@ -108,3 +111,37 @@ func trimGoVersion(v string) string {

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
}
54 changes: 54 additions & 0 deletions pkg/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestIsGoGreaterThanOrEqual(t *testing.T) {
Expand Down Expand Up @@ -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)
})
}
}
5 changes: 5 additions & 0 deletions pkg/config/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@ func (l *Loader) Load(opts LoadOptions) error {

l.handleGoVersion()

err = checkGoVersion(l.cfg.Run.Go)
if err != nil {
return err
}

err = l.handleEnableOnlyOption()
if err != nil {
return err
Expand Down

0 comments on commit f0c1904

Please sign in to comment.