diff --git a/lib/forge.func b/lib/forge.func index 5cb0995..4a1f709 100644 --- a/lib/forge.func +++ b/lib/forge.func @@ -1309,13 +1309,15 @@ _forge_descriptor() { # release, so -ls45 or -1 revisions still order by their number. _FORGE_JQ_VKEY_DEF='def _forge_vkey: sub("^[^0-9]*"; "") + | (ascii_downcase | capture("[0-9](?[a-z])$") // {s: ""}).s as $rev | (capture("^(?[0-9]+(?:[.][0-9]+)*)(?.*)$") // {b: "", r: .}) as $m | [$m.b | scan("[0-9]+") | tonumber] as $core | ($m.r | ascii_downcase) as $rest | ($rest | capture("^[-._+]?(?dev|alpha|beta|preview|pre|rc)(?=[-._0-9]|$)") // {l: ""}).l as $lbl | $core + [range($core | length; 6) | 0] + [{"dev": 1, "alpha": 2, "beta": 3, "preview": 4, "pre": 4, "rc": 5}[$lbl] // 9] - + [$rest | scan("[0-9]+") | tonumber];' + + [$rest | scan("[0-9]+") | tonumber] + + [$rev | select(. != "") | (explode | .[0]) - 96];' _FORGE_JQ_VKEY="(${_FORGE_JQ_VKEY_DEF} (.tag_name // \"\") | _forge_vkey)" # Highest of the versions on stdin, on the same key as _FORGE_JQ_VKEY. diff --git a/tests/forge-version-key.sh b/tests/forge-version-key.sh index 97028de..ff5d921 100644 --- a/tests/forge-version-key.sh +++ b/tests/forge-version-key.sh @@ -61,6 +61,11 @@ suite() { check "$v: rc ranks above beta" "1.0.0-rc.1" "$(highest 1.0.0-beta38 1.0.0-rc.1)" check "$v: final ranks above rc" "1.0.0" "$(highest 1.0.0-rc.1 1.0.0)" check "$v: revision suffixes order by number" "v1.2.3-ls45" "$(highest v1.2.3-ls44 v1.2.3-ls45)" + check "$v: a trailing letter is a revision" "release-2026-07-14c" "$(highest release-2026-07-14c release-2026-07-14 release-2026-07-14b)" + check "$v: the letter does not outrank the next version" "release-2026-07-15" "$(highest release-2026-07-14c release-2026-07-15)" + check "$v: a label is not a revision letter" "1.0.0" "$(highest 1.0.0-beta 1.0.0)" + check "$v: an older letter release is behind the newer one" "no" "$(current release-2026-07-14b release-2026-07-14c)" + check "$v: a newer letter release is not downgraded" "yes" "$(current release-2026-07-14c release-2026-07-14b)" check "$v: 4.0.20.3014 is behind 5.0.0" "no" "$(current 4.0.20.3014 5.0.0)" check "$v: 5.0.0 is current" "yes" "$(current 5.0.0 4.0.20.3014)" check "$v: stable selection" "v5.0.0" "$(pick false)"