diff options
author | Ed Santiago <santiago@redhat.com> | 2021-01-07 13:57:35 -0700 |
---|---|---|
committer | Ed Santiago <santiago@redhat.com> | 2021-01-19 10:45:58 -0700 |
commit | 9f6bb3563d7a311a7e5628d18210c2c263af962d (patch) | |
tree | 9d208c129ff8ea39a0c2c0057b153896824ed949 /contrib/cirrus/pr-should-include-tests | |
parent | 8c6df5e93e6941a7f50da651678751f7dfec900e (diff) | |
download | podman-9f6bb3563d7a311a7e5628d18210c2c263af962d.tar.gz podman-9f6bb3563d7a311a7e5628d18210c2c263af962d.tar.bz2 podman-9f6bb3563d7a311a7e5628d18210c2c263af962d.zip |
CI: smoke test: insist on adding tests on PRs
On each PR (with a few exceptions), check the list of git-touched
files, and abort if no tests are added. Include instructions
on how to bypass the check if tests really aren't needed.
Include a hardcoded exception list for PRs that only touch a
well-known subset of "safe" files: docs, .cirrus.yml, vendor,
version, hack, contrib, or *.md. This list is likely to need
tuning over time.
Add a test suite, but not one recognized by the new script
(because it's a "*.t" file), so: [NO TESTS NEEDED]
Signed-off-by: Ed Santiago <santiago@redhat.com>
Diffstat (limited to 'contrib/cirrus/pr-should-include-tests')
-rwxr-xr-x | contrib/cirrus/pr-should-include-tests | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/contrib/cirrus/pr-should-include-tests b/contrib/cirrus/pr-should-include-tests new file mode 100755 index 000000000..caf27cf83 --- /dev/null +++ b/contrib/cirrus/pr-should-include-tests @@ -0,0 +1,70 @@ +#!/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:-master} $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'. +if git diff --name-status $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 changelog.txt | + fgrep -vx go.mod | + fgrep -vx go.sum | + egrep -v '^[^/]+\.md$' | + egrep -v '^contrib/' | + egrep -v '^docs/' | + egrep -v '^hack/' | + 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 <<EOF +$(basename $0): PR does not include changes in the 'tests' directory + +Please write a regression test for what you're fixing. Even if it +seems trivial or obvious, try to add a test that will prevent +regressions. + +If your change is minor, feel free to piggyback on already-written +tests, possibly just adding a small step to a similar existing test. +Every second counts in CI. + +If your commit really, truly does not need tests, you can proceed +by adding '[NO TESTS NEEDED]' to the body of your commit message. +Please think carefully before doing so. +EOF + +exit 1 |