diff --git a/.github/workflows/check-deprecated-exercises.yml b/.github/workflows/check-deprecated-exercises.yml new file mode 100644 index 000000000..9e39d6af7 --- /dev/null +++ b/.github/workflows/check-deprecated-exercises.yml @@ -0,0 +1,15 @@ +name: Deprecated + +on: + pull_request: + +jobs: + test-deprecated: + name: Check for deprecated exercises + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 + with: + fetch-depth: 0 + - name: Test deprecated exercises using test-deprecated-exercises + run: bin/test-deprecated-exercises diff --git a/bin/test-deprecated-exercises b/bin/test-deprecated-exercises new file mode 100755 index 000000000..5260d6b6c --- /dev/null +++ b/bin/test-deprecated-exercises @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +set -eo pipefail + +# Determine the base branch of the PR +BASE_BRANCH=${GITHUB_BASE_REF:-main} + +# Fetch full history for proper diff +git fetch origin "$BASE_BRANCH" + +# Compute merge base +MERGE_BASE=$(git merge-base HEAD origin/"$BASE_BRANCH") + +# Get changed files relative to merge base +changed_files=$(git diff --name-only "$MERGE_BASE" HEAD) + +# Extract unique exercise directories +changed_exercises=$(echo "$changed_files" | grep -E '^exercises/(practice|concept)/' || true) +changed_exercises=$(echo "$changed_exercises" | cut -d/ -f1-3 | sort -u) + +# Early exit if no exercise changed +if [ -z "$changed_exercises" ]; then + echo "No exercises changed!" + exit 0 +fi + +# Load deprecated exercises from config.json +deprecated_exercises=$(jq -r ' + [ + (.exercises.concept[]? | select(.status=="deprecated") | "exercises/concept/" + .slug), + (.exercises.practice[]? | select(.status=="deprecated") | "exercises/practice/" + .slug) + ] | .[] +' config.json) + +# Check for deprecated ones +for ex in $changed_exercises; do + if echo "$deprecated_exercises" | grep -qx "$ex"; then + echo "❌ Deprecated exercise changed: $ex" + exit 1 + fi +done + +echo "✅ No deprecated exercises changed!"