From d0cc5f4e357ecba0ca0e40922f0305475d9f7a8d Mon Sep 17 00:00:00 2001 From: Karan Misra Date: Sun, 2 Mar 2014 01:54:01 +0530 Subject: [PATCH] fixed parsing of the raspberry pi's kernel version --- host/detect.go | 37 +++++++++++++++++++++++-------------- host/detect_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 host/detect_test.go diff --git a/host/detect.go b/host/detect.go index 12b0511..659353d 100644 --- a/host/detect.go +++ b/host/detect.go @@ -30,25 +30,34 @@ func nodeName() (string, error) { return execOutput("uname", "-n") } +func parseVersion(str string) (major, minor, patch int, err error) { + parts := strings.Split(str, ".") + len := len(parts) + + if major, err = strconv.Atoi(parts[0]); err != nil { + return 0, 0, 0, err + } + if minor, err = strconv.Atoi(parts[1]); err != nil { + return 0, 0, 0, err + } + if len > 2 { + part := parts[2] + part = strings.TrimSuffix(part, "+") + if patch, err = strconv.Atoi(part); err != nil { + return 0, 0, 0, err + } + } + + return major, minor, patch, err +} + func kernelVersion() (major, minor, patch int, err error) { output, err := execOutput("uname", "-r") if err != nil { - return + return 0, 0, 0, err } - parts := strings.Split(output, ".") - - if major, err = strconv.Atoi(parts[0]); err != nil { - return - } - if minor, err = strconv.Atoi(parts[1]); err != nil { - return - } - if patch, err = strconv.Atoi(parts[2]); err != nil { - return - } - - return + return parseVersion(output) } func Detect() (Host, int, error) { diff --git a/host/detect_test.go b/host/detect_test.go new file mode 100644 index 0000000..aa33dca --- /dev/null +++ b/host/detect_test.go @@ -0,0 +1,37 @@ +package host + +import "testing" + +func TestKernelVersionParse(t *testing.T) { + var tests = []struct { + versionStr string + major, minor, patch int + }{ + { + "3.8", + 3, 8, 0, + }, + { + "3.7", + 3, 7, 0, + }, + { + "3.8.2", + 3, 8, 2, + }, + { + "3.8.10+", + 3, 8, 10, + }, + } + for _, test := range tests { + major, minor, patch, err := parseVersion(test.versionStr) + if err != nil { + t.Errorf("Failed parsing %q: %v", test.versionStr, err) + continue + } + if major != test.major || minor != test.minor || patch != test.patch { + t.Errorf("Parse of %q: got (%v, %v, %v) want (%v, %v, %v)", test.versionStr, major, minor, patch, test.major, test.minor, test.patch) + } + } +}