@@ -333,22 +333,85 @@ jobs:
333333 retention-days : 1
334334 hurl_examples :
335335 runs-on : ubuntu-latest
336+ env :
337+ DIFF_BASE : ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.before }}
338+ DIFF_HEAD : ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha || github.sha }}
336339 outputs :
337340 examples : ${{ steps.examples.outputs.examples }}
338341 steps :
339342 - uses : actions/checkout@v7
343+ with :
344+ fetch-depth : 0
340345 - id : examples
346+ name : Select relevant Hurl examples
347+ shell : bash
341348 run : |
342- examples="$(find examples -mindepth 2 -maxdepth 2 -name test.hurl -print | sed 's#/test.hurl$##' | sort | jq -R -s -c 'split("\n")[:-1]')"
349+ set -euo pipefail
350+ all_examples() {
351+ find examples -mindepth 2 -maxdepth 2 -name test.hurl -print \
352+ | sed 's#/test.hurl$##' \
353+ | sort \
354+ | jq -R -s -c 'split("\n")[:-1]'
355+ }
356+
357+ if [[ "$GITHUB_REF_TYPE" == tag || -z "$DIFF_BASE" || -z "$DIFF_HEAD" || "$DIFF_BASE" =~ ^0+$ ]]; then
358+ examples="$(all_examples)"
359+ elif ! git cat-file -e "${DIFF_BASE}^{commit}" || ! git cat-file -e "${DIFF_HEAD}^{commit}"; then
360+ echo "Could not resolve the event's diff range; running all Hurl examples."
361+ examples="$(all_examples)"
362+ elif ! changed_paths="$(git diff --name-only "${DIFF_BASE}...${DIFF_HEAD}")"; then
363+ echo "Could not compare the event's commits; running all Hurl examples."
364+ examples="$(all_examples)"
365+ else
366+ declare -A selected=()
367+ run_all=false
368+ while IFS= read -r path; do
369+ case "$path" in
370+ # Build, harness, or workflow changes can affect every example.
371+ Dockerfile|.dockerignore|Cargo.toml|Cargo.lock|build.rs|\
372+ .cargo/*|scripts/*|.github/workflows/ci.yml)
373+ run_all=true
374+ ;;
375+ # These suites cover telemetry and SMTP integrations end to end.
376+ src/telemetry.rs|src/main.rs|src/webserver/http.rs|\
377+ src/webserver/database/execute_queries.rs)
378+ selected["examples/telemetry"]=1
379+ ;;
380+ src/app_config.rs|src/webserver/database/sqlpage_functions/functions/send_mail.rs)
381+ selected["examples/sending emails"]=1
382+ ;;
383+ # Example-local edits run that example's Hurl suite.
384+ examples/*)
385+ relative_path="${path#examples/}"
386+ example="examples/${relative_path%%/*}"
387+ [[ -f "$example/test.hurl" ]] && selected["$example"]=1
388+ ;;
389+ esac
390+ done <<< "$changed_paths"
391+
392+ if [[ "$run_all" == true ]]; then
393+ examples="$(all_examples)"
394+ elif ((${#selected[@]} == 0)); then
395+ examples='[]'
396+ else
397+ examples="$(printf '%s\n' "${!selected[@]}" | sort | jq -R -s -c 'split("\n")[:-1]')"
398+ fi
399+ fi
343400 echo "examples=$examples" >> "$GITHUB_OUTPUT"
401+ if [[ "$examples" == '[]' ]]; then
402+ echo 'No Hurl examples match these changes; Rust and Playwright checks still run.' >> "$GITHUB_STEP_SUMMARY"
403+ else
404+ echo "Selected Hurl examples: $examples" >> "$GITHUB_STEP_SUMMARY"
405+ fi
344406 - name : Restore Hurl archive
345407 id : hurl-cache
408+ if : steps.examples.outputs.examples != '[]'
346409 uses : actions/cache@v6
347410 with :
348411 path : .cache/hurl
349412 key : hurl-${{ runner.os }}-x86_64-unknown-linux-gnu-${{ env.HURL_VERSION }}
350413 - name : Download Hurl archive
351- if : steps.hurl-cache.outputs.cache-hit != 'true'
414+ if : steps.examples.outputs.examples != '[]' && steps. hurl-cache.outputs.cache-hit != 'true'
352415 run : |
353416 set -euo pipefail
354417 archive="hurl-${HURL_VERSION}-x86_64-unknown-linux-gnu.tar.gz"
@@ -363,6 +426,7 @@ jobs:
363426 test "$expected_sha" = "$actual_sha"
364427 )
365428 - name : Upload Hurl archive
429+ if : steps.examples.outputs.examples != '[]'
366430 uses : actions/upload-artifact@v7
367431 with :
368432 name : hurl-${{ env.HURL_VERSION }}-x86_64-unknown-linux-gnu
@@ -373,6 +437,7 @@ jobs:
373437 hurl :
374438 name : hurl (${{ matrix.example }})
375439 runs-on : ubuntu-latest
440+ if : ${{ needs.hurl_examples.outputs.examples != '[]' }}
376441 timeout-minutes : 15
377442 needs :
378443 - docker_build
0 commit comments