From ac097bfe70bb9a3ab928d504f04f853e7a5cc710 Mon Sep 17 00:00:00 2001 From: Mike Danese Date: Tue, 1 Dec 2015 11:56:44 -0800 Subject: [PATCH] add semver parsing of gitversion to pkg/version --- pkg/version/semver.go | 50 ++++++++++++++++++++++++++++++++++++++ pkg/version/semver_test.go | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 pkg/version/semver.go create mode 100644 pkg/version/semver_test.go diff --git a/pkg/version/semver.go b/pkg/version/semver.go new file mode 100644 index 00000000000..3d18a10209c --- /dev/null +++ b/pkg/version/semver.go @@ -0,0 +1,50 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +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 version + +import ( + "strings" + "unicode" + + "github.com/blang/semver" + "github.com/golang/glog" +) + +func Parse(gitversion string) (semver.Version, error) { + // optionally trim leading spaces then one v + var seen bool + gitversion = strings.TrimLeftFunc(gitversion, func(ch rune) bool { + if seen { + return false + } + if ch == 'v' { + seen = true + return true + } + return unicode.IsSpace(ch) + }) + + return semver.Make(gitversion) +} + +func MustParse(gitversion string) semver.Version { + v, err := Parse(gitversion) + if err != nil { + glog.Fatalf("failed to parse semver from giversion %q: %v", gitversion, err) + } + return v +} diff --git a/pkg/version/semver_test.go b/pkg/version/semver_test.go new file mode 100644 index 00000000000..4f4de75891c --- /dev/null +++ b/pkg/version/semver_test.go @@ -0,0 +1,47 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +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 version + +import "testing" + +func TestParseVersion(t *testing.T) { + cases := []struct { + version string + expectErr bool + }{ + {version: "v1.0.1-alpha"}, + {version: "v0.19.3"}, + {version: "0.19.3"}, + {version: "v1.2.0-alpha.3.1264+0655e65b435106-dirty"}, + {version: "1.2.0-alpha.3.1264+0655e65b435106-dirty"}, + {version: "1.2.0-alpha.3.1264+0655e65b435106-dirty"}, + {version: "1.0.0"}, + {version: "\t v1.0.0"}, + {version: "vv1.0.0", expectErr: true}, + {version: "blah1.0.0", expectErr: true}, + } + + for i, c := range cases { + _, err := Parse(c.version) + if err != nil && !c.expectErr { + t.Errorf("[%v]unexpected error: %v", i, err) + } + if err == nil && c.expectErr { + t.Errorf("[%v]expected error for %s", i, c.version) + } + } +}