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, nil

View on GitHub (pinned to c9a67b23e8)

Solutions

  1. Check the error from ParseSemver before calling CompareVersions
  2. Ensure the version string being parsed is well-formed (e.g. '1.2.0')
  3. 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

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


AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06). Data as JSON: /api/errors/7b5d652068279a7e. Report an issue: GitHub.