|
| 1 | +#!/bin/bash |
| 2 | +set -e |
| 3 | + |
| 4 | +releases=${RELEASES_JSON:-$(curl -sSL "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases?per_page=100")} |
| 5 | +current_release=${LATEST_JSON:-$(curl -sSL "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/latest" | jq -r .tag_name)} |
| 6 | + |
| 7 | +if [[ "$GITHUB_BASE_REF" == "main" ]]; then |
| 8 | + latest_prerelease=$(echo "$releases" | jq -r '.[] | select(.prerelease) | .tag_name' | head -n 1) |
| 9 | + latest_prerelease_beta_number=$(echo "$latest_prerelease" | cut -d"." -f4,4 | grep -o '[0-9]\+' || true) |
| 10 | + latest_prerelease_minor_version=$(echo "$latest_prerelease" | cut -d'.' -f2,2) |
| 11 | + |
| 12 | + next_prerelease=$(grep -E 'current-version:\s*' project.yml | awk '{print $2}') |
| 13 | + next_prerelease_minor_version=$(echo "$next_prerelease" | cut -d"." -f2,2) |
| 14 | + next_prerelease_patch_version=$(echo "$next_prerelease" | cut -d"." -f3,3) |
| 15 | + next_prerelease_beta_number=$(echo "$next_prerelease" | cut -d"." -f4,4 | grep -o '[0-9]\+' || true) |
| 16 | + prerelease_minor_version_bump=false |
| 17 | + |
| 18 | + current_release_minor_version=$(echo "$current_release" | cut -d"." -f2,2) |
| 19 | + |
| 20 | + # Determine minor version bump (e.g., 1.6.0.Beta21 → 1.7.0.Beta1) |
| 21 | + if [[ "$next_prerelease_beta_number" == 1 ]]; then |
| 22 | + # Ensure patch version is zero when starting a new minor development cycle |
| 23 | + if [[ "$next_prerelease_patch_version" != 0 ]]; then |
| 24 | + echo "Error: pre-release patch version must be 0 when starting new minor version" |
| 25 | + exit 1; |
| 26 | + fi |
| 27 | + |
| 28 | + if [[ "$next_prerelease_minor_version" -eq $(("$latest_prerelease_minor_version" + 1)) ]]; then |
| 29 | + echo "Starting new minor development cycle after unreleased prerelease" |
| 30 | + prerelease_minor_version_bump=true |
| 31 | + elif [[ "$next_prerelease_minor_version" -eq $(("$current_release_minor_version" + 1)) ]]; then |
| 32 | + echo "Starting new minor development cycle after released version" |
| 33 | + prerelease_minor_version_bump=true |
| 34 | + else |
| 35 | + echo "Error: cannot skip minor versions. Must be based on latest prerelease or release" |
| 36 | + exit 1; |
| 37 | + fi |
| 38 | + elif [[ "$next_prerelease_beta_number" == 0 ]]; then |
| 39 | + echo "Error: pre-release beta number cannot be 0, it must be 1 or higher" |
| 40 | + exit 1; |
| 41 | + else |
| 42 | + # Regular pre-release continuation |
| 43 | + if [[ "$next_prerelease_minor_version" != "$current_release_minor_version" && "$next_prerelease_minor_version" != $(("$current_release_minor_version" + 1)) ]]; then |
| 44 | + echo "Error: pre-release minor version must match current or be next" |
| 45 | + exit 1; |
| 46 | + fi |
| 47 | + fi |
| 48 | + |
| 49 | + |
| 50 | + if [[ "$next_prerelease_patch_version" != 0 || -z "$next_prerelease_beta_number" ]]; then |
| 51 | + echo "Error: new releases are not allowed from development branch, use .Beta\\D+ qualifier" |
| 52 | + exit 1; |
| 53 | + fi |
| 54 | + |
| 55 | + if (! "$prerelease_minor_version_bump") && [[ ("$next_prerelease_beta_number" != $(("$latest_prerelease_beta_number" + 1))) ]]; then |
| 56 | + echo "Error: pre-release version should go one by one as sequence" |
| 57 | + correct_version=$(echo "$latest_prerelease" | cut -d"." -f1,2,3) |
| 58 | + correct_prerelease_number=$(("$latest_prerelease_beta_number" + 1)) |
| 59 | + echo "After" $latest_prerelease "should go "$correct_version".Beta"$correct_prerelease_number |
| 60 | + exit 1; |
| 61 | + fi |
| 62 | + |
| 63 | + project_current_base=$(echo "$next_prerelease" | grep -oP '^.*Beta') |
| 64 | + project_next_version=$(grep -E 'next-version:\s*' project.yml | awk '{print $2}') |
| 65 | + project_next_base=$(echo "$project_next_version" | grep -oP '^.*Beta') |
| 66 | + |
| 67 | + project_current_beta_number="$next_prerelease_beta_number" |
| 68 | + project_next_beta_number=$(echo "$project_next_version" | grep -oP 'Beta\K[0-9]+') |
| 69 | + |
| 70 | + if [[ "$project_current_base" != "$project_next_base" ]] || [[ $(("$project_current_beta_number" + 1)) != "$project_next_beta_number" ]]; then |
| 71 | + echo "Error: the next-version in project.yaml is not valid. Next pre-release Beta version must be one upper that current" |
| 72 | + exit 1; |
| 73 | + fi |
| 74 | + |
| 75 | +else |
| 76 | + expected_release_version=$(echo "$GITHUB_BASE_REF" | sed 's/z/0/') |
| 77 | + |
| 78 | + first_release_tag_exists=$(echo "$releases" | jq -r '.[] | .tag_name' | grep "^$expected_release_version$" || true) |
| 79 | + next_release=$(grep -E 'current-version:\s*' project.yml | awk '{print $2}') |
| 80 | + |
| 81 | + if [ -z "$first_release_tag_exists" ]; then |
| 82 | + if [[ "$next_release" != "$expected_release_version" ]]; then |
| 83 | + echo "Error: wrong tag name for the first release in new branch" |
| 84 | + exit 1; |
| 85 | + else |
| 86 | + exit 0; |
| 87 | + fi |
| 88 | + fi |
| 89 | + |
| 90 | + branch_version=$(echo "$GITHUB_BASE_REF" | cut -d. -f1,2) |
| 91 | + latest_branch_tag_patch_version=$(echo "$releases" | jq -r --arg version "$branch_version" ' |
| 92 | + .[] |
| 93 | + | select(.tag_name | contains($version)) |
| 94 | + | .tag_name' | grep -v "Beta" | head -1 | cut -d. -f3) |
| 95 | + |
| 96 | + branch_minor_version=$(echo "$GITHUB_BASE_REF" | cut -d. -f2,2) |
| 97 | + next_release_minor_version=$(echo "$next_release" | cut -d"." -f2,2) |
| 98 | + next_release_patch_version=$(echo "$next_release" | cut -d"." -f3,3) |
| 99 | + beta_tag_exists=$(echo "$next_release" | cut -d"." -f4,4 || true) |
| 100 | + |
| 101 | + if [ -n "$beta_tag_exists" ]; then |
| 102 | + echo "Error: releases cannot consist any qualifier after version" |
| 103 | + exit 1; |
| 104 | + fi |
| 105 | + |
| 106 | + if [[ "$branch_minor_version" != "$next_release_minor_version" ]]; then |
| 107 | + echo "Error: minor versions cannot be changed" |
| 108 | + exit 1; |
| 109 | + fi |
| 110 | + |
| 111 | + if [[ $(("$latest_branch_tag_patch_version" + 1)) != "$next_release_patch_version" ]]; then |
| 112 | + echo "Error: release patch versions should be bumped one by one as sequence" |
| 113 | + exit 1; |
| 114 | + fi |
| 115 | + |
| 116 | + project_next_version=$(grep -E 'next-version:\s*' project.yml | awk '{print $2}') |
| 117 | + project_next_base=$(echo "$project_next_version" | cut -d"." -f1,2) |
| 118 | + |
| 119 | + project_current_patch_version="$next_release_patch_version" |
| 120 | + project_next_patch_version=$(echo "$project_next_version" | awk -F. '{print $3}') |
| 121 | + |
| 122 | + if [[ "$branch_version" != "$project_next_base" ]] || [[ $(("$project_current_patch_version" + 1)) != "$project_next_patch_version" ]]; then |
| 123 | + echo "Error: the next-version in project.yaml is not valid. Patch version of the next release must be one upper than the latest" |
| 124 | + exit 1; |
| 125 | + fi |
| 126 | +fi |
| 127 | + |
0 commit comments