Skip to content

Commit ca80915

Browse files
committed
version: add golang 1.24 version fixup
go1.24.0 stamps versions with `+incompatible+dirty` which is an invalid SemVer version. Add a fixup to correct this to SemVer compliant buildinfo version of `+incompatible.dirty` with a test case. Related: - golang/go#71971 - anchore#2482
1 parent 89b6a52 commit ca80915

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

grype/version/golang_version.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,21 @@ func newGolangVersion(v string) (*golangVersion, error) {
4848
if v == "(devel)" {
4949
return nil, ErrUnsupportedVersion
5050
}
51+
52+
// Invalid Semver fix ups
53+
5154
// go stdlib is reported by syft as a go package with version like "go1.24.1"
5255
// other versions have "v" as a prefix, which the semver lib handles automatically
53-
semver, err := hashiVer.NewSemver(strings.TrimPrefix(v, "go"))
56+
fixedUp := strings.TrimPrefix(v, "go")
57+
58+
// go1.24 creates non-dot separated build metadata fields, e.g. +incompatible+dirty
59+
// Fix up as per semver spec
60+
before, after, found := strings.Cut(fixedUp, "+")
61+
if found {
62+
fixedUp = before + "+" + strings.ReplaceAll(after, "+", ".")
63+
}
64+
65+
semver, err := hashiVer.NewSemver(fixedUp)
5466
if err != nil {
5567
return nil, err
5668
}

grype/version/golang_version_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ func TestNewGolangVersion(t *testing.T) {
4040
semVer: hashiVer.Must(hashiVer.NewSemver("v24.0.7+incompatible")),
4141
},
4242
},
43+
{
44+
name: "semver with +incompatible+dirty",
45+
input: "v24.0.7+incompatible+dirty",
46+
expected: golangVersion{
47+
raw: "v24.0.7+incompatible+dirty",
48+
semVer: hashiVer.Must(hashiVer.NewSemver("v24.0.7+incompatible.dirty")),
49+
},
50+
},
4351
{
4452
name: "standard library",
4553
input: "go1.21.4",
@@ -71,6 +79,7 @@ func TestNewGolangVersion(t *testing.T) {
7179
require.Error(t, err)
7280
return
7381
}
82+
assert.Nil(t, err)
7483
assert.Equal(t, tc.expected, *v)
7584
})
7685
}

0 commit comments

Comments
 (0)