internal/installer/windowsmsi: restore pre-release version splitting

CL 554057 updated the splitVersion implementation to account for major
Go releases now having a trailing ".0" component, so "go1.34" would be
"go1.34.0" instead. However, our pre-release versions still need to be
handled as before, which that CL inadvertently broke, and no test case
caught.

Update the code, test cases, and add error reporting accordingly.

For golang/go#63147.

Change-Id: Iab49ee70f17930cc2e6b871311c5d32cd68704d2
Reviewed-on: https://go-review.googlesource.com/c/build/+/555315
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
diff --git a/internal/installer/windowsmsi/windowsmsi.go b/internal/installer/windowsmsi/windowsmsi.go
index a500d37..caea1d3 100644
--- a/internal/installer/windowsmsi/windowsmsi.go
+++ b/internal/installer/windowsmsi/windowsmsi.go
@@ -96,7 +96,10 @@
 	}
 
 	fmt.Println("\nBuilding package (running wix candle).")
-	verMajor, verMinor := splitVersion(version)
+	verMajor, verMinor, err := splitVersion(version)
+	if err != nil {
+		return "", fmt.Errorf("failed to split version %q: %v", version, err)
+	}
 	var msArch string
 	switch opt.GOARCH {
 	case "386":
@@ -245,22 +248,28 @@
 	return cmd.Run()
 }
 
-var versionRE = regexp.MustCompile(`^go1\.(\d+\.\d+)`)
+var versionRE = regexp.MustCompile(`^go1\.(\d+(\.\d+)?)`)
 
-// splitVersion splits a Go version string such as "go1.23.4" (as matched by versionRE)
-// into its parts: major and minor.
-func splitVersion(v string) (major, minor int) {
+// splitVersion splits a Go version string such as "go1.23.4" or "go1.24rc1"
+// (as matched by versionRE) into its parts: major and minor.
+func splitVersion(v string) (major, minor int, _ error) {
 	m := versionRE.FindStringSubmatch(v)
 	if len(m) < 2 {
-		return 0, 0
+		return 0, 0, fmt.Errorf("no regexp match")
 	}
 	parts := strings.Split(m[1], ".")
-	if len(parts) < 2 {
-		return 0, 0
+	major, err := strconv.Atoi(parts[0])
+	if err != nil {
+		return 0, 0, fmt.Errorf("parsing major part: %v", err)
 	}
-	major, _ = strconv.Atoi(parts[0])
-	minor, _ = strconv.Atoi(parts[1])
-	return major, minor
+	if len(parts) >= 2 {
+		var err error
+		minor, err = strconv.Atoi(parts[1])
+		if err != nil {
+			return 0, 0, fmt.Errorf("parsing minor part: %v", err)
+		}
+	}
+	return major, minor, nil
 }
 
 const storageBase = "https://storage.googleapis.com/go-builder-data/release/"
diff --git a/internal/installer/windowsmsi/windowsmsi_test.go b/internal/installer/windowsmsi/windowsmsi_test.go
index a50e05a..9401b61 100644
--- a/internal/installer/windowsmsi/windowsmsi_test.go
+++ b/internal/installer/windowsmsi/windowsmsi_test.go
@@ -42,8 +42,13 @@
 	}{
 		{"go1.34.0", 34, 0},
 		{"go1.34.7", 34, 7},
+		{"go1.35rc1", 35, 0},
 	} {
-		major, minor := splitVersion(tc.v)
+		major, minor, err := splitVersion(tc.v)
+		if err != nil {
+			t.Errorf("splitVersion(%q) returned error %v; want nil", tc.v, err)
+			continue
+		}
 		if major != tc.major || minor != tc.minor {
 			t.Errorf("splitVersion(%q) = %v, %v; want %v, %v", tc.v, major, minor, tc.major, tc.minor)
 		}