|
| 1 | +#!/usr/bin/env bash |
| 2 | +# |
| 3 | +# Verify that plugin release metadata is internally consistent. |
| 4 | +# |
| 5 | +# Usage: |
| 6 | +# verify-release-metadata.sh <plugin-dir> # Check version consistency. |
| 7 | +# verify-release-metadata.sh <plugin-dir> <expected-version> # Also verify changelog entry. |
| 8 | + |
| 9 | +set -euo pipefail |
| 10 | + |
| 11 | +fail() { |
| 12 | + echo "::error::$1" |
| 13 | + exit 1 |
| 14 | +} |
| 15 | + |
| 16 | +PLUGIN_DIR="${1:?Usage: verify-release-metadata.sh <plugin-dir> [<expected-version>]}" |
| 17 | +EXPECTED_VERSION="${2:-}" |
| 18 | + |
| 19 | +# Extract versions from the three source-of-truth files. |
| 20 | +PLUGIN_VERSION="$(sed -n 's/^ \* Version: \(.*\)$/\1/p' "$PLUGIN_DIR/load.php" | head -n 1 | tr -d '\r')" |
| 21 | +STABLE_TAG="$(sed -n 's/^Stable tag:[[:space:]]*//p' "$PLUGIN_DIR/readme.txt" | head -n 1 | tr -d '\r')" |
| 22 | +CONSTANT_VERSION="$(php -r "require '$PLUGIN_DIR/wp-includes/database/version.php'; echo SQLITE_DRIVER_VERSION;")" |
| 23 | + |
| 24 | +[ -n "$PLUGIN_VERSION" ] || fail "Could not extract the plugin version from load.php." |
| 25 | +[ -n "$STABLE_TAG" ] || fail "Could not extract the Stable tag from readme.txt." |
| 26 | +[ -n "$CONSTANT_VERSION" ] || fail "Could not extract SQLITE_DRIVER_VERSION from version.php." |
| 27 | + |
| 28 | +# All three must agree. |
| 29 | +[ "$PLUGIN_VERSION" = "$CONSTANT_VERSION" ] || fail "Version mismatch: load.php=$PLUGIN_VERSION, version.php=$CONSTANT_VERSION." |
| 30 | +[ "$PLUGIN_VERSION" = "$STABLE_TAG" ] || fail "Version mismatch: load.php=$PLUGIN_VERSION, readme.txt Stable tag=$STABLE_TAG." |
| 31 | + |
| 32 | +# When an expected version is given, also verify it matches and that |
| 33 | +# the changelog contains a non-empty entry for that version. |
| 34 | +if [ -n "$EXPECTED_VERSION" ]; then |
| 35 | + [ "$PLUGIN_VERSION" = "$EXPECTED_VERSION" ] || fail "Version mismatch: expected $EXPECTED_VERSION, found $PLUGIN_VERSION." |
| 36 | + |
| 37 | + grep -Fxq '== Changelog ==' "$PLUGIN_DIR/readme.txt" \ |
| 38 | + || fail "readme.txt is missing a == Changelog == section." |
| 39 | + |
| 40 | + if ! awk -v version="$EXPECTED_VERSION" ' |
| 41 | + BEGIN { in_changelog = 0; in_entry = 0; has_content = 0 } |
| 42 | + $0 == "== Changelog ==" { in_changelog = 1; next } |
| 43 | + in_changelog && $0 == "= " version " =" { in_entry = 1; next } |
| 44 | + in_entry && $0 ~ /^= / { exit has_content ? 0 : 1 } |
| 45 | + in_entry && $0 !~ /^[[:space:]]*$/ { has_content = 1 } |
| 46 | + END { if (!in_changelog || !in_entry || !has_content) exit 1 } |
| 47 | + ' "$PLUGIN_DIR/readme.txt"; then |
| 48 | + fail "readme.txt must contain a changelog entry with content for version $EXPECTED_VERSION." |
| 49 | + fi |
| 50 | +fi |
| 51 | + |
| 52 | +echo "Verified release metadata for version $PLUGIN_VERSION." |
0 commit comments