Also change to parsing it with regexp to keep things simple.
Docker-DCO-1.1-Signed-off-by: Charles Lindsay <chaz@chazomatic.us> (github: chazomaticus)
| ... | ... |
@@ -6,6 +6,7 @@ import ( |
| 6 | 6 |
"crypto/sha256" |
| 7 | 7 |
"encoding/hex" |
| 8 | 8 |
"encoding/json" |
| 9 |
+ "errors" |
|
| 9 | 10 |
"fmt" |
| 10 | 11 |
"index/suffixarray" |
| 11 | 12 |
"io" |
| ... | ... |
@@ -552,15 +553,10 @@ type KernelVersionInfo struct {
|
| 552 | 552 |
Kernel int |
| 553 | 553 |
Major int |
| 554 | 554 |
Minor int |
| 555 |
- Flavor string |
|
| 556 | 555 |
} |
| 557 | 556 |
|
| 558 | 557 |
func (k *KernelVersionInfo) String() string {
|
| 559 |
- flavor := "" |
|
| 560 |
- if len(k.Flavor) > 0 {
|
|
| 561 |
- flavor = fmt.Sprintf("-%s", k.Flavor)
|
|
| 562 |
- } |
|
| 563 |
- return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, flavor)
|
|
| 558 |
+ return fmt.Sprintf("%d.%d.%d", k.Kernel, k.Major, k.Minor)
|
|
| 564 | 559 |
} |
| 565 | 560 |
|
| 566 | 561 |
// Compare two KernelVersionInfo struct. |
| ... | ... |
@@ -613,48 +609,28 @@ func GetKernelVersion() (*KernelVersionInfo, error) {
|
| 613 | 613 |
|
| 614 | 614 |
func ParseRelease(release string) (*KernelVersionInfo, error) {
|
| 615 | 615 |
var ( |
| 616 |
- flavor string |
|
| 617 |
- kernel, major, minor int |
|
| 618 |
- err error |
|
| 616 |
+ parts [3]int |
|
| 617 |
+ err error |
|
| 619 | 618 |
) |
| 620 | 619 |
|
| 621 |
- tmp := strings.SplitN(release, "-", 2) |
|
| 622 |
- tmp2 := strings.Split(tmp[0], ".") |
|
| 623 |
- |
|
| 624 |
- if len(tmp2) > 0 {
|
|
| 625 |
- kernel, err = strconv.Atoi(tmp2[0]) |
|
| 626 |
- if err != nil {
|
|
| 627 |
- return nil, err |
|
| 628 |
- } |
|
| 629 |
- } |
|
| 620 |
+ re := regexp.MustCompile(`^([0-9]+)\.([0-9]+)\.([0-9]+)`) |
|
| 621 |
+ subs := re.FindStringSubmatch(release) |
|
| 630 | 622 |
|
| 631 |
- if len(tmp2) > 1 {
|
|
| 632 |
- major, err = strconv.Atoi(tmp2[1]) |
|
| 633 |
- if err != nil {
|
|
| 634 |
- return nil, err |
|
| 635 |
- } |
|
| 623 |
+ if len(subs) < 4 {
|
|
| 624 |
+ return nil, errors.New("Can't parse kernel version " + release)
|
|
| 636 | 625 |
} |
| 637 | 626 |
|
| 638 |
- if len(tmp2) > 2 {
|
|
| 639 |
- // Removes "+" because git kernels might set it |
|
| 640 |
- minorUnparsed := strings.Trim(tmp2[2], "+") |
|
| 641 |
- minor, err = strconv.Atoi(minorUnparsed) |
|
| 627 |
+ for i := 0; i < 3; i++ {
|
|
| 628 |
+ parts[i], err = strconv.Atoi(subs[i+1]) |
|
| 642 | 629 |
if err != nil {
|
| 643 | 630 |
return nil, err |
| 644 | 631 |
} |
| 645 | 632 |
} |
| 646 | 633 |
|
| 647 |
- if len(tmp) == 2 {
|
|
| 648 |
- flavor = tmp[1] |
|
| 649 |
- } else {
|
|
| 650 |
- flavor = "" |
|
| 651 |
- } |
|
| 652 |
- |
|
| 653 | 634 |
return &KernelVersionInfo{
|
| 654 |
- Kernel: kernel, |
|
| 655 |
- Major: major, |
|
| 656 |
- Minor: minor, |
|
| 657 |
- Flavor: flavor, |
|
| 635 |
+ Kernel: parts[0], |
|
| 636 |
+ Major: parts[1], |
|
| 637 |
+ Minor: parts[2], |
|
| 658 | 638 |
}, nil |
| 659 | 639 |
} |
| 660 | 640 |
|
| ... | ... |
@@ -237,16 +237,16 @@ func TestCompareKernelVersion(t *testing.T) {
|
| 237 | 237 |
&KernelVersionInfo{Kernel: 2, Major: 6, Minor: 0},
|
| 238 | 238 |
1) |
| 239 | 239 |
assertKernelVersion(t, |
| 240 |
- &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"},
|
|
| 241 |
- &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "16"},
|
|
| 240 |
+ &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
|
| 241 |
+ &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
|
| 242 | 242 |
0) |
| 243 | 243 |
assertKernelVersion(t, |
| 244 | 244 |
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 5},
|
| 245 | 245 |
&KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
| 246 | 246 |
1) |
| 247 | 247 |
assertKernelVersion(t, |
| 248 |
- &KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20, Flavor: "25"},
|
|
| 249 |
- &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"},
|
|
| 248 |
+ &KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20},
|
|
| 249 |
+ &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0},
|
|
| 250 | 250 |
-1) |
| 251 | 251 |
} |
| 252 | 252 |
|
| ... | ... |
@@ -412,9 +412,9 @@ func assertParseRelease(t *testing.T, release string, b *KernelVersionInfo, resu |
| 412 | 412 |
func TestParseRelease(t *testing.T) {
|
| 413 | 413 |
assertParseRelease(t, "3.8.0", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0)
|
| 414 | 414 |
assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0)
|
| 415 |
- assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: "1"}, 0)
|
|
| 416 |
- assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "19-generic"}, 0)
|
|
| 417 |
- assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0)
|
|
| 415 |
+ assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0)
|
|
| 416 |
+ assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0)
|
|
| 417 |
+ assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8}, 0)
|
|
| 418 | 418 |
} |
| 419 | 419 |
|
| 420 | 420 |
func TestParsePortMapping(t *testing.T) {
|