From e1ecfdc7383a197fc32283aede15eed3a6735492 Mon Sep 17 00:00:00 2001 From: Max Brauer Date: Tue, 2 Apr 2024 13:07:34 +0200 Subject: [PATCH] Don't treat x in pre-release and build metadata identifiers as a wildcard Signed-off-by: Max Brauer --- v4/range.go | 20 +++++++++++++++----- v4/range_test.go | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/v4/range.go b/v4/range.go index cee7b4b..dbfb91f 100644 --- a/v4/range.go +++ b/v4/range.go @@ -327,12 +327,12 @@ func expandWildcardVersion(parts [][]string) ([][]string, error) { for _, p := range parts { var newParts []string for _, ap := range p { - if strings.Contains(ap, "x") { - opStr, vStr, err := splitComparatorVersion(ap) - if err != nil { - return nil, err - } + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + if containsWildcard(ap) { versionWildcardType := getWildcardType(vStr) flatVersion := createVersionFromWildcard(vStr) @@ -381,6 +381,16 @@ func expandWildcardVersion(parts [][]string) ([][]string, error) { return expandedParts, nil } +// containsWildcard returns true if there's a wildcard in any of the major, minor or patch components +func containsWildcard(v string) bool { + return strings.Contains(trimIdentifiers(v), ".x") +} + +// trimIdentifiers removes any pre-release and build metadata from a version +func trimIdentifiers(v string) string { + return strings.Split(strings.Split(v, "+")[0], "-")[0] +} + func parseComparator(s string) comparator { switch s { case "==": diff --git a/v4/range_test.go b/v4/range_test.go index 6d20759..7a1fa55 100644 --- a/v4/range_test.go +++ b/v4/range_test.go @@ -202,6 +202,7 @@ func TestGetWildcardType(t *testing.T) { {"x", majorWildcard}, {"1.x", minorWildcard}, {"1.2.x", patchWildcard}, + {"1.2.3-x", noneWildcard}, {"fo.o.b.ar", noneWildcard}, } @@ -387,6 +388,19 @@ func TestParseRange(t *testing.T) { {"1.2.3", true}, {"1.2.4", false}, }}, + {"1.2.3-x.x", []tv{ + {"1.2.3-x.y", false}, + {"1.2.3-x.x", true}, + }}, + {"1.2.3+x.x", []tv{ + {"1.2.3+x.y", false}, + {"1.2.3+x.x", true}, + }}, + {"1.2.3-x.x+x.x", []tv{ + {"1.2.3-x.x+x.y", false}, + {"1.2.3-x.y+x.x", false}, + {"1.2.3-x.x+x.x", true}, + }}, {"=1.2.3", []tv{ {"1.2.2", false}, {"1.2.3", true},