Skip to content

Commit 51b6b89

Browse files
committed
Replace x/mod/semver w/ blang - more legible parse
Signed-off-by: Brett Tofel <[email protected]>
1 parent b6d6b07 commit 51b6b89

File tree

1 file changed

+26
-24
lines changed

1 file changed

+26
-24
lines changed

hack/tools/k8smaintainer/main.go

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2020
const (
@@ -47,8 +47,8 @@ func readAndParseGoMod(filename string) (*modfile.File, error) {
4747
// It validates the version and runs `go get` to update the dependency.
4848
func 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

Comments
 (0)