// Copyright 2025 The gVisor Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package nvconf import ( "fmt" "strconv" "strings" ) // DriverVersion represents a NVIDIA driver version patch release. // // +stateify savable type DriverVersion struct { major int minor int patch int } // NewDriverVersion returns a new driver version. func NewDriverVersion(major, minor, patch int) DriverVersion { return DriverVersion{major, minor, patch} } // DriverVersionFrom returns a DriverVersion from a string. func DriverVersionFrom(version string) (DriverVersion, error) { parts := strings.Split(version, ".") if len(parts) != 3 { return DriverVersion{}, fmt.Errorf("invalid format of version string %q", version) } var ( res DriverVersion err error ) res.major, err = strconv.Atoi(parts[0]) if err != nil { return DriverVersion{}, fmt.Errorf("invalid format for major version %q: %v", version, err) } res.minor, err = strconv.Atoi(parts[1]) if err != nil { return DriverVersion{}, fmt.Errorf("invalid format for minor version %q: %v", version, err) } res.patch, err = strconv.Atoi(parts[2]) if err != nil { return DriverVersion{}, fmt.Errorf("invalid format for patch version %q: %v", version, err) } return res, nil } func (v DriverVersion) String() string { return fmt.Sprintf("%02d.%02d.%02d", v.major, v.minor, v.patch) } // Equals returns true if the two driver versions are equal. func (v DriverVersion) Equals(other DriverVersion) bool { return v.major == other.major && v.minor == other.minor && v.patch == other.patch } // IsGreaterThan returns true if v is greater than other. // isGreaterThan returns true if v is more recent than other, assuming v and other are on the same // dev branch. func (v DriverVersion) IsGreaterThan(other DriverVersion) bool { switch { case v.major > other.major: return true case other.major > v.major: return false case v.minor > other.minor: return true case other.minor > v.minor: return false case v.patch > other.patch: return true case other.patch > v.patch: return false default: return true } } // Major returns the major version number. func (v DriverVersion) Major() int { return v.major }