132 lines
3.4 KiB
Bash
Executable File
132 lines
3.4 KiB
Bash
Executable File
#!/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 <http://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
|
|
"
|