@@ -13,7 +13,7 @@ if [ "$patch" -gt 0 ]; then
1313 exit 0
1414fi
1515
16- # Function to paginate and collect refs for a prefix
16+ # Function to paginate and collect refs for a prefix (narrow prefixes only)
1717fetch_matching_refs () {
1818 local prefix=" $1 "
1919 local temp_file
@@ -43,24 +43,61 @@ fetch_matching_refs() {
4343 echo " $temp_file "
4444}
4545
46- # Fetch for each prefix
47- version_v_file=$( fetch_matching_refs " Version-v" )
48- release_file=$( fetch_matching_refs " release/" )
46+ # Try immediate previous minor within the same major by direct branch existence checks
47+ major=" ${semver%% .* } "
48+ rest_minor_patch=" ${semver#* .} "
49+ minor=" ${rest_minor_patch%% .* } "
4950
50- # Combine and process: extract {name, semver} for matches, sort desc by semver
51- jq -s ' add | [ .[] | .ref | ltrimstr("refs/heads/") as $name | select($name | test("^Version-v[0-9]+\\.[0-9]+\\.[0-9]+$") or test("^release/[0-9]+\\.[0-9]+\\.[0-9]+$")) | {name: $name, semver: (if $name | test("^Version-v") then $name | ltrimstr("Version-v") else $name | ltrimstr("release/") end) } ] | sort_by( .semver | split(".") | map(tonumber) ) | reverse' " $version_v_file " " $release_file " > all_versions.json
51+ if ! [[ " $major " =~ ^[0-9]+$ && " $minor " =~ ^[0-9]+$ ]]; then
52+ echo " Error: Unable to parse major/minor from semver: $semver " >&2
53+ exit 1
54+ fi
55+
56+ if [ " $minor " -gt 0 ]; then
57+ cand_minor=$(( minor - 1 ))
58+ while [ " $cand_minor " -ge 0 ]; do
59+ candidate=" release/${major} .${cand_minor} .0"
60+ echo " Checking for branch: ${candidate} " >&2
61+ http_code=$( curl -s -o /dev/null -w " %{http_code}" \
62+ -H " Authorization: token $GITHUB_TOKEN " \
63+ -H " Accept: application/vnd.github.v3+json" \
64+ " https://api.github.com/repos/${GITHUB_REPOSITORY} /branches/${candidate} " )
65+ if [ " $http_code " = " 200" ]; then
66+ echo " Found previous non-hotfix branch: ${candidate} " >&2
67+ echo " previous_ref=${candidate} " >> " $GITHUB_OUTPUT "
68+ exit 0
69+ fi
70+ cand_minor=$(( cand_minor - 1 ))
71+ done
72+ fi
73+
74+ # Fallback: move to previous major and select highest non-hotfix (patch==0)
75+ prev_major=$(( major - 1 ))
76+ if [ " $prev_major " -lt 0 ]; then
77+ echo " Error: No previous major available for semver: $semver " >&2
78+ exit 1
79+ fi
80+
81+ release_file=$( fetch_matching_refs " release/${prev_major} ." )
5282
53- # Filter to those with semver strictly lower than current and non-hotfix (patch==0)
54- jq --arg semver " $semver " ' [ .[] | select( .semver as $v | $semver | split(".") as $c | $v | split(".") as $p | ( ($p[0] | tonumber) < ($c[0] | tonumber) or (($p[0] | tonumber) == ($c[0] | tonumber) and (($p[1] | tonumber) < ($c[1] | tonumber) or (($p[1] | tonumber) == ($c[1] | tonumber) and ($p[2] | tonumber) < ($c[2] | tonumber)))) ) and (($p[2] | tonumber) == 0) ) ]' all_versions.json > filtered_versions.json
83+ # From the fetched list for the previous major, keep only patch==0 branches and pick the highest
84+ jq -s ' [ (add // [])
85+ | .[]
86+ | .ref
87+ | ltrimstr("refs/heads/") as $name
88+ | select($name | test("^release/[0-9]+\\.[0-9]+\\.[0-9]+$"))
89+ | { name: $name, semver: ($name | ltrimstr("release/")) }
90+ ]
91+ | map(select(.semver | split(".")[2] == "0"))
92+ | sort_by( .semver | split(".") | map(tonumber) )
93+ | reverse' " $release_file " > filtered_versions.json
5594
56- # Select the highest lower: first in filtered list. If none found, fail.
5795if [ " $( jq length filtered_versions.json) " -eq 0 ]; then
58- echo " Error: No lower non-hotfix versions found; cannot determine previous-version-ref." >&2
59- echo " This likely indicates a missing prior minor release branch (e.g., Version-vX.(Y-1).0 or release/X.(Y-1).0)." >&2
96+ echo " Error: No non-hotfix branches found for previous major ${prev_major} ." >&2
6097 exit 1
6198else
62- highest_lower =" $( jq -r ' .[0].semver' filtered_versions.json) "
99+ selected_semver =" $( jq -r ' .[0].semver' filtered_versions.json) "
63100 previous_ref=" $( jq -r ' .[0].name' filtered_versions.json) "
64- echo " Selected highest lower non-hotfix version : ${highest_lower } (branch: ${previous_ref} )"
101+ echo " Selected previous major highest non-hotfix: ${selected_semver } (branch: ${previous_ref} )"
65102 echo " previous_ref=${previous_ref} " >> " $GITHUB_OUTPUT "
66103fi
0 commit comments