aboutsummaryrefslogtreecommitdiff
path: root/aux/workflow/repocheck.sh
diff options
context:
space:
mode:
Diffstat (limited to 'aux/workflow/repocheck.sh')
-rwxr-xr-xaux/workflow/repocheck.sh184
1 files changed, 184 insertions, 0 deletions
diff --git a/aux/workflow/repocheck.sh b/aux/workflow/repocheck.sh
new file mode 100755
index 0000000..688410a
--- /dev/null
+++ b/aux/workflow/repocheck.sh
@@ -0,0 +1,184 @@
+#!/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