diff --git a/.mokogitea/workflows/version-set.yml b/.mokogitea/workflows/version-set.yml index 20afb6d..0bedeaa 100644 --- a/.mokogitea/workflows/version-set.yml +++ b/.mokogitea/workflows/version-set.yml @@ -1 +1,130 @@ -IyBDb3B5cmlnaHQgKEMpIDIwMjYgTW9rbyBDb25zdWx0aW5nIDxoZWxsb0Btb2tvY29uc3VsdGluZy50ZWNoPgojCiMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0zLjAtb3ItbGF0ZXIKIwojIEZJTEUgSU5GT1JNQVRJT04KIyBERUZHUk9VUDogR2l0ZWEuV29ya2Zsb3cuVGVtcGxhdGUKIyBJTkdST1VQOiBNb2tvU3RhbmRhcmRzLkNJCiMgUkVQTzogaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9UZW1wbGF0ZS1Kb29tbGEKIyBQQVRIOiAvLm1va29naXRlYS93b3JrZmxvd3MvdmVyc2lvbi1zZXQueW1sCiMgVkVSU0lPTjogMDEuMDAuMDAKIyBCUklFRjogU2V0IG9yIHJlc2V0IHRoZSBleHRlbnNpb24gdmVyc2lvbiBhY3Jvc3MgYWxsIHZlcnNpb24tYmVhcmluZyBmaWxlcwoKbmFtZTogIkpvb21sYTogU2V0IFZlcnNpb24iCgpvbjoKICB3b3JrZmxvd19kaXNwYXRjaDoKICAgIGlucHV0czoKICAgICAgdmVyc2lvbjoKICAgICAgICBkZXNjcmlwdGlvbjogIlZlcnNpb24gbnVtYmVyIChlLmcuIDAxLjAwLjAwKSIKICAgICAgICByZXF1aXJlZDogdHJ1ZQogICAgICAgIHR5cGU6IHN0cmluZwogICAgICBicmFuY2g6CiAgICAgICAgZGVzY3JpcHRpb246ICJCcmFuY2ggdG8gdXBkYXRlIChkZWZhdWx0OiBjdXJyZW50KSIKICAgICAgICByZXF1aXJlZDogZmFsc2UKICAgICAgICB0eXBlOiBzdHJpbmcKCnBlcm1pc3Npb25zOgogIGNvbnRlbnRzOiB3cml0ZQoKZW52OgogIEZPUkNFX0pBVkFTQ1JJUFRfQUNUSU9OU19UT19OT0RFMjQ6IHRydWUKCmpvYnM6CiAgc2V0LXZlcnNpb246CiAgICBuYW1lOiBTZXQgVmVyc2lvbiB0byAke3sgaW5wdXRzLnZlcnNpb24gfX0KICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKCiAgICBzdGVwczoKICAgICAgLSBuYW1lOiBWYWxpZGF0ZSB2ZXJzaW9uIGZvcm1hdAogICAgICAgIHJ1bjogfAogICAgICAgICAgVkVSU0lPTj0iJHt7IGlucHV0cy52ZXJzaW9uIH19IgogICAgICAgICAgaWYgISBlY2hvICIkVkVSU0lPTiIgfCBncmVwIC1xUCAnXlxkezJ9XC5cZHsyfVwuXGR7Mn0kJzsgdGhlbgogICAgICAgICAgICBlY2hvICI6OmVycm9yOjpJbnZhbGlkIHZlcnNpb24gZm9ybWF0ICcke1ZFUlNJT059JyDigJQgZXhwZWN0ZWQgWFguWVkuWlogKGUuZy4gMDEuMDAuMDApIgogICAgICAgICAgICBleGl0IDEKICAgICAgICAgIGZpCiAgICAgICAgICBlY2hvICJWRVJTSU9OPSR7VkVSU0lPTn0iID4+ICIkR0lUSFVCX0VOViIKCiAgICAgIC0gbmFtZTogQ2hlY2tvdXQKICAgICAgICB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgICAgd2l0aDoKICAgICAgICAgIHRva2VuOiAke3sgc2VjcmV0cy5NT0tPR0lURUFfVE9LRU4gfHwgZ2l0aHViLnRva2VuIH19CiAgICAgICAgICByZWY6ICR7eyBpbnB1dHMuYnJhbmNoIHx8IGdpdGh1Yi5yZWYgfX0KICAgICAgICAgIGZldGNoLWRlcHRoOiAxCgogICAgICAtIG5hbWU6IFVwZGF0ZSBtYW5pZmVzdCB2ZXJzaW9uCiAgICAgICAgcnVuOiB8CiAgICAgICAgICBNQU5JRkVTVD0iIgogICAgICAgICAgZm9yIFhNTF9GSUxFIGluICQoZmluZCAuIC1tYXhkZXB0aCAzIC1uYW1lICIqLnhtbCIgLW5vdCAtcGF0aCAiLi8uZ2l0LyoiIC1ub3QgLXBhdGggIi4vdmVuZG9yLyoiKTsgZG8KICAgICAgICAgICAgaWYgZ3JlcCAtcSAiPGV4dGVuc2lvbiIgIiRYTUxfRklMRSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBNQU5JRkVTVD0iJFhNTF9GSUxFIgogICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGZpCiAgICAgICAgICBkb25lCgogICAgICAgICAgaWYgWyAteiAiJE1BTklGRVNUIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIjo6d2FybmluZzo6Tm8gSm9vbWxhIGV4dGVuc2lvbiBtYW5pZmVzdCBmb3VuZCDigJQgc2tpcHBpbmcgbWFuaWZlc3QgdXBkYXRlIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBPTERfVkVSPSQoZ3JlcCAtb1AgJzx2ZXJzaW9uPlxLW148XSsnICIkTUFOSUZFU1QiIHwgaGVhZCAtMSkKICAgICAgICAgICAgc2VkIC1pICJzfDx2ZXJzaW9uPiR7T0xEX1ZFUn08L3ZlcnNpb24+fDx2ZXJzaW9uPiR7VkVSU0lPTn08L3ZlcnNpb24+fCIgIiRNQU5JRkVTVCIKICAgICAgICAgICAgZWNobyAiTWFuaWZlc3Q6ICR7T0xEX1ZFUn0g4oaSICR7VkVSU0lPTn0gKCR7TUFOSUZFU1R9KSIKICAgICAgICAgIGZpCgogICAgICAtIG5hbWU6IFVwZGF0ZSBSRUFETUUubWQgdmVyc2lvbgogICAgICAgIHJ1bjogfAogICAgICAgICAgaWYgWyAtZiAiUkVBRE1FLm1kIiBdOyB0aGVuCiAgICAgICAgICAgIGlmIGdyZXAgLXFQICdeXHMqVkVSU0lPTjpccypcZCcgUkVBRE1FLm1kOyB0aGVuCiAgICAgICAgICAgICAgc2VkIC1pIC1FICJzLyhWRVJTSU9OOlxzKilbMC05XXsyfVwuWzAtOV17Mn1cLlswLTldezJ9L1wxJHtWRVJTSU9OfS8iIFJFQURNRS5tZAogICAgICAgICAgICAgIGVjaG8gIlJFQURNRS5tZCB2ZXJzaW9uIHVwZGF0ZWQgdG8gJHtWRVJTSU9OfSIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGVjaG8gIjo6d2FybmluZzo6Tm8gVkVSU0lPTiBsaW5lIGZvdW5kIGluIFJFQURNRS5tZCDigJQgc2tpcHBpbmciCiAgICAgICAgICAgIGZpCiAgICAgICAgICBmaQoKICAgICAgLSBuYW1lOiBVcGRhdGUgQ0hBTkdFTE9HLm1kCiAgICAgICAgcnVuOiB8CiAgICAgICAgICBpZiBbIC1mICJDSEFOR0VMT0cubWQiIF07IHRoZW4KICAgICAgICAgICAgREFURT0kKGRhdGUgKyVZLSVtLSVkKQogICAgICAgICAgICAjIENoZWNrIGlmIHRoaXMgdmVyc2lvbiBhbHJlYWR5IGhhcyBhbiBlbnRyeQogICAgICAgICAgICBpZiBncmVwIC1xICJeXCNcIyBcWyR7VkVSU0lPTn1cXSIgQ0hBTkdFTE9HLm1kOyB0aGVuCiAgICAgICAgICAgICAgZWNobyAiQ0hBTkdFTE9HLm1kIGFscmVhZHkgaGFzIGVudHJ5IGZvciAke1ZFUlNJT059IOKAlCBza2lwcGluZyIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICMgSW5zZXJ0IG5ldyB2ZXJzaW9uIGVudHJ5IGFmdGVyIFtVbnJlbGVhc2VkXSBvciBhdCB0aGUgdG9wIGFmdGVyIGhlYWRlcgogICAgICAgICAgICAgIGlmIGdyZXAgLXEgJ15cI1wjIFxbVW5yZWxlYXNlZFxdJyBDSEFOR0VMT0cubWQ7IHRoZW4KICAgICAgICAgICAgICAgIHNlZCAtaSAiL15cI1wjIFxbVW5yZWxlYXNlZFxdL2FcXFxcbiMjIFske1ZFUlNJT059XSAtLS0gJHtEQVRFfSIgQ0hBTkdFTE9HLm1kCiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc2VkIC1pICIvXlwjIENoYW5nZWxvZy9hXFxcXG4jIyBbVW5yZWxlYXNlZF1cblxuIyMgWyR7VkVSU0lPTn1dIC0tLSAke0RBVEV9IiBDSEFOR0VMT0cubWQKICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgIGVjaG8gIkNIQU5HRUxPRy5tZDogYWRkZWQgZW50cnkgZm9yICR7VkVSU0lPTn0iCiAgICAgICAgICAgIGZpCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIjo6d2FybmluZzo6Tm8gQ0hBTkdFTE9HLm1kIGZvdW5kIOKAlCBza2lwcGluZyIKICAgICAgICAgIGZpCgogICAgICAtIG5hbWU6IFVwZGF0ZSBGSUxFIElORk9STUFUSU9OIGJsb2NrcwogICAgICAgIHJ1bjogfAogICAgICAgICAgIyBVcGRhdGUgVkVSU0lPTiBpbiBmaWxlIGhlYWRlciBibG9ja3MgKCMgVkVSU0lPTjogWFguWVkuWlopCiAgICAgICAgICBmaW5kIC4gLW1heGRlcHRoIDEgLXR5cGUgZiBcKCAtbmFtZSAiKi55bWwiIC1vIC1uYW1lICIqLnlhbWwiIC1vIC1uYW1lICIqLnBocCIgLW8gLW5hbWUgIioubWQiIFwpIFwKICAgICAgICAgICAgLW5vdCAtcGF0aCAiLi8uZ2l0LyoiIC1ub3QgLXBhdGggIi4vdmVuZG9yLyoiIC1wcmludDAgMj4vZGV2L251bGwgfCBcCiAgICAgICAgICB3aGlsZSBJRlM9IHJlYWQgLXIgLWQgJycgRklMRTsgZG8KICAgICAgICAgICAgaWYgaGVhZCAtMjAgIiRGSUxFIiB8IGdyZXAgLXFQICdeXHMqIz9ccypWRVJTSU9OOlxzKlxkezJ9XC5cZHsyfVwuXGR7Mn0nOyB0aGVuCiAgICAgICAgICAgICAgc2VkIC1pIC1FICJzLygjP1xzKlZFUlNJT046XHMqKVswLTldezJ9XC5bMC05XXsyfVwuWzAtOV17Mn0vXDEke1ZFUlNJT059LyIgIiRGSUxFIgogICAgICAgICAgICAgIGVjaG8gIlVwZGF0ZWQgRklMRSBJTkZPUk1BVElPTiBWRVJTSU9OIGluICR7RklMRX0iCiAgICAgICAgICAgIGZpCiAgICAgICAgICBkb25lCgogICAgICAtIG5hbWU6IENvbW1pdCBhbmQgcHVzaAogICAgICAgIHJ1bjogfAogICAgICAgICAgZ2l0IGNvbmZpZyB1c2VyLm5hbWUgIk1va28gQ29uc3VsdGluZyBbYm90XSIKICAgICAgICAgIGdpdCBjb25maWcgdXNlci5lbWFpbCAiaGVsbG9AbW9rb2NvbnN1bHRpbmcudGVjaCIKICAgICAgICAgIGdpdCBhZGQgLUEKICAgICAgICAgIGlmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQ7IHRoZW4KICAgICAgICAgICAgZWNobyAiTm8gdmVyc2lvbiBjaGFuZ2VzIGRldGVjdGVkIOKAlCBub3RoaW5nIHRvIGNvbW1pdCIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZ2l0IGNvbW1pdCAtbSAiY2hvcmU6IHNldCB2ZXJzaW9uIHRvICR7VkVSU0lPTn0gW3NraXAgYnVtcF0KCkF1dGhvcmVkLWJ5OiBNb2tvIENvbnN1bHRpbmciCiAgICAgICAgICAgIGdpdCBwdXNoCiAgICAgICAgICAgIGVjaG8gIiMjIyBWZXJzaW9uIFNldCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlkKICAgICAgICAgICAgZWNobyAiVmVyc2lvbiB1cGRhdGVkIHRvIFxgJHtWRVJTSU9OfVxgIG9uIGJyYW5jaCBcYCR7R0lUSFVCX1JFRl9OQU1FfVxgIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWQogICAgICAgICAgZmkK \ No newline at end of file +# Copyright (C) 2026 Moko Consulting +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# FILE INFORMATION +# DEFGROUP: Gitea.Workflow.Template +# INGROUP: MokoStandards.CI +# REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla +# PATH: /.mokogitea/workflows/version-set.yml +# VERSION: 01.00.00 +# BRIEF: Set or reset the extension version across all version-bearing files + +name: "Joomla: Set Version" + +on: + workflow_dispatch: + inputs: + version: + description: "Version number (e.g. 01.00.00)" + required: true + type: string + branch: + description: "Branch to update (default: current)" + required: false + type: string + +permissions: + contents: write + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + set-version: + name: Set Version to ${{ inputs.version }} + runs-on: ubuntu-latest + + steps: + - name: Validate version format + run: | + VERSION="${{ inputs.version }}" + if ! echo "$VERSION" | grep -qP '^\d{2}\.\d{2}\.\d{2}$'; then + echo "::error::Invalid version format '${VERSION}' — expected XX.YY.ZZ (e.g. 01.00.00)" + exit 1 + fi + echo "VERSION=${VERSION}" >> "$GITHUB_ENV" + + - name: Checkout + uses: actions/checkout@v4 + with: + token: ${{ secrets.MOKOGITEA_TOKEN || github.token }} + ref: ${{ inputs.branch || github.ref }} + fetch-depth: 1 + + - name: Update manifest version + run: | + MANIFEST="" + for XML_FILE in $(find . -maxdepth 3 -name "*.xml" -not -path "./.git/*" -not -path "./vendor/*"); do + if grep -q "/dev/null; then + MANIFEST="$XML_FILE" + break + fi + done + + if [ -z "$MANIFEST" ]; then + echo "::warning::No Joomla extension manifest found — skipping manifest update" + else + OLD_VER=$(grep -oP '\K[^<]+' "$MANIFEST" | head -1) + sed -i "s|${OLD_VER}|${VERSION}|" "$MANIFEST" + echo "Manifest: ${OLD_VER} → ${VERSION} (${MANIFEST})" + fi + + - name: Update README.md version + run: | + if [ -f "README.md" ]; then + if grep -qP '^\s*VERSION:\s*\d' README.md; then + sed -i -E "s/(VERSION:\s*)[0-9]{2}\.[0-9]{2}\.[0-9]{2}/\1${VERSION}/" README.md + echo "README.md version updated to ${VERSION}" + else + echo "::warning::No VERSION line found in README.md — skipping" + fi + fi + + - name: Update CHANGELOG.md + run: | + if [ -f "CHANGELOG.md" ]; then + DATE=$(date +%Y-%m-%d) + # Check if this version already has an entry + if grep -q "^\#\# \[${VERSION}\]" CHANGELOG.md; then + echo "CHANGELOG.md already has entry for ${VERSION} — skipping" + else + # Insert new version entry after [Unreleased] or at the top after header + if grep -q '^\#\# \[Unreleased\]' CHANGELOG.md; then + sed -i "/^\#\# \[Unreleased\]/a\\\\n## [${VERSION}] --- ${DATE}" CHANGELOG.md + else + sed -i "/^\# Changelog/a\\\\n## [Unreleased]\n\n## [${VERSION}] --- ${DATE}" CHANGELOG.md + fi + echo "CHANGELOG.md: added entry for ${VERSION}" + fi + else + echo "::warning::No CHANGELOG.md found — skipping" + fi + + - name: Update FILE INFORMATION blocks + run: | + # Update VERSION in file header blocks (# VERSION: XX.YY.ZZ) + find . -maxdepth 1 -type f \( -name "*.yml" -o -name "*.yaml" -o -name "*.php" -o -name "*.md" \) \ + -not -path "./.git/*" -not -path "./vendor/*" -print0 2>/dev/null | \ + while IFS= read -r -d '' FILE; do + if head -20 "$FILE" | grep -qP '^\s*#?\s*VERSION:\s*\d{2}\.\d{2}\.\d{2}'; then + sed -i -E "s/(#?\s*VERSION:\s*)[0-9]{2}\.[0-9]{2}\.[0-9]{2}/\1${VERSION}/" "$FILE" + echo "Updated FILE INFORMATION VERSION in ${FILE}" + fi + done + + - name: Commit and push + run: | + git config user.name "Moko Consulting [bot]" + git config user.email "hello@mokoconsulting.tech" + git add -A + if git diff --cached --quiet; then + echo "No version changes detected — nothing to commit" + else + git commit -m "chore: set version to ${VERSION} [skip bump] + +Authored-by: Moko Consulting" + git push + echo "### Version Set" >> $GITHUB_STEP_SUMMARY + echo "Version updated to \`${VERSION}\` on branch \`${GITHUB_REF_NAME}\`" >> $GITHUB_STEP_SUMMARY + fi