From 93e00cc0d0126337574a1b992f8adbd25c81e090 Mon Sep 17 00:00:00 2001 From: Michael Rykov Date: Wed, 23 Mar 2016 12:35:47 +0800 Subject: [PATCH] Restrict prerelease range matches --- range.go | 21 ++++++++++++++++++--- range_test.go | 12 ++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/range.go b/range.go index 0a8eaa1..ab5778b 100644 --- a/range.go +++ b/range.go @@ -36,9 +36,15 @@ type versionRange struct { // rangeFunc creates a Range from the given versionRange. func (vr *versionRange) rangeFunc() Range { - return Range(func(v Version) bool { - return vr.c(v, vr.v) - }) + if len(vr.v.Pre) == 0 { + return Range(func(v Version) bool { + return len(v.Pre) == 0 && vr.c(v, vr.v) + }) + } else { + return Range(func(v Version) bool { + return prMatch(vr.v, v) && vr.c(v, vr.v) + }) + } } // Range represents a range of versions. @@ -187,6 +193,15 @@ func splitAndTrim(s string) (result []string) { return } +// When checking prerelease ranges, we want to make sure we're +// only matching against ranges with same [major, minor, patch] +func prMatch(v, o Version) bool { + return len(o.Pre) == 0 || ( + v.Major == o.Major && + v.Minor == o.Minor && + v.Patch == o.Patch) +} + // splitComparatorVersion splits the comparator from the version. // Spaces between the comparator and the version are not allowed. // Input must be free of leading or trailing spaces. diff --git a/range_test.go b/range_test.go index 5a745a9..bb6b736 100644 --- a/range_test.go +++ b/range_test.go @@ -263,6 +263,7 @@ func TestParseRange(t *testing.T) { {"1.2.2", false}, {"1.2.3", false}, {"1.2.4", true}, + {"1.2.5-beta", false}, }}, {">=1.2.3", []tv{ {"1.2.3", true}, @@ -304,6 +305,17 @@ func TestParseRange(t *testing.T) { {"1.2.3", false}, {"1.2.4", true}, }}, + + // Prerelease Expression + {">=1.4.2-beta.2", []tv{ + {"1.3.2", false}, + {"1.4.3", true}, + {"1.4.0-beta", false}, + {"1.4.2-beta", false}, + {"1.4.2-beta.3", true}, + {"1.4.3-beta", false}, + }}, + // Simple Expression errors {">>1.2.3", nil}, {"!1.2.3", nil},