#!/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 clean public dev-check make clean if [ "$FILECOUNT" != "$(find . -type f | wc -l)" ]; then echo 'File count mismatch after "make clean".' >&2 echo "Checkout directory: $CHECKOUTDIR" >&2 exit 1 fi assert_install cd - > /dev/null } assert_clean_clone assert_clean_checkout