#!/bin/sh
#
# git-gau-ac - Apply a command and record its output as the commit message.

set -e
set -u

# Required binaries
ECHO=/bin/echo
GIT=/usr/bin/git
MKFIFO=/usr/bin/mkfifo
MKTEMP=/bin/mktemp
RM=/bin/rm
TEE=/usr/bin/tee
XARGS=/usr/bin/xargs

# Print usage message and exit.
if [ "${#}" -lt 1 ] || [ "${1:-h}" = "-h" ] || [ "${1:---help}" = "--help" ]; then
    ${ECHO} "${0}: command [args...]" >&2
    exit 1
fi

# Perform a checkout.
${ECHO} "${GAU_CHECKOUT_ARGS:---quiet}" | ${XARGS} ${GIT} checkout

# Replicate output of command to stdout.
LOGDIR="$(${MKTEMP} -d)"
cleanup() {
    ${RM} -rf "${LOGDIR}"
}
trap cleanup EXIT

LOGFIFO="${LOGDIR}/fifo"
LOGFILE="${LOGDIR}/stdout"
${MKFIFO} "${LOGFIFO}"
${TEE} "${LOGFILE}" < "${LOGFIFO}" &

# Run command and record commit message.
"${@}" > "${LOGFIFO}"

# Record changes to files.
${ECHO} "${GAU_ADD_ARGS:---all}" | ${XARGS} ${GIT} add
${ECHO} -F "${LOGFILE}" "${GAU_COMMIT_ARGS:---quiet}" | ${XARGS} ${GIT} commit
