From 47b06d5bd1874a34bf372957ead17265ebb08ef1 Mon Sep 17 00:00:00 2001 From: Lucas Bajolet Date: Thu, 21 Mar 2024 17:28:28 -0400 Subject: [PATCH] version: limit core version to 3 segments The go-version library we use for parsing versions from the plugin supports 4-segmented versions. This may not be ideal for us, as we want to limit the sprawling nature of plugin installations, which if we start accepting sub-patch version bumps, may become quite strange. The release workflows we offer as template does not take that into account, and I'm not sure our docs do as well. Since there are many unknowns here, 4-segmented version numbers are not semver-valid, and we do not know how tooling will react, we ultimately decide not to allow those in the SDK. If a developer tries to define a 4-segmented version number, the plugin will crash instantly, at least giving users a message quickly that the version number is invalid, and that they need to limit themselves to a 3-segment version number. --- version/version.go | 16 ++++++---------- version/version_test.go | 8 ++++++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/version/version.go b/version/version.go index ccb3ce207..f8f794af7 100644 --- a/version/version.go +++ b/version/version.go @@ -47,6 +47,11 @@ func InitializePluginVersion(vers, versionPrerelease string) *PluginVersion { func NewRawVersion(rawSemVer string) *PluginVersion { vers := version.Must(version.NewVersion(rawSemVer)) + + if len(vers.Segments()) != 3 { + panic(fmt.Sprintf("versions should only have 3 segments, %q had %d", rawSemVer, len(vers.Segments()))) + } + return &PluginVersion{ version: vers.Core().String(), versionPrerelease: vers.Prerelease(), @@ -71,16 +76,7 @@ func NewPluginVersion(vers, versionPrerelease, versionMetadata string) *PluginVe versionRawString = fmt.Sprintf("%s+%s", versionRawString, versionMetadata) } - // This call initializes the SemVer to make sure that if Packer crashes due - // to an invalid SemVer it's at the very beginning of the Packer run. - semVer := version.Must(version.NewVersion(versionRawString)) - - return &PluginVersion{ - version: semVer.Core().String(), - versionPrerelease: semVer.Prerelease(), - versionMetadata: semVer.Metadata(), - semVer: semVer, - } + return NewRawVersion(versionRawString) } type PluginVersion struct { diff --git a/version/version_test.go b/version/version_test.go index c5957d205..350e5ccd9 100644 --- a/version/version_test.go +++ b/version/version_test.go @@ -59,6 +59,14 @@ func Test_PluginVersionCreate(t *testing.T) { true, "", }, + { + "4-parts version, should not be accepted", + "1.1.1.1", + "", + "", + true, + "", + }, } for _, tt := range tests {