Skip to content

Commit f4c730b

Browse files
authored
Fix prerelease identifier precedence (#146)
Before this commit bazel_features compared prerelease identifiers as strings, resulting in incorrect precedence between rolling releases and last_green builds.
1 parent 8d31933 commit f4c730b

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

private/parse.bzl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ def _partition(s):
1414
return s[:i], s[i:]
1515
return s, ""
1616

17+
def _parse_prerelease(prerelease):
18+
# Parses a SemVer prerelease string into a list of comparable identifiers, following the
19+
# precedence rules at https://semver.org/#spec-item-11.
20+
if not prerelease:
21+
return []
22+
identifiers = []
23+
for ident in prerelease.split("."):
24+
if ident.isdigit():
25+
identifiers.append((0, int(ident)))
26+
else:
27+
identifiers.append((1, ident))
28+
return identifiers
29+
1730
def parse_version(v):
1831
"""Parses the given Bazel version string into a comparable value.
1932
@@ -35,4 +48,4 @@ def parse_version(v):
3548
# feature detection. This allows for realistic testing of candidates and avoids the need to
3649
# specify "rc1" on every version.
3750
prerelease = ""
38-
return [_safe_int(s, v) for s in segments], not prerelease, prerelease
51+
return [_safe_int(s, v) for s in segments], not prerelease, _parse_prerelease(prerelease)

test/test.bzl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ def run_test(name):
2828
_assert_lt("6.0.0-pre.20241105.2", "6.0.0-pre.20241113.4")
2929
_assert_lt("6.0.0 some build metadata", "6.1.0 some other build metadata")
3030
_assert_lt("6.0.0", "")
31+
_assert_lt("1.0.0-alpha", "1.0.0-alpha.1")
32+
_assert_lt("1.0.0-alpha.1", "1.0.0-alpha.beta")
33+
_assert_lt("1.0.0-alpha.beta", "1.0.0-beta")
34+
_assert_lt("1.0.0-beta", "1.0.0-beta.2")
35+
_assert_lt("1.0.0-beta.2", "1.0.0-beta.11")
36+
_assert_lt("1.0.0-beta.11", "1.0.0-rc.1")
37+
_assert_lt("1.0.0-rc.1", "1.0.0")
38+
_assert_lt("10.0.0-pre.20260524.1", "10.0.0-pre-db077161e43484e4cb0f2270374ee33d05f3690d")
3139

3240
# a smoke test on the actual current Bazel version
3341
if not ge("0.0.1"):

0 commit comments

Comments
 (0)