#!/bin/sh set -eu if [ -n "${RECURSIVE_CHECK:-}" ]; then exit fi export RECURSIVE_CHECK=true . aux/lib.sh . aux/checks/repo.env set -eu usage() { cat <<-'EOF' FIXME EOF } assert_no_diffs() { if [ -n "$(git status -s)" ]; then echo 'Repository left dirty.' >&2 git status >&2 exit 1 fi } assert_installed_files() { 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 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 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 } 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() { make clean echo 'Asserting "canonical" install path' >&2 INSTALL1="$(tmpname)" 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="$(tmpname)" 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="$(tmpname)" 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="$(tmpname)" INSTALL4="$(tmpname)" make install DESTDIR="$DESTDIR" PREFIX="$INSTALL4" assert_installed_files "$DESTDIR/$INSTALL4" make uninstall DESTDIR="$DESTDIR" PREFIX="$INSTALL4" assert_uninstalled_files "$DESTDIR/$INSTALL4" } check_clean_clone() { um unreachable return 12 oijwsx CLONEDIR="$(tmpname)/$NAME" mkdir -p -- "$CLONEDIR" cd "$CLONEDIR" git clone "$OLDPWD" . make dev 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 check || { echo 'Cannot run "make check" without "aux/".' >&2 echo "Clone directory: $CLONEDIR" >&2 exit 1 #FIXME } assert_install oijwsx cd - > /dev/null } check_clean_checkout() { set -x echo dois dois CHECKOUTDIR="$(tmpname)/$NAME" mkdir -p -- "$CHECKOUTDIR" 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_insta cd - > /dev/null } set -eu # set -eE D="$(mkdtemp)" check_clean_clone && echo aaa exit if ! check_clean_clone; then touch "$D"/clean-clone.err fi check_clean_clone # || touch "$D"/clean-clone.err # check_clean_checkout || touch "$D"/clean-checkout.err # check_no_aux wait tree "$D" if [ "$(find "$D" -name '*.err' | wc -l)" != 0 ]; then find "$D" -name '*.err' | while read -r f; do cat -- "${f%.err}" done exit 1 fi