diff options
-rw-r--r-- | Makefile | 9 | ||||
-rwxr-xr-x | aux/workflow/installcheck.sh | 61 | ||||
-rwxr-xr-x | aux/workflow/repocheck.sh | 183 |
3 files changed, 184 insertions, 69 deletions
@@ -72,14 +72,7 @@ dev-check: check public sh aux/workflow/assert-readme.sh -n $(NAME) -m $(MAILING_LIST) sh aux/workflow/assert-manpages.sh -n $(NAME) -m $(MAILING_LIST) \ -l '$(TRANSLATIONS) en' $(manpages.en.in) - . aux/lib.sh && $(MAKE) PREFIX=`mkdtemp` \ - install installcheck uninstall uninstallcheck - -installcheck: - sh aux/workflow/installcheck.sh -x1 -l1 -f5 -p $(PREFIX) - -uninstallcheck: - sh aux/workflow/installcheck.sh -up $(PREFIX) + sh aux/workflow/repocheck.sh -x1 -l1 -f5 dist: sh aux/workflow/dist.sh -d $(DATE) -V $(VERSION) \ diff --git a/aux/workflow/installcheck.sh b/aux/workflow/installcheck.sh deleted file mode 100755 index 0aae391..0000000 --- a/aux/workflow/installcheck.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh -set -eu - -while getopts 'p:x:l:f:u' flag; do - case "$flag" in - p) - PREFIX="$OPTARG" - ;; - x) - EXECUTABLES_EXPECTED="$OPTARG" - ;; - l) - SYMLINKS_EXPECTED="$OPTARG" - ;; - f) - FILES_EXPECTED="$OPTARG" - ;; - u) - UNINSTALL=1 - ;; - *) - exit 2 - ;; - esac -done -shift $((OPTIND - 1)) - - -if [ -n "${UNINSTALL:-}" ]; then - if [ "$(find "$PREFIX" -type f | wc -l)" != 0 ]; then - printf 'When uninstalling, left over files in the' - printf 'PREFIX directory:\n' - find "$PREFIX" -type f - exit 1 - fi - exit -fi - -EXECUTABLES_ACTUAL="$(find "$PREFIX" -type f -perm -a=x | wc -l)" -if [ "${EXECUTABLES_EXPECTED:-0}" != "$EXECUTABLES_ACTUAL" ]; then - printf 'Expected %s executables, found %s:\n' \ - "$EXECUTABLES_EXPECTED" "$EXECUTABLES_ACTUAL" >&2 - find "$PREFIX" -type f -perm -a=x - exit 1 -fi - -SYMLINKS_ACTUAL="$(find "$PREFIX" -type l | wc -l)" -if [ "${SYMLINKS_EXPECTED:-0}" != "$SYMLINKS_ACTUAL" ]; then - printf 'Expected %s symlinks, found %s:\n' \ - "$SYMLINKS_EXPECTED" "$SYMLINKS_ACTUAL" >&2 - find "$PREFIX" -type l - exit 1 -fi - -FILES_ACTUAL="$(find "$PREFIX" -type f | wc -l)" -if [ "${FILES_EXPECTED:-0}" != "$FILES_ACTUAL" ]; then - printf 'Expected %s files, found %s:\n' \ - "$FILES_EXPECTED" "$FILES_ACTUAL" >&2 - find "$PREFIX" -type f - exit 1 -fi diff --git a/aux/workflow/repocheck.sh b/aux/workflow/repocheck.sh new file mode 100755 index 0000000..5f83708 --- /dev/null +++ b/aux/workflow/repocheck.sh @@ -0,0 +1,183 @@ +#!/bin/sh +set -eu + +if [ -n "${RECURSIVE_CHECK:-}" ]; then + exit +fi +export RECURSIVE_CHECK=true + +. aux/lib.sh + +REPODIR="$PWD" + +INSTALLCHECK=false +while getopts 'x:l:f:' flag; do + case "$flag" in + x) + EXECUTABLES="$OPTARG" + INSTALLCHECK=true + ;; + l) + SYMLINKS="$OPTARG" + INSTALLCHECK=true + ;; + f) + FILES="$OPTARG" + INSTALLCHECK=true + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_no_diffs() { + if [ -n "$(git status -s)" ]; then + echo 'Repository left dirty.' >&2 + git status >&2 + exit 1 + fi +} + +assert_installed_files() { + if [ -n "${EXECUTABLES:-}" ]; then + ACTUAL="$(find "$1" -type f -perm -u=x | wc -l)" + if [ "$EXECUTABLES" != "$ACTUAL" ]; then + printf 'Expected %s executables, found %s:\n' \ + "$EXECUTABLES" "$ACTUAL" >&2 + echo "find $1 -type f -perm -u=x:" >&2 + find "$1" -type f -perm -u=x >&2 + exit 1 + fi + fi + + if [ -n "${SYMLINKS:-}" ]; then + ACTUAL="$(find "$1" -type l | wc -l)" + if [ "$SYMLINKS" != "$ACTUAL" ]; then + printf 'Expected %s symlinks, found %s:\n' \ + "$SYMLINKS" "$ACTUAL" >&2 + echo "find $1 -type l:" >&2 + find "$1" -type l >&2 + exit 1 + fi + fi + + if [ -n "${FILES:-}" ]; then + ACTUAL="$(find "$1" -type f | wc -l)" + if [ "$FILES" != "$ACTUAL" ]; then + printf 'Expected %s files, found %s:\n' \ + "$FILES" "$ACTUAL" >&2 + echo "find $1 -type f:" >&2 + find "$1" -type f >&2 + exit 1 + fi + fi +} + +assert_uninstalled_files() { + if [ "$(find "$1" \( -type f -o -type l \) | wc -l)" != 0 ]; then + echo 'Left-over files after uninstall' >&2 + echo "find $1 \( -type f -o -type l \):" + find "$1" \( -type f -o -type l \) + exit 1 + fi +} + +assert_install() { + if [ "$INSTALLCHECK" != 'true' ]; then + return + fi + + make clean + + echo 'Asserting "canonical" install path' >&2 + INSTALL1="$(mkdtemp)" + make PREFIX="$INSTALL1" + make check PREFIX="$INSTALL1" + make install PREFIX="$INSTALL1" + assert_installed_files "$INSTALL1" + make uninstall PREFIX="$INSTALL1" + assert_uninstalled_files "$INSTALL1" + + make clean + + echo 'Asserting "straigh-forward" install path' >&2 + INSTALL2="$(mkdtemp)" + make install PREFIX="$INSTALL2" + assert_installed_files "$INSTALL2" + make uninstall PREFIX="$INSTALL2" + assert_uninstalled_files "$INSTALL2" + + make clean + + echo 'Asserting "idempotent" install path' >&2 + INSTALL3="$(mkdtemp)" + make install PREFIX="$INSTALL3" + make install PREFIX="$INSTALL3" + assert_installed_files "$INSTALL3" + make uninstall PREFIX="$INSTALL3" + make uninstall PREFIX="$INSTALL3" + assert_uninstalled_files "$INSTALL3" + + make clean + + echo 'Asserting "destdir" install path' >&2 + DESTDIR="$(mkdtemp)" + INSTALL4="$(mkdtemp)" + make install DESTDIR="$DESTDIR" PREFIX="$INSTALL4" + assert_installed_files "$DESTDIR/$INSTALL4" + make uninstall DESTDIR="$DESTDIR" PREFIX="$INSTALL4" + assert_uninstalled_files "$DESTDIR/$INSTALL4" +} + +assert_clean_clone() { + CLONEDIR="$(mkdtemp)" + cd "$CLONEDIR" + + git clone "$REPODIR" . + + make clean public dev-check + assert_no_diffs + make clean + assert_no_diffs + + if [ -n "$(git clean -ffdx --dry-run)" ]; then + echo '"make clean" left files:' >&2 + git clean -ffdx --dry-run >&2 + echo "Clone directory: $CLONEDIR" >&2 + exit 1 + fi + + rm -rf aux/ + make clean check || { + echo 'Cannot run "make check" without "aux/".' >&2 + echo "Clone directory: $CLONEDIR" >&2 + exit 1 + } + + assert_install + + cd - > /dev/null +} + +assert_clean_checkout() { + CHECKOUTDIR="$(mkdtemp)" + git --work-tree="$CHECKOUTDIR" checkout HEAD -- . + cd "$CHECKOUTDIR" + + FILECOUNT="$(find . -type f | wc -l)" + make check clean + if [ "$FILECOUNT" != "$(find . -type f | wc -l)" ]; then + echo 'File count mismatch after "make check clean".' >&2 + echo "Checkout directory: $CHECKOUTDIR" >&2 + exit 1 + fi + + assert_install + + cd - > /dev/null +} + +assert_clean_clone +assert_clean_checkout |