@@ -4,17 +4,17 @@ import (
44 "bytes"
55 "encoding/json"
66 "fmt"
7- "io/fs" // Imported for fs.FileMode
7+ "io/fs"
88 "log"
99 "os"
1010 "os/exec"
1111 "path/filepath"
1212 "sort"
1313 "strings"
1414
15+ "github.com/blang/semver/v4"
1516 "golang.org/x/mod/modfile"
1617 "golang.org/x/mod/module"
17- "golang.org/x/mod/semver"
1818)
1919
2020const (
@@ -47,8 +47,8 @@ func readAndParseGoMod(filename string) (*modfile.File, error) {
4747// It validates the version and runs `go get` to update the dependency.
4848func getK8sVersionFromEnv (targetK8sVer string ) (string , error ) {
4949 log .Printf ("Found target %s version override from env var %s: %s" , k8sRepo , k8sVersionEnvVar , targetK8sVer )
50- if ! semver .IsValid (targetK8sVer ) {
51- return "" , fmt .Errorf ("invalid semver specified in %s: %s" , k8sVersionEnvVar , targetK8sVer )
50+ if _ , err := semver .ParseTolerant (targetK8sVer ); err != nil {
51+ return "" , fmt .Errorf ("invalid semver specified in %s: %s (%w) " , k8sVersionEnvVar , targetK8sVer , err )
5252 }
5353 // Update the go.mod file first
5454 log .Printf ("Running 'go get %s@%s' to update the main dependency..." , k8sRepo , targetK8sVer )
@@ -121,19 +121,22 @@ func main() {
121121 }
122122
123123 // Calculate target staging version
124- if ! semver .IsValid (k8sVer ) {
125- log .Fatalf ("Invalid semver for %s: %s" , k8sRepo , k8sVer )
124+ k8sSemVer , err := semver .ParseTolerant (k8sVer )
125+ if err != nil {
126+ // This should ideally not happen if validation passed earlier, but check anyway.
127+ log .Fatalf ("Invalid semver for %s: %s (%v)" , k8sRepo , k8sVer , err ) // Adjusted log format slightly
126128 }
127- // Example: k8sVer = v1.32.3
128- majorMinor := semver .MajorMinor (k8sVer ) // e.g., "v1.32"
129- patch := strings .TrimPrefix (k8sVer , majorMinor + "." ) // e.g., "3"
130- if len (strings .Split (majorMinor , "." )) != expectedMajorMinorParts {
131- log .Fatalf ("Unexpected format for MajorMinor: %s" , majorMinor )
129+
130+ if k8sSemVer .Major != 1 {
131+ log .Fatalf ("Expected k8s version %s to have major version 1" , k8sVer )
132132 }
133- // targetStagingVer becomes "v0" + ".32" + "." + "3" => "v0.32.3"
134- targetStagingVer := "v0" + strings .TrimPrefix (majorMinor , "v1" ) + "." + patch
135- if ! semver .IsValid (targetStagingVer ) {
136- log .Fatalf ("Calculated invalid staging semver: %s from k8s version %s" , targetStagingVer , k8sVer )
133+ targetSemVer := semver.Version {Major : 0 , Minor : k8sSemVer .Minor , Patch : k8sSemVer .Patch }
134+ // Prepend 'v' as expected by Go modules and the rest of the script logic
135+ targetStagingVer := "v" + targetSemVer .String ()
136+
137+ // Validate the constructed staging version string
138+ if _ , err := semver .ParseTolerant (targetStagingVer ); err != nil {
139+ log .Fatalf ("Calculated invalid staging semver: %s from k8s version %s (%v)" , targetStagingVer , k8sVer , err ) // Adjusted log format slightly
137140 }
138141 log .Printf ("Target staging version calculated: %s" , targetStagingVer )
139142
@@ -374,22 +377,21 @@ func getLatestExistingVersion(modulePath, targetVer string) (string, error) {
374377 }
375378
376379 // Target not found, try previous patch version
377- majorMinor := semver .MajorMinor (targetVer ) // e.g., v0.32
378- patchStr := strings .TrimPrefix (targetVer , majorMinor + "." ) // e.g., 3
379- var patch int
380- // Use Sscan to parse the integer patch number
381- if _ , err := fmt .Sscan (patchStr , & patch ); err != nil {
382- log .Printf ("Could not parse patch version from %s for module %s: %v. Cannot determine predecessor." , targetVer , modulePath , err )
380+ targetSemVer , err := semver .ParseTolerant (targetVer )
381+ if err != nil {
382+ log .Printf ("Could not parse target version %s for module %s: %v. Cannot determine predecessor." , targetVer , modulePath , err )
383383 return "" , nil // Cannot determine predecessor
384384 }
385385
386386 // Only try to decrement if the patch number is >= the minimum required to do so
387- if patch < minPatchNumberToDecrementFrom {
388- log .Printf ("Patch version %d is less than %d for %s, cannot determine predecessor." , patch , minPatchNumberToDecrementFrom , targetVer )
387+ if targetSemVer . Patch < uint64 ( minPatchNumberToDecrementFrom ) {
388+ log .Printf ("Patch version %d is less than %d for %s, cannot determine predecessor." , targetSemVer . Patch , minPatchNumberToDecrementFrom , targetVer )
389389 return "" , nil // Cannot determine predecessor (e.g., target was v0.32.0)
390390 }
391391
392- prevPatchVer := fmt .Sprintf ("%s.%d" , majorMinor , patch - 1 ) // e.g., v0.32.2
392+ prevSemVer := targetSemVer
393+ prevSemVer .Patch --
394+ prevPatchVer := "v" + prevSemVer .String ()
393395
394396 foundPrev := false
395397 for _ , v := range availableVersions {
0 commit comments