dotcloud/docker

View on GitHub
pkg/parsers/kernel/kernel.go

Summary

Maintainability
A
45 mins
Test Coverage
//go:build !windows

// Package kernel provides helper function to get, parse and compare kernel
// versions for different platforms.
package kernel // import "github.com/docker/docker/pkg/parsers/kernel"

import (
    "errors"
    "fmt"
)

// VersionInfo holds information about the kernel.
type VersionInfo struct {
    Kernel int    // Version of the kernel (e.g. 4.1.2-generic -> 4)
    Major  int    // Major part of the kernel version (e.g. 4.1.2-generic -> 1)
    Minor  int    // Minor part of the kernel version (e.g. 4.1.2-generic -> 2)
    Flavor string // Flavor of the kernel version (e.g. 4.1.2-generic -> generic)
}

func (k *VersionInfo) String() string {
    return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor)
}

// CompareKernelVersion compares two kernel.VersionInfo structs.
// Returns -1 if a < b, 0 if a == b, 1 it a > b
func CompareKernelVersion(a, b VersionInfo) int {
    if a.Kernel < b.Kernel {
        return -1
    } else if a.Kernel > b.Kernel {
        return 1
    }

    if a.Major < b.Major {
        return -1
    } else if a.Major > b.Major {
        return 1
    }

    if a.Minor < b.Minor {
        return -1
    } else if a.Minor > b.Minor {
        return 1
    }

    return 0
}

// ParseRelease parses a string and creates a VersionInfo based on it.
func ParseRelease(release string) (*VersionInfo, error) {
    var (
        kernel, major, minor, parsed int
        flavor, partial              string
    )

    // Ignore error from Sscanf to allow an empty flavor.  Instead, just
    // make sure we got all the version numbers.
    parsed, _ = fmt.Sscanf(release, "%d.%d%s", &kernel, &major, &partial)
    if parsed < 2 {
        return nil, errors.New("Can't parse kernel version " + release)
    }

    // sometimes we have 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64
    parsed, _ = fmt.Sscanf(partial, ".%d%s", &minor, &flavor)
    if parsed < 1 {
        flavor = partial
    }

    return &VersionInfo{
        Kernel: kernel,
        Major:  major,
        Minor:  minor,
        Flavor: flavor,
    }, nil
}