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
- Strip leading zeroes from each numeric segment before parsing: strconv.FormatUint(strconv.ParseUint(seg,10,64))
- Fix the generator producing zero-padded versions
- 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
- Never format version segments with %02d
- Normalize external version strings through ParseUint/FormatUint before parsing
- Add a semver-regex lint for generated release tags
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
- Invalid character(s) found in patch number %q
- Invalid character(s) found in build meta data %q
- Numeric PreRelease version must not contain leading zeroes %
- Invalid character(s) found in prerelease %q
- Unrecognized version: "%s"
AI-assisted analysis of coreybutler/nvm-windows@5b18223ca1 (2026-08-15).
Data as JSON: /api/errors/bf059b1766e682e8.
Report an issue: GitHub.