From e0ab918f1539f4c462b8150ea5de8e90ba968865 Mon Sep 17 00:00:00 2001 From: Kirill Spitsyn Date: Wed, 14 Jan 2026 17:27:08 -0800 Subject: [PATCH] semver: fix intersection of point and open range Fixes a bug where intersecting a point version like [1.0.0, 1.0.0] with an open range like (1.0.0, inf) incorrectly resulted in a valid span instead of empty. Added regression tests. --- util/semver/set_test.go | 6 ++++++ util/semver/span.go | 3 +++ 2 files changed, 9 insertions(+) diff --git a/util/semver/set_test.go b/util/semver/set_test.go index a760012f..3fa62374 100644 --- a/util/semver/set_test.go +++ b/util/semver/set_test.go @@ -196,6 +196,12 @@ func TestIntersect(t *testing.T) { {strs("[1.0.0:2.0.0]"), strs("[1.0.0:2.0.0)"), "{[1.0.0:2.0.0)}"}, {strs("<1.2.3"), strs("<=1.2.3"), "{[0.0.0-0:1.2.3)}"}, {strs("<=1.2.3"), strs("<1.2.3"), "{[0.0.0-0:1.2.3)}"}, + + // Bug regression: Intersecting [1.0.0, 1.0.0] with (1.0.0, inf) should be empty. + // We use <1.0.0 vs 1.0.0 to trigger [0, 1) vs [1, 1]. + {strs("<1.0.0"), strs("1.0.0"), "{}"}, + // We use >1.0.0 vs 1.0.0 to trigger (1, inf) vs [1, 1]. + {strs(">1.0.0"), strs("1.0.0"), "{}"}, } for _, test := range tests { set1 := Set{DefaultSystem, spans(t, test.s1...)} diff --git a/util/semver/span.go b/util/semver/span.go index 393f4aa3..64c0e069 100644 --- a/util/semver/span.go +++ b/util/semver/span.go @@ -135,6 +135,9 @@ func newSpan(min *Version, minOpen bool, max *Version, maxOpen bool) (span, erro max.build = "" switch { case min.equal(max): + if minOpen || maxOpen { + return span{rank: empty}, nil + } return span{ minOpen: minOpen, maxOpen: maxOpen,