From 13aa1a1e18b95a010b767704af822e717e7c4ded Mon Sep 17 00:00:00 2001 From: Hans Kokx Date: Wed, 13 May 2026 13:00:16 +0200 Subject: [PATCH] Enhance version validation in CI workflow to handle first release scenarios Signed-off-by: Hans Kokx --- .gitea/workflows/ci.yml | 91 +++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 079fee6..e5e02a5 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -108,53 +108,68 @@ jobs: git fetch origin "${GITHUB_BASE_REF}" --depth=1 PR_VERSION="$(sed -nE 's/^version:\s*([^[:space:]]+)\s*$/\1/p' pubspec.yaml | head -n1)" - BASE_VERSION="$(git show "origin/${GITHUB_BASE_REF}:pubspec.yaml" | sed -nE 's/^version:\s*([^[:space:]]+)\s*$/\1/p' | head -n1)" + BASE_HAS_PUBSPEC="false" + BASE_VERSION="" - if [ -z "$PR_VERSION" ] || [ -z "$BASE_VERSION" ]; then - echo "Unable to read versions from pubspec.yaml." + if git cat-file -e "origin/${GITHUB_BASE_REF}:pubspec.yaml" 2>/dev/null; then + BASE_HAS_PUBSPEC="true" + BASE_VERSION="$(git show "origin/${GITHUB_BASE_REF}:pubspec.yaml" | sed -nE 's/^version:\s*([^[:space:]]+)\s*$/\1/p' | head -n1)" + fi + + if [ -z "$PR_VERSION" ]; then + echo "Unable to read version from PR pubspec.yaml." exit 1 fi - parse_semver_core() { - printf '%s' "$1" | sed -E 's/^([0-9]+\.[0-9]+\.[0-9]+).*/\1/' - } + if [ "$BASE_HAS_PUBSPEC" = "true" ]; then + if [ -z "$BASE_VERSION" ]; then + echo "Unable to read version from base branch pubspec.yaml." + exit 1 + fi - BASE_CORE="$(parse_semver_core "$BASE_VERSION")" - PR_CORE="$(parse_semver_core "$PR_VERSION")" + parse_semver_core() { + printf '%s' "$1" | sed -E 's/^([0-9]+\.[0-9]+\.[0-9]+).*/\1/' + } - if ! printf '%s' "$BASE_CORE" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then - echo "Base version is not valid semver: $BASE_VERSION" - exit 1 - fi + BASE_CORE="$(parse_semver_core "$BASE_VERSION")" + PR_CORE="$(parse_semver_core "$PR_VERSION")" - if ! printf '%s' "$PR_CORE" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then - echo "PR version is not valid semver: $PR_VERSION" - exit 1 - fi + if ! printf '%s' "$BASE_CORE" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then + echo "Base version is not valid semver: $BASE_VERSION" + exit 1 + fi - BASE_MAJOR="${BASE_CORE%%.*}" - BASE_REST="${BASE_CORE#*.}" - BASE_MINOR="${BASE_REST%%.*}" - BASE_PATCH="${BASE_REST#*.}" + if ! printf '%s' "$PR_CORE" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then + echo "PR version is not valid semver: $PR_VERSION" + exit 1 + fi - PR_MAJOR="${PR_CORE%%.*}" - PR_REST="${PR_CORE#*.}" - PR_MINOR="${PR_REST%%.*}" - PR_PATCH="${PR_REST#*.}" + BASE_MAJOR="${BASE_CORE%%.*}" + BASE_REST="${BASE_CORE#*.}" + BASE_MINOR="${BASE_REST%%.*}" + BASE_PATCH="${BASE_REST#*.}" - if [ "$PR_MAJOR" -lt "$BASE_MAJOR" ]; then - echo "pubspec.yaml version must be greater than base version ($BASE_VERSION -> $PR_VERSION)." - exit 1 - fi + PR_MAJOR="${PR_CORE%%.*}" + PR_REST="${PR_CORE#*.}" + PR_MINOR="${PR_REST%%.*}" + PR_PATCH="${PR_REST#*.}" - if [ "$PR_MAJOR" -eq "$BASE_MAJOR" ] && [ "$PR_MINOR" -lt "$BASE_MINOR" ]; then - echo "pubspec.yaml version must be greater than base version ($BASE_VERSION -> $PR_VERSION)." - exit 1 - fi + if [ "$PR_MAJOR" -lt "$BASE_MAJOR" ]; then + echo "pubspec.yaml version must be greater than base version ($BASE_VERSION -> $PR_VERSION)." + exit 1 + fi - if [ "$PR_MAJOR" -eq "$BASE_MAJOR" ] && [ "$PR_MINOR" -eq "$BASE_MINOR" ] && [ "$PR_PATCH" -le "$BASE_PATCH" ]; then - echo "pubspec.yaml version must be at least 0.0.1 greater than base version ($BASE_VERSION -> $PR_VERSION)." - exit 1 + if [ "$PR_MAJOR" -eq "$BASE_MAJOR" ] && [ "$PR_MINOR" -lt "$BASE_MINOR" ]; then + echo "pubspec.yaml version must be greater than base version ($BASE_VERSION -> $PR_VERSION)." + exit 1 + fi + + if [ "$PR_MAJOR" -eq "$BASE_MAJOR" ] && [ "$PR_MINOR" -eq "$BASE_MINOR" ] && [ "$PR_PATCH" -le "$BASE_PATCH" ]; then + echo "pubspec.yaml version must be at least 0.0.1 greater than base version ($BASE_VERSION -> $PR_VERSION)." + exit 1 + fi + else + echo "Base branch has no pubspec.yaml; treating this as first release." fi if git diff --quiet "origin/${GITHUB_BASE_REF}...HEAD" -- CHANGELOG.md; then @@ -167,7 +182,11 @@ jobs: exit 1 fi - echo "Version/changelog gate passed: $BASE_VERSION -> $PR_VERSION" + if [ "$BASE_HAS_PUBSPEC" = "true" ]; then + echo "Version/changelog gate passed: $BASE_VERSION -> $PR_VERSION" + else + echo "Version/changelog gate passed for first release: $PR_VERSION" + fi publish: name: publish