11#! /usr/bin/env bash
22set -eo pipefail
33
4- docker pull exercism/java-test-runner
5-
4+ # Determine the base branch of the PR
65BASE_BRANCH=${GITHUB_BASE_REF:- main}
6+
7+ # Fetch full history for proper diff
78git fetch origin " $BASE_BRANCH "
9+
10+ # Compute merge base
811MERGE_BASE=$( git merge-base HEAD origin/$BASE_BRANCH )
12+
13+ # Get changed files relative to merge base
914changed_files=$( git diff --name-only " $MERGE_BASE " HEAD)
1015
16+ # Extract unique exercise directories
1117changed_exercises=$( echo " $changed_files " | \
1218 grep -E ' ^exercises/(practice|concept)/[^/]+/.+\.(java|json|gradle)$' | \
1319 cut -d/ -f1-3 | sort -u)
@@ -21,28 +27,22 @@ echo "Changed exercises detected:"
2127echo " $changed_exercises "
2228echo
2329
24- exit_code=0
25-
26- function run_test_runner() {
27- local slug=$1
28- local solution_dir=$2
29- local output_dir=$3
30-
31- docker run \
32- --rm \
33- --network none \
34- --mount type=bind,src=" ${solution_dir} " ,dst=/solution \
35- --mount type=bind,src=" ${output_dir} " ,dst=/output \
36- --tmpfs /tmp:rw \
37- exercism/java-test-runner " ${slug} " " /solution" " /output"
38- }
30+ # Root Gradle wrapper
31+ GRADLE_WRAPPER=" ./gradlew"
3932
33+ # Verify each changed exercise
4034for dir in $changed_exercises ; do
41- slug=$( basename " $dir " )
42- output_dir=" ${dir} /build"
43- mkdir -p " $output_dir "
44- echo " === Running tests for $slug ==="
45- run_test_runner " $slug " " $dir " " $output_dir " || exit_code=1
35+ slug=$( basename " $dir " )
36+ # Convert path to Gradle subproject notation: exercises:practice:allergies
37+ gradle_project=$( echo " $dir " | tr / :)
38+
39+ echo " === Running tests for $slug ==="
40+ if [[ $dir == exercises/practice/* || $dir == exercises/concept/* ]]; then
41+ $GRADLE_WRAPPER " :$gradle_project :test"
42+ else
43+ echo " Skipping unknown directory: $dir "
44+ fi
45+ echo
4646done
4747
48- exit $exit_code
48+ echo " All changed exercises tested. "
0 commit comments