diff options
author | EuAndreh <eu@euandre.org> | 2021-09-02 12:43:50 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2021-09-02 12:43:50 -0300 |
commit | 1c6942ebec8bf1956a350930f63f1798370d845a (patch) | |
tree | 2108777a46bdc54614077efa20605563f5af9d61 /aux | |
parent | doc/remembering.{pt,fr,eo}.{1,5}.in: Fix link to translated homepage (diff) | |
download | remembering-1c6942ebec8bf1956a350930f63f1798370d845a.tar.gz remembering-1c6942ebec8bf1956a350930f63f1798370d845a.tar.xz |
aux/workflow/repocheck.sh: Add file
Diffstat (limited to 'aux')
-rwxr-xr-x | aux/workflow/repocheck.sh | 184 |
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 |