From 7415370405b6244f04afd2cbe7aac85bd3242e57 Mon Sep 17 00:00:00 2001 From: Martin Sucha Date: Tue, 7 Feb 2023 15:34:20 +0100 Subject: [PATCH] Relax parsing of go version Development versions of Go have an additional token before the version: go version devel go1.21-02d8ebda83 Mon Feb 6 22:13:07 2023 +0000 linux/amd64 Use the regular expression on the whole output of go version instead of just on the third token. Fixes https://github.com/bwplotka/bingo/issues/131 --- pkg/runner/runner.go | 12 ++++-------- pkg/runner/runner_test.go | 1 + 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/pkg/runner/runner.go b/pkg/runner/runner.go index 6c6b54f..1f6a573 100644 --- a/pkg/runner/runner.go +++ b/pkg/runner/runner.go @@ -32,20 +32,16 @@ type Runner struct { logger *log.Logger } -var versionRegexp = regexp.MustCompile(`go?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?`) +var versionRegexp = regexp.MustCompile(`^go version.* go((?:[0-9]+)(?:\.[0-9]+)?(?:\.[0-9]+)?)`) // parseGoVersion ignores pre-release identifiers immediately following the // patch version since we don't expect goVersionOutput to be SemVer-compliant. func parseGoVersion(goVersionOutput string) (*semver.Version, error) { - el := strings.Fields(strings.TrimRight(goVersionOutput, "\n")) - if len(el) < 2 { + goVersion := versionRegexp.FindStringSubmatch(goVersionOutput) + if goVersion == nil { return nil, errors.Newf("unexpected go version output; expected 'go version go ...; found %v", strings.TrimRight(goVersionOutput, "\n")) } - goVersion := versionRegexp.FindString(el[2]) - if goVersion == "" { - return nil, errors.New("unexpected go version format") - } - return semver.NewVersion(strings.TrimPrefix(goVersion, "go")) + return semver.NewVersion(goVersion[1]) } func isSupportedVersion(v *semver.Version) error { diff --git a/pkg/runner/runner_test.go b/pkg/runner/runner_test.go index 69c94e4..5dbcc17 100644 --- a/pkg/runner/runner_test.go +++ b/pkg/runner/runner_test.go @@ -32,6 +32,7 @@ func TestParseAndIsSupportedVersion(t *testing.T) { {output: "go version go1.16rc1 linux/amd64"}, {output: "go version go2 linux/amd64"}, {output: "go version go2.1 linux/amd64"}, + {output: "go version devel go1.21-02d8ebda83 Mon Feb 6 22:13:07 2023 +0000 linux/amd64"}, } { t.Run(tcase.output, func(t *testing.T) { errs := merrors.New()