From a578ae94b703155fbebff11de1bb5bbd297b5ced Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Sat, 27 Sep 2025 13:33:02 +0530 Subject: [PATCH 1/5] Add workflow for deprecated exercises --- .../workflows/check-deprecated-exercises.yml | 15 ++++++ bin/test-deprecated-exercises | 50 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 .github/workflows/check-deprecated-exercises.yml create mode 100644 bin/test-deprecated-exercises 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 100644 index 000000000..85384bdd5 --- /dev/null +++ b/bin/test-deprecated-exercises @@ -0,0 +1,50 @@ +#!/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)/' | \ + cut -d/ -f1-3 | sort -u) + +echo "$changed_exercises" + +if [ -z "$changed_exercises" ]; then + echo "No exercises changed!" + exit 0 +fi + +# Deprecated practice exercises +deprecated_exercises=( + "exercises/practice/accumulate" + "exercises/practice/beer-song" + "exercises/practice/binary" + "exercises/practice/diffie-hellman" + "exercises/practice/hexadecimal" + "exercises/practice/minesweeper" + "exercises/practice/octal" + "exercises/practice/strain" + "exercises/practice/trinary" + "exercises/concept/play-your-cards" +) + +# Check for deprecated ones +for ex in $changed_exercises; do + if printf '%s\n' "${deprecated_exercises[@]}" | grep -qx "$ex"; then + echo "❌ Deprecated exercise changed: $ex" + exit 1 + fi +done + +echo "✅ No deprecated exercises changed!" \ No newline at end of file From d6337aca4bebe1a6a676ac53d7faeca9c78ffff9 Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Sat, 27 Sep 2025 13:39:10 +0530 Subject: [PATCH 2/5] Mark test-deprecated-exercises as executable --- bin/test-deprecated-exercises | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/test-deprecated-exercises diff --git a/bin/test-deprecated-exercises b/bin/test-deprecated-exercises old mode 100644 new mode 100755 From 2d63504ef799ec25a6a4b0f72aa6bb7d2e963e08 Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Sat, 27 Sep 2025 14:07:52 +0530 Subject: [PATCH 3/5] Updating script --- bin/test-deprecated-exercises | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bin/test-deprecated-exercises b/bin/test-deprecated-exercises index 85384bdd5..16e1251e0 100755 --- a/bin/test-deprecated-exercises +++ b/bin/test-deprecated-exercises @@ -14,9 +14,8 @@ MERGE_BASE=$(git merge-base HEAD origin/"$BASE_BRANCH") changed_files=$(git diff --name-only "$MERGE_BASE" HEAD) # Extract unique exercise directories -changed_exercises=$(echo "$changed_files" | \ - grep -E '^exercises/(practice|concept)/' | \ - cut -d/ -f1-3 | sort -u) +changed_exercises=$(echo "$changed_files" | grep -E '^exercises/(practice|concept)/' || true) +changed_exercises=$(echo "$changed_exercises" | cut -d/ -f1-3 | sort -u) echo "$changed_exercises" From 214d71e1c524f9ec7f878378d7d3bbce57fb9034 Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Sat, 27 Sep 2025 17:57:13 +0530 Subject: [PATCH 4/5] Dynamically load deprecated files from config.json using jq --- .../workflows/check-deprecated-exercises.yml | 2 ++ bin/test-deprecated-exercises | 27 +++++++------------ 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/.github/workflows/check-deprecated-exercises.yml b/.github/workflows/check-deprecated-exercises.yml index 9e39d6af7..95821cad8 100644 --- a/.github/workflows/check-deprecated-exercises.yml +++ b/.github/workflows/check-deprecated-exercises.yml @@ -11,5 +11,7 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 with: fetch-depth: 0 + - name: Install jq + run: sudo apt-get update && sudo apt-get install -y jq - 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 index 16e1251e0..5260d6b6c 100755 --- a/bin/test-deprecated-exercises +++ b/bin/test-deprecated-exercises @@ -17,33 +17,26 @@ changed_files=$(git diff --name-only "$MERGE_BASE" HEAD) changed_exercises=$(echo "$changed_files" | grep -E '^exercises/(practice|concept)/' || true) changed_exercises=$(echo "$changed_exercises" | cut -d/ -f1-3 | sort -u) -echo "$changed_exercises" - +# Early exit if no exercise changed if [ -z "$changed_exercises" ]; then echo "No exercises changed!" exit 0 fi -# Deprecated practice exercises -deprecated_exercises=( - "exercises/practice/accumulate" - "exercises/practice/beer-song" - "exercises/practice/binary" - "exercises/practice/diffie-hellman" - "exercises/practice/hexadecimal" - "exercises/practice/minesweeper" - "exercises/practice/octal" - "exercises/practice/strain" - "exercises/practice/trinary" - "exercises/concept/play-your-cards" -) +# 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 printf '%s\n' "${deprecated_exercises[@]}" | grep -qx "$ex"; then + if echo "$deprecated_exercises" | grep -qx "$ex"; then echo "❌ Deprecated exercise changed: $ex" exit 1 fi done -echo "✅ No deprecated exercises changed!" \ No newline at end of file +echo "✅ No deprecated exercises changed!" From ae1d4b48fff26881eaab99a3ae0987e9769544ae Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Mon, 29 Sep 2025 13:36:07 +0530 Subject: [PATCH 5/5] Remove `install jq` step from the workflow --- .github/workflows/check-deprecated-exercises.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/check-deprecated-exercises.yml b/.github/workflows/check-deprecated-exercises.yml index 95821cad8..9e39d6af7 100644 --- a/.github/workflows/check-deprecated-exercises.yml +++ b/.github/workflows/check-deprecated-exercises.yml @@ -11,7 +11,5 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 with: fetch-depth: 0 - - name: Install jq - run: sudo apt-get update && sudo apt-get install -y jq - name: Test deprecated exercises using test-deprecated-exercises run: bin/test-deprecated-exercises