coreybutler/nvm-windows · error

Patch number must not contain leading zeroes %q

Error message

Patch number must not contain leading zeroes %q

What it means

Semver parse error enforcing strict SEMVER 2.0.0 compliance: the patch number has a leading zero (e.g. "01", "007"). hasLeadingZeroes(patch) returned true, which semver spec forbids because versions are numeric identifiers.

Source

Thrown at src/semver/semver.go:239

	} else if preIndex == -1 && buildIndex != -1 {
		subVersionIndex = buildIndex
	} else if preIndex == -1 && buildIndex == -1 {
		subVersionIndex = len(parts[2])
	} else {
		// if there is no actual pr version but a hyphen inside the build meta data
		if buildIndex < preIndex {
			subVersionIndex = buildIndex
			preIndex = -1 // Build meta data before preIndex found implicates there are no prerelease versions
		} else {
			subVersionIndex = preIndex
		}
	}

	if !containsOnly(parts[2][:subVersionIndex], numbers) {
		return nil, fmt.Errorf("Invalid character(s) found in patch number %q", parts[2][:subVersionIndex])
	}
	if hasLeadingZeroes(parts[2][:subVersionIndex]) {
		return nil, fmt.Errorf("Patch number must not contain leading zeroes %q", parts[2][:subVersionIndex])
	}
	patch, err := strconv.ParseUint(parts[2][:subVersionIndex], 10, 64)
	if err != nil {
		return nil, err
	}
	v := &Version{}
	v.Major = major
	v.Minor = minor
	v.Patch = patch

	// There are PreRelease versions
	if preIndex != -1 {
		var preRels string
		if buildIndex != -1 {
			preRels = parts[2][subVersionIndex+1 : buildIndex]
		} else {
			preRels = parts[2][subVersionIndex+1:]
		}

View on GitHub (pinned to 5b18223ca1)

Solutions

  1. Strip leading zeroes from each numeric segment before parsing: strconv.FormatUint(strconv.ParseUint(seg,10,64))
  2. Fix the generator producing zero-padded versions
  3. Validate input against a strict semver regex before handing it to NewVersion

Example fix

// before
v, err := semver.NewVersion("1.2.01") // error: leading zeroes

// after
v, err := semver.NewVersion("1.2.1")
Defensive patterns

Strategy: validation

Validate before calling

func stripLeadingZeroes(seg string) (string, error) {
    n, err := strconv.ParseUint(strings.TrimLeft(seg, "0"), 10, 64)
    if err != nil { return "", err }
    return strconv.FormatUint(n, 10), nil
}

Try / catch

if _, err := semver.NewVersion(v); err != nil && strings.Contains(err.Error(), "leading zeroes") {
    v = normalizeSegments(v) // rewrite 01 -> 1 per segment, then retry
    _, err = semver.NewVersion(v)
}

Prevention

When it happens

Trigger: semver.NewVersion("1.2.01"), "1.2.007", or any patch segment matching /^0\d+/ after the numeric-only check passes.

Common situations: Zero-padded version strings generated by scripts (e.g. dates or counters formatted with %02d), versions scraped from filenames or tags that pad segments, user-typed versions with padding.

Related errors


AI-assisted analysis of coreybutler/nvm-windows@5b18223ca1 (2026-08-15). Data as JSON: /api/errors/bf059b1766e682e8. Report an issue: GitHub.