#!/bin/bash # # Intended for use in CI: check git commits, barf if no tests added. # # Docs-only changes are excused if [[ "${CIRRUS_CHANGE_TITLE}" =~ CI:DOCS ]]; then exit 0 fi # So are PRs where 'NO TESTS NEEDED' appears in the Github message if [[ "${CIRRUS_CHANGE_MESSAGE}" =~ NO.TESTS.NEEDED ]]; then exit 0 fi # HEAD should be good enough, but the CIRRUS envariable allows us to test head=${CIRRUS_CHANGE_IN_REPO:-HEAD} # Base of this PR. Here we absolutely rely on cirrus. base=$(git merge-base ${DEST_BRANCH:-main} $head) # This gives us a list of files touched in all commits, e.g. # A foo.c # M bar.c # We look for Added or Modified (not Deleted!) files under 'test'. # --no-renames ensures that renamed tests (#9420) show up as 'A'dded. if git diff --name-status --no-renames $base $head | egrep -q '^[AM]\s+(test/|.*_test\.go)'; then exit 0 fi # Nothing changed under test subdirectory. # # This is OK if the only files being touched are "safe" ones. filtered_changes=$(git diff --name-status $base $head | awk '{print $2}' | fgrep -vx .cirrus.yml | fgrep -vx .gitignore | fgrep -vx Makefile | fgrep -vx changelog.txt | fgrep -vx go.mod | fgrep -vx go.sum | egrep -v '^[^/]+\.md$' | egrep -v '^.github' | egrep -v '^contrib/' | egrep -v '^docs/' | egrep -v '^hack/' | egrep -v '^nix/' | egrep -v '^vendor/' | egrep -v '^version/') if [[ -z "$filtered_changes" ]]; then exit 0 fi # One last chance: perhaps the developer included the magic '[NO TESTS NEEDED]' # string in an amended commit. if git log --format=%B ${base}..${head} | fgrep '[NO TESTS NEEDED]'; then exit 0 fi cat <