| #!/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 |
| " |