From 989f2a87a3ef2f12ee5b01da1d1374e1dbf0f721 Mon Sep 17 00:00:00 2001 From: MickLesk <47820557+MickLesk@users.noreply.github.com> Date: Fri, 13 Nov 2026 12:39:51 +0100 Subject: [PATCH 1/2] Rank a trailing letter as a revision in the version key release-2026-07-14, -14a, -14b and -14c (DokuWiki) all got the same key, so a sort of the release list picked whichever came last, and a check against an older letter release could offer a downgrade. A single letter right after the last digit now ranks after the same version without it. --- lib/forge.func | 8 ++++++-- tests/forge-version-key.sh | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/forge.func b/lib/forge.func index 5cb09959..d6dc8d92 100644 --- a/lib/forge.func +++ b/lib/forge.func @@ -1306,16 +1306,20 @@ _forge_descriptor() { # on beta38 never saw the rc. The numeric core is now padded to one width and # followed by a rank for the pre-release label (dev < alpha < beta < pre < rc # < none), then the digits that follow it. Any other suffix ranks as a final -# release, so -ls45 or -1 revisions still order by their number. +# release, so -ls45 or -1 revisions still order by their number. A single +# letter right after the last digit is a revision too: release-2026-07-14c +# (DokuWiki) or 1.1.1w (OpenSSL) rank above the same version without it. _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 97028de0..ff5d9217 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)" From 859d91d7a30ec989a79dae08ed7f729f888b56f9 Mon Sep 17 00:00:00 2001 From: MickLesk <47820557+MickLesk@users.noreply.github.com> Date: Fri, 13 Nov 2026 15:40:21 +0100 Subject: [PATCH 2/2] Trim the comments to what a reader would get wrong --- lib/forge.func | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/forge.func b/lib/forge.func index d6dc8d92..4a1f709b 100644 --- a/lib/forge.func +++ b/lib/forge.func @@ -1306,9 +1306,7 @@ _forge_descriptor() { # on beta38 never saw the rc. The numeric core is now padded to one width and # followed by a rank for the pre-release label (dev < alpha < beta < pre < rc # < none), then the digits that follow it. Any other suffix ranks as a final -# release, so -ls45 or -1 revisions still order by their number. A single -# letter right after the last digit is a revision too: release-2026-07-14c -# (DokuWiki) or 1.1.1w (OpenSSL) rank above the same version without it. +# 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