juicedata/juicefs · error
v1 %v and v2 %v can't be nil
Error message
v1 %v and v2 %v can't be nil
What it means
CompareVersions compares two *Semver values; if either pointer is nil it returns 0 with 'v1 %v and v2 %v can't be nil'. It is a defensive guard preventing nil dereference when comparing parsed versions.
Source
Thrown at pkg/version/version.go:68
}
return fmt.Sprintf("%d.%d.%d%s+%s", s.major, s.minor, s.patch, pr, s.build)
}
func Version() string {
return ver.String()
}
func SetVersion(v string) {
ver = *Parse(v)
}
func GetVersion() Semver {
return ver
}
func CompareVersions(v1, v2 *Semver) (int, error) {
if v1 == nil || v2 == nil {
return 0, fmt.Errorf("v1 %v and v2 %v can't be nil", v1, v2)
}
var less bool
if v1.major != v2.major {
less = v1.major < v2.major
} else if v1.minor != v2.minor {
less = v1.minor < v2.minor
} else if v1.patch != v2.patch {
less = v1.patch < v2.patch
} else if v1.preRelease != v2.preRelease {
less = v1.preRelease < v2.preRelease
if v1.preRelease == "" || v2.preRelease == "" {
less = !less
}
} else {
return 0, nil
}
if less {
return -1, nilView on GitHub (pinned to c9a67b23e8)
Solutions
- Check the error from ParseSemver before calling CompareVersions
- Ensure the version string being parsed is well-formed (e.g. '1.2.0')
- Guard with a nil check before comparison
Example fix
// before
n, _ := version.ParseSemver(v)
res, err := version.CompareVersions(n, m)
// after
n, err := version.ParseSemver(v)
if err != nil { return err }
res, err := version.CompareVersions(n, m) Defensive patterns
Strategy: type-guard
Validate before calling
if v1 == nil || v2 == nil { return errors.New("nil version") } Type guard
func nonNilSemver(v *version.Semver) bool { return v != nil } Try / catch
if _, err := CompareVersions(a, b); err != nil { log.Fatalf("version compare failed: %v", err) } Prevention
- Always check ParseSemver's error before comparing
- Cache parsed versions, not raw strings
- Initialize version globals at startup
When it happens
Trigger: Calling CompareVersions (directly or via compareVersion, canShutdownGracefully, CheckCliVersion) with a nil version — usually ParseSemver failed earlier and its error/nil result was ignored.
Common situations: Upgrade-status checks against a client whose version string failed to parse; comparing against an uninitialized cached version; config where the version field is empty.
Related errors
- version is nil
- Invalid version string: %s
- cannot lower min-client-version from %s to %s
- --tier should be between 0 and 3
- --days should be at least 1
AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06).
Data as JSON: /api/errors/7b5d652068279a7e.
Report an issue: GitHub.