From c786530c3eed7bc83961b6209ef145590fb7a2a9 Mon Sep 17 00:00:00 2001 From: Damien Retzinger Date: Thu, 7 May 2026 09:26:08 -0400 Subject: [PATCH] test(get-magento-version): document and pin what happens in various kinds of installs --- .../_internal-get-magento-version.yaml | 23 +++++++- get-magento-version/action.yml | 17 +----- get-magento-version/fixtures/empty/.gitkeep | 0 .../fixtures/enterprise/composer.lock | 9 +++ .../fixtures/extension/composer.json | 5 ++ .../fixtures/mage-os/composer.lock | 9 +++ .../fixtures/store-json/composer.json | 5 ++ .../fixtures/store-lock/composer.lock | 9 +++ .../fixtures/store-v-prefix/composer.lock | 9 +++ get-magento-version/get-magento-version.sh | 20 +++++++ get-magento-version/test.sh | 55 +++++++++++++++++++ 11 files changed, 144 insertions(+), 17 deletions(-) create mode 100644 get-magento-version/fixtures/empty/.gitkeep create mode 100644 get-magento-version/fixtures/enterprise/composer.lock create mode 100644 get-magento-version/fixtures/extension/composer.json create mode 100644 get-magento-version/fixtures/mage-os/composer.lock create mode 100644 get-magento-version/fixtures/store-json/composer.json create mode 100644 get-magento-version/fixtures/store-lock/composer.lock create mode 100644 get-magento-version/fixtures/store-v-prefix/composer.lock create mode 100644 get-magento-version/get-magento-version.sh create mode 100644 get-magento-version/test.sh diff --git a/.github/workflows/_internal-get-magento-version.yaml b/.github/workflows/_internal-get-magento-version.yaml index 615f063..05dfeab 100644 --- a/.github/workflows/_internal-get-magento-version.yaml +++ b/.github/workflows/_internal-get-magento-version.yaml @@ -46,4 +46,25 @@ jobs: if: steps.magento-version.outputs.project != 'magento/project-community-edition' shell: bash run: echo "${{ steps.magento-version.outputs.project }}" && exit 1 - \ No newline at end of file + + get-magento-version-extension: + if: "!startsWith(github.head_ref, 'release-please')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Create mock extension composer.json + shell: bash + run: | + mkdir -p /tmp/test-extension + echo '{"name":"vendor/module","type":"magento2-module","require":{}}' > /tmp/test-extension/composer.json + + - uses: ./get-magento-version + id: ext-version + with: + working-directory: /tmp/test-extension + + - name: Fail if project is not empty + if: steps.ext-version.outputs.project != '' + shell: bash + run: echo "Expected empty project, got '${{ steps.ext-version.outputs.project }}'" && exit 1 diff --git a/get-magento-version/action.yml b/get-magento-version/action.yml index fb2b7af..2ad1e52 100644 --- a/get-magento-version/action.yml +++ b/get-magento-version/action.yml @@ -22,22 +22,7 @@ runs: - name: Compute Installed Magento version id: get-magento-version shell: bash - working-directory: ${{ inputs.working-directory }} - run: | - PATTERN="magento/product-(community|enterprise)-edition|mage-os/product-community-edition" - - if [ -f composer.lock ]; then - RESULT=$(jq -r --arg p "$PATTERN" '.packages[] | select(.name | test($p)) | "\(.name) \(.version)"' composer.lock | head -1) - else - RESULT=$(jq -r --arg p "$PATTERN" '.require | to_entries[] | select(.key | test($p)) | "\(.key) \(.value)"' composer.json | head -1) - fi - - PRODUCT=$(echo "$RESULT" | awk '{print $1}') - VERSION=$(echo "$RESULT" | awk '{print $2}' | sed 's/^v//') - PROJECT=$(echo "$PRODUCT" | sed 's/product-/project-/') - - echo "version=\"$VERSION\"" >> $GITHUB_OUTPUT - echo "project=$PROJECT" >> $GITHUB_OUTPUT + run: bash "${{ github.action_path }}/get-magento-version.sh" "${{ inputs.working-directory }}" >> $GITHUB_OUTPUT branding: icon: "code" diff --git a/get-magento-version/fixtures/empty/.gitkeep b/get-magento-version/fixtures/empty/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/get-magento-version/fixtures/enterprise/composer.lock b/get-magento-version/fixtures/enterprise/composer.lock new file mode 100644 index 0000000..c3ca4d9 --- /dev/null +++ b/get-magento-version/fixtures/enterprise/composer.lock @@ -0,0 +1,9 @@ +{ + "packages": [ + { + "name": "magento/product-enterprise-edition", + "version": "2.4.7-p1" + } + ], + "packages-dev": [] +} diff --git a/get-magento-version/fixtures/extension/composer.json b/get-magento-version/fixtures/extension/composer.json new file mode 100644 index 0000000..ec6af01 --- /dev/null +++ b/get-magento-version/fixtures/extension/composer.json @@ -0,0 +1,5 @@ +{ + "name": "vendor/module", + "type": "magento2-module", + "require": {} +} diff --git a/get-magento-version/fixtures/mage-os/composer.lock b/get-magento-version/fixtures/mage-os/composer.lock new file mode 100644 index 0000000..5576d81 --- /dev/null +++ b/get-magento-version/fixtures/mage-os/composer.lock @@ -0,0 +1,9 @@ +{ + "packages": [ + { + "name": "mage-os/product-community-edition", + "version": "1.0.0" + } + ], + "packages-dev": [] +} diff --git a/get-magento-version/fixtures/store-json/composer.json b/get-magento-version/fixtures/store-json/composer.json new file mode 100644 index 0000000..d1cf0f4 --- /dev/null +++ b/get-magento-version/fixtures/store-json/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "magento/product-community-edition": "2.4.6-p1" + } +} diff --git a/get-magento-version/fixtures/store-lock/composer.lock b/get-magento-version/fixtures/store-lock/composer.lock new file mode 100644 index 0000000..d3c6e89 --- /dev/null +++ b/get-magento-version/fixtures/store-lock/composer.lock @@ -0,0 +1,9 @@ +{ + "packages": [ + { + "name": "magento/product-community-edition", + "version": "2.4.7" + } + ], + "packages-dev": [] +} diff --git a/get-magento-version/fixtures/store-v-prefix/composer.lock b/get-magento-version/fixtures/store-v-prefix/composer.lock new file mode 100644 index 0000000..674683d --- /dev/null +++ b/get-magento-version/fixtures/store-v-prefix/composer.lock @@ -0,0 +1,9 @@ +{ + "packages": [ + { + "name": "magento/product-community-edition", + "version": "v2.4.6" + } + ], + "packages-dev": [] +} diff --git a/get-magento-version/get-magento-version.sh b/get-magento-version/get-magento-version.sh new file mode 100644 index 0000000..a70ce2f --- /dev/null +++ b/get-magento-version/get-magento-version.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -uo pipefail + +WORKING_DIR="${1:-.}" +PATTERN="magento/product-(community|enterprise)-edition|mage-os/product-community-edition" + +cd "$WORKING_DIR" + +if [ -f composer.lock ]; then + RESULT=$(jq -r --arg p "$PATTERN" '.packages[] | select(.name | test($p)) | "\(.name) \(.version)"' composer.lock | head -1) +elif [ -f composer.json ]; then + RESULT=$(jq -r --arg p "$PATTERN" '.require | to_entries[] | select(.key | test($p)) | "\(.key) \(.value)"' composer.json | head -1) +fi + +PRODUCT=$(echo "${RESULT:-}" | awk '{print $1}') +VERSION=$(echo "${RESULT:-}" | awk '{print $2}' | sed 's/^v//') +PROJECT=$(echo "$PRODUCT" | sed 's/product-/project-/') + +echo "version=\"$VERSION\"" +echo "project=$PROJECT" diff --git a/get-magento-version/test.sh b/get-magento-version/test.sh new file mode 100644 index 0000000..4ef779d --- /dev/null +++ b/get-magento-version/test.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCRIPT="$SCRIPT_DIR/get-magento-version.sh" +FIXTURES="$SCRIPT_DIR/fixtures" +PASS=0 +FAIL=0 + +assert_eq() { + local label="$1" expected="$2" actual="$3" + if [ "$expected" = "$actual" ]; then + echo "PASS: $label" + PASS=$((PASS + 1)) + else + echo "FAIL: $label" + echo " expected: $expected" + echo " actual: $actual" + FAIL=$((FAIL + 1)) + fi +} + +field() { + echo "$1" | grep "^${2}=" | cut -d= -f2- +} + +OUT=$(bash "$SCRIPT" "$FIXTURES/store-lock") +assert_eq "store lock: version" '"2.4.7"' "$(field "$OUT" version)" +assert_eq "store lock: project" "magento/project-community-edition" "$(field "$OUT" project)" + +OUT=$(bash "$SCRIPT" "$FIXTURES/store-v-prefix") +assert_eq "store v-prefix: version" '"2.4.6"' "$(field "$OUT" version)" + +OUT=$(bash "$SCRIPT" "$FIXTURES/enterprise") +assert_eq "enterprise: version" '"2.4.7-p1"' "$(field "$OUT" version)" +assert_eq "enterprise: project" "magento/project-enterprise-edition" "$(field "$OUT" project)" + +OUT=$(bash "$SCRIPT" "$FIXTURES/mage-os") +assert_eq "mage-os: version" '"1.0.0"' "$(field "$OUT" version)" +assert_eq "mage-os: project" "mage-os/project-community-edition" "$(field "$OUT" project)" + +OUT=$(bash "$SCRIPT" "$FIXTURES/store-json") +assert_eq "store json: version" '"2.4.6-p1"' "$(field "$OUT" version)" +assert_eq "store json: project" "magento/project-community-edition" "$(field "$OUT" project)" + +OUT=$(bash "$SCRIPT" "$FIXTURES/extension") +assert_eq "extension: version" '""' "$(field "$OUT" version)" +assert_eq "extension: project" "" "$(field "$OUT" project)" + +OUT=$(bash "$SCRIPT" "$FIXTURES/empty") +assert_eq "empty dir: version" '""' "$(field "$OUT" version)" +assert_eq "empty dir: project" "" "$(field "$OUT" project)" + +echo "" +echo "$PASS passed, $FAIL failed" +[ "$FAIL" -eq 0 ]