mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #3695 from chazomaticus/3628-ignore-kernel-flavor
ignore non-numeric characters when parsing kernel version
This commit is contained in:
commit
4ccf423f42
2 changed files with 21 additions and 46 deletions
|
@ -6,6 +6,7 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"index/suffixarray"
|
"index/suffixarray"
|
||||||
"io"
|
"io"
|
||||||
|
@ -556,15 +557,11 @@ type KernelVersionInfo struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *KernelVersionInfo) String() string {
|
func (k *KernelVersionInfo) String() string {
|
||||||
flavor := ""
|
return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor)
|
||||||
if len(k.Flavor) > 0 {
|
|
||||||
flavor = fmt.Sprintf("-%s", k.Flavor)
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, flavor)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compare two KernelVersionInfo struct.
|
// Compare two KernelVersionInfo struct.
|
||||||
// Returns -1 if a < b, = if a == b, 1 it a > b
|
// Returns -1 if a < b, 0 if a == b, 1 it a > b
|
||||||
func CompareKernelVersion(a, b *KernelVersionInfo) int {
|
func CompareKernelVersion(a, b *KernelVersionInfo) int {
|
||||||
if a.Kernel < b.Kernel {
|
if a.Kernel < b.Kernel {
|
||||||
return -1
|
return -1
|
||||||
|
@ -613,41 +610,15 @@ func GetKernelVersion() (*KernelVersionInfo, error) {
|
||||||
|
|
||||||
func ParseRelease(release string) (*KernelVersionInfo, error) {
|
func ParseRelease(release string) (*KernelVersionInfo, error) {
|
||||||
var (
|
var (
|
||||||
flavor string
|
kernel, major, minor, parsed int
|
||||||
kernel, major, minor int
|
flavor string
|
||||||
err error
|
|
||||||
)
|
)
|
||||||
|
|
||||||
tmp := strings.SplitN(release, "-", 2)
|
// Ignore error from Sscanf to allow an empty flavor. Instead, just
|
||||||
tmp2 := strings.Split(tmp[0], ".")
|
// make sure we got all the version numbers.
|
||||||
|
parsed, _ = fmt.Sscanf(release, "%d.%d.%d%s", &kernel, &major, &minor, &flavor)
|
||||||
if len(tmp2) > 0 {
|
if parsed < 3 {
|
||||||
kernel, err = strconv.Atoi(tmp2[0])
|
return nil, errors.New("Can't parse kernel version " + release)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(tmp2) > 1 {
|
|
||||||
major, err = strconv.Atoi(tmp2[1])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(tmp2) > 2 {
|
|
||||||
// Removes "+" because git kernels might set it
|
|
||||||
minorUnparsed := strings.Trim(tmp2[2], "+")
|
|
||||||
minor, err = strconv.Atoi(minorUnparsed)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(tmp) == 2 {
|
|
||||||
flavor = tmp[1]
|
|
||||||
} else {
|
|
||||||
flavor = ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &KernelVersionInfo{
|
return &KernelVersionInfo{
|
||||||
|
|
|
@ -237,16 +237,16 @@ func TestCompareKernelVersion(t *testing.T) {
|
||||||
&KernelVersionInfo{Kernel: 2, Major: 6, Minor: 0},
|
&KernelVersionInfo{Kernel: 2, Major: 6, Minor: 0},
|
||||||
1)
|
1)
|
||||||
assertKernelVersion(t,
|
assertKernelVersion(t,
|
||||||
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"},
|
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
||||||
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "16"},
|
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
||||||
0)
|
0)
|
||||||
assertKernelVersion(t,
|
assertKernelVersion(t,
|
||||||
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 5},
|
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 5},
|
||||||
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
||||||
1)
|
1)
|
||||||
assertKernelVersion(t,
|
assertKernelVersion(t,
|
||||||
&KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20, Flavor: "25"},
|
&KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20},
|
||||||
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"},
|
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
||||||
-1)
|
-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,13 +407,17 @@ func assertParseRelease(t *testing.T, release string, b *KernelVersionInfo, resu
|
||||||
if r := CompareKernelVersion(a, b); r != result {
|
if r := CompareKernelVersion(a, b); r != result {
|
||||||
t.Fatalf("Unexpected kernel version comparison result. Found %d, expected %d", r, result)
|
t.Fatalf("Unexpected kernel version comparison result. Found %d, expected %d", r, result)
|
||||||
}
|
}
|
||||||
|
if a.Flavor != b.Flavor {
|
||||||
|
t.Fatalf("Unexpected parsed kernel flavor. Found %s, expected %s", a.Flavor, b.Flavor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseRelease(t *testing.T) {
|
func TestParseRelease(t *testing.T) {
|
||||||
assertParseRelease(t, "3.8.0", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0)
|
assertParseRelease(t, "3.8.0", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0)
|
||||||
assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0)
|
assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: ".longterm-1"}, 0)
|
||||||
assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: "1"}, 0)
|
assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: ".longterm-1"}, 0)
|
||||||
assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "19-generic"}, 0)
|
assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "-19-generic"}, 0)
|
||||||
|
assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParsePortMapping(t *testing.T) {
|
func TestParsePortMapping(t *testing.T) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue