| #!/usr/bin/env bash | |
| # Remote testing of Automake tarballs made easy. | |
| # This script requires Bash 4.x or later. | |
| # Copyright (C) 2013-2017 Free Software Foundation, Inc. | |
| # This program is free software; you can redistribute it and/or modify | |
| # it under the terms of the GNU General Public License as published by | |
| # the Free Software Foundation; either version 2, or (at your option) | |
| # any later version. | |
| # This program is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| # TODO: some documentation would be nice ... | |
| set -u | |
| me=${0##*/} | |
| fatal () { echo "$me: $*" >&2; exit 1; } | |
| cmd=' | |
| test_script=$HOME/.am-test/run | |
| if test -f "$test_script" && test -x "$test_script"; then | |
| "$test_script" "$@" | |
| else | |
| nice -n19 ./configure && nice -n19 make -j10 check | |
| fi | |
| ' | |
| remote= | |
| interactive=1 | |
| maybe_sleep=: | |
| while test $# -gt 0; do | |
| case $1 in | |
| -b|--batch) interactive=0;; | |
| -c|--command) cmd=${2-}; shift;; | |
| # Useful to avoid spurious errors due to skewed clocks between | |
| # the system where the tarball is built and the target system. | |
| -S|--sleep) maybe_sleep="sleep ${2-}"; shift;; | |
| -*) fatal "'$1': invalid option";; | |
| *) remote=$1; shift; break;; | |
| esac | |
| shift | |
| done | |
| [[ -n $remote ]] || fatal "no remote given" | |
| if ((interactive)); then | |
| do_on_error='{ | |
| AM_TESTSUITE_FAILED=yes | |
| export AM_TESTSUITE_FAILED | |
| # We should not modify the environment with which the failed | |
| # tests have run, hence do not read ".profile", ".bashrc", and | |
| # company. | |
| exec bash --noprofile --norc -i | |
| }' | |
| else | |
| do_on_error='exit $?' | |
| fi | |
| tarball=$(echo automake*.tar.xz) | |
| case $tarball in | |
| *' '*) fatal "too many automake tarballs: $tarball";; | |
| esac | |
| test -f $tarball || fatal "no automake tarball found" | |
| distdir=${tarball%%.tar.xz} | |
| env='PATH=$HOME/bin:$PATH' | |
| if test -t 1; then | |
| env+=" TERM='$TERM' AM_COLOR_TESTS=always" | |
| fi | |
| # This is tempting: | |
| # $ ssh "command" arg-1 ... arg-2 | |
| # but doesn't work as expected. So we need the following hack | |
| # to propagate the command line arguments to the remote shell. | |
| quoted_args=-- | |
| while (($# > 0)); do | |
| case $1 in | |
| *\'*) quoted_args+=" "$(printf '%s\n' "$1" | sed "s/'/'\\''/g");; | |
| *) quoted_args+=" '$1'";; | |
| esac | |
| shift | |
| done | |
| set -e | |
| set -x | |
| scp $tarball $remote:tmp/ | |
| $maybe_sleep | |
| # Multiple '-t' to force tty allocation. | |
| ssh -t -t $remote " | |
| set -x; set -e; set -u; | |
| set $quoted_args | |
| cd tmp | |
| if test -e $distdir; then | |
| # Use 'perl', not only 'rm -rf', to correctly handle read-only | |
| # files or directory. Fall back to 'rm' if something goes awry. | |
| perl -e 'use File::Path qw/rmtree/; rmtree(\"$distdir\")' \ | |
| || rm -rf $distdir || exit 1 | |
| test ! -e $distdir | |
| fi | |
| export $env | |
| "' | |
| am_extra_acdir=$HOME/.am-test/extra-aclocal | |
| am_extra_bindir=$HOME/.am-test/extra-bin | |
| am_extra_setup=$HOME/.am-test/extra-setup.sh | |
| if test -d "$am_extra_acdir"; then | |
| export ACLOCAL_PATH=$am_extra_acdir${ACLOCAL_PATH+":$ACLOCAL_PATH"} | |
| fi | |
| if test -d "$am_extra_bindir"; then | |
| export PATH=$am_extra_bindir:$PATH | |
| fi | |
| '" | |
| xz -dc $tarball | tar xf - | |
| cd $distdir | |
| if test -f \"\$am_extra_setup\"; then | |
| . \"\$am_extra_setup\" | |
| fi | |
| ($cmd) || $do_on_error | |
| " |