diff --git a/maint/mc-test b/maint/mc-test new file mode 100755 index 000000000..e48f386d3 --- /dev/null +++ b/maint/mc-test @@ -0,0 +1,514 @@ +#!/bin/sh + +# Midnight Commander Test Suite +# +# (c) 2005 Roland Illig +# +# Licensed under the GPL 2.0 + +set -efu + +### initialize environment ### + +LC_CTYPE="C"; export LC_ALL +LC_COLLATE="C"; export LC_COLLATE +LC_MONETARY="C"; export LC_MONETARY +LC_NUMERIC="C"; export LC_NUMERIC +LC_TIME="C"; export LC_TIME +LC_MESSAGES="C"; export LC_MESSAGES +LC_ALL="C"; export LC_ALL + +### set default configuration ### + +mc_nice_value="19" + +mc_basedir="/tmp/mc-current-build" +mc_srcdir="" # default: ${mc_basedir}/src +mc_builddir="" # default: ${mc_basedir}/build +mc_prefixdir="" # default: ${mc_basedir}/installed +mc_logdir="" # default: ${mc_basedir}/logs + +mc_cvs_rsh="ssh" +mc_cvs_repository=":ext:anoncvs@cvs.gnu.org:/cvsroot/mc" +mc_cvs_module="mc" +mc_cvs_tag="HEAD" + +mc_configure_args_pre="--enable-maintainer-mode" +mc_configure_args_post="" + +mc_make="make" +mc_make_flags="" + +mc_cpp="" # default: ${mc_cc} -E +mc_cppflags="" + +mc_cc="cc" +mc_cflags="" + +mc_ldflags="" + +do_clean_basedir=no +do_download=auto +do_autoconf=auto +do_clean_workdir=no +do_configure=auto +do_make_clean=no +do_make_all=yes +do_make_install=yes + +### command line parsing ### + +usage() { + cat >&2 <] + + -config load the configuration from + -basedir set the base directory + -srcdir select the directory where the source code is + read from or will be downloaded to from CVS + + -[dont-]download checkout or update from CVS (default: ${do_download}) + -[dont-]autoconf generate the configure script (default: ${do_autoconf}) + -[dont-]cleanwork recreate the build directory (default: ${do_clean_workdir}) + -[dont-]configure run configure (default: ${do_configure}) + -[dont-]clean make clean (default: ${do_make_clean}) + -[dont-]build make all (default: ${do_make_all}) + -[dont-]install make install (default: ${do_make_install}) + + -fast only do what's necessary + -nice set the nice(1) value (default: ${mc_nice_value}) + -quiet disable most status messages (default: ${quiet:-"no"}${quiet+"yes"}) +EOF + exit 1 +} + +while test $# -ne 0; do + case "$1" in + -config) shift; . "$1"; shift;; + -basedir) shift; mc_basedir="$1"; shift;; + -cvs-repository) shift; mc_cvs_repository="$1"; shift;; + -cvs-module) shift; mc_cvs_module="$1"; shift;; + -srcdir) shift; mc_srcdir="$1"; shift;; + + -cleanup) shift; do_clean_basedir=yes;; + + -download) shift; do_download=yes;; + -dont-download) shift; do_download=no;; + -autoconf) shift; do_autoconf=yes;; + -dont-autoconf) shift; do_autoconf=no;; + -cleanwork) shift; do_clean_workdir=yes;; + -dont-cleanwork) shift; do_clean_workdir=no;; + -configure) shift; do_configure=yes;; + -dont-configure) shift; do_configure=no;; + -clean) shift; do_make_clean=yes;; + -dont-clean) shift; do_make_clean=no;; + -build) shift; do_make_all=yes;; + -dont-build) shift; do_make_all=no;; + -install) shift; do_make_install=yes;; + -dont-install) shift; do_make_install=no;; + + -fast) shift; do_clean_workdir=no + do_autoconf=no + do_configure=no + do_make_clean=no + do_make_all=yes;; + -nice) shift; nice_value="$1"; shift;; + -quiet) shift; quiet="yes";; + + --) shift; break;; + -) shift; break;; + -*) usage;; + *) break;; + esac +done + + +### Initialization ### + +renice ${mc_nice_value} $$ 1>/dev/null 2>&1 || true + +### Tools ### + +configure_args_enable_all="--enable-largefile --enable-nls "\ +"--enable-netcode --enable-background --enable-charset "\ +"--with-mmap --with-included-gettext --with-x "\ +"--with-vfs --with-mcfs --with-samba --with-ext2undel "\ +"--with-gpm-mouse --with-subshell --with-edit" +configure_args_disable_all="--disable-largefile --disable-nls "\ +"--disable-netcode --disable-background --disable-charset "\ +"--without-mmap --without-included-gettext --without-x "\ +"--without-vfs --without-mcfs --without-samba --without-ext2undel "\ +"--without-gpm-mouse --without-subshell --without-edit" + +errors=0 +warnings=0 + +# feature tests +if test x"`echo -n`" = x"-n"; then + echo_n="echo" + echo_cont=" " # a tab character +else + echo_n="echo -n" + echo_cont=" " +fi + + +show_file() { + if test -f "$1"; then + echo "" 1>&2 + sed -e '10s,.*,(more lines follow ...),' -e '10q' "$1" 1>&2 + echo "" 1>&2 + fi + return 0 +} + +phase_start() { + ${echo_n} "[`date`] $1" + return 0 +} + +phase_ok() { + echo "${echo_cont}ok" + return 0 +} + +phase_warnings() { + echo "${echo_cont}WARNINGS" + warnings=`expr $warnings + 1` + if test $# -gt 0; then show_file "$1"; fi + return 0 +} + +phase_ok_or_warnings() { + fsize=`wc -c < "$1"` + + { test -n "${fsize}" && test ${fsize} -eq 0 + } && phase_ok || phase_warnings "$1" + return 0 +} + +phase_failed() { + echo "${echo_cont}FAILED" + failed=yes + errors=`expr $errors + 1` + if test $# -gt 0; then show_file "$1"; fi + return 0 +} + +setup_preconf_env=\ +"out=\"\${mc_logdir}/\${test_phase}.out\";"\ +"err=\"\${mc_logdir}/\${test_phase}.err\";" + +preconf_download() { + test_phase="download" + eval "${setup_preconf_env}" + + if test ${do_download} = no && test -d "${mc_srcdir}/CVS"; then + return 0 + fi + + mkdir -p "${mc_logdir}" + + if test -d "${mc_srcdir}/CVS"; then + phase_start "updating CVS copy ..." + ( cd "${mc_srcdir}" \ + && env CVS_RSH=${mc_cvs_rsh} cvs update -r "${mc_cvs_tag}" -dP + ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}" + else + phase_start "getting fresh CVS copy ..." + ( mkdir -p "${mc_srcdir}" \ + && cd "${mc_srcdir}/.." \ + && env CVS_RSH=${mc_cvs_rsh} cvs -d "${mc_cvs_repository}" checkout -P -r "${mc_cvs_tag}" -d "`basename "${mc_srcdir}"`" "${mc_cvs_module}" + ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}" + fi +} + +preconf_autoconf() { + test_phase="autoconf" + eval "${setup_preconf_env}" + + if test ${do_autoconf} != yes && test -f "${mc_srcdir}/configure"; then + return 0 + fi + + mkdir -p "${mc_logdir}" + + phase_start "creating ./configure script ..." + { cd "${mc_srcdir}" \ + && echo "#!/bin/sh" > ./configure.mc \ + && chmod +x ./configure.mc \ + && ${SHELL-"/bin/sh"} ./autogen.sh + } 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}" +} + +setup_testenv=\ +"test_srcdir=\"\${mc_srcdir}\";"\ +"test_workdir=\"\${mc_builddir}/\${testname}\";"\ +"test_prefix=\"\${mc_prefixdir}/\${testname}\";"\ +"test_logdir=\"\${mc_logdir}/\${testname}\";"\ +"out=\"\${test_logdir}/\${test_phase}.out\";"\ +"err=\"\${test_logdir}/\${test_phase}.err\";" + +confbuild_cleanwork() { + test_phase="cleanwork" + eval "${setup_testenv}" + + if test ${do_clean_workdir} = no || test ! -d "${test_workdir}"; then + return 0 + fi + + mkdir -p "${test_logdir}" + + phase_start "cleaning directory for ${testname} ..." + { rm -rf "${test_workdir}" + } 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}" +} + +confbuild_configure() { + test_phase="configure" + eval "${setup_testenv}" + + if test ${do_configure} = no && test -f "${test_workdir}/Makefile"; then + return 0 + fi + + mkdir -p "${test_logdir}" + + phase_start "configuring for ${testname} ..." + ( set -e + mkdir -p "${test_workdir}" + cd "${test_workdir}" + cmd="${test_srcdir}/configure" + cmd="${cmd} --prefix=\"${test_prefix}\"" + cmd="${cmd} CPP=\"${mc_cpp}\"" + cmd="${cmd} CPPFLAGS=\"${mc_cppflags}\"" + cmd="${cmd} CC=\"${mc_cc}\"" + cmd="${cmd} CFLAGS=\"${mc_cflags}\"" + cmd="${cmd} LDFLAGS=\"${mc_ldflags}\"" + cmd="${cmd} ${mc_configure_args_pre}" + cmd="${cmd} ${configure_args}" + cmd="${cmd} ${mc_configure_args_post}" + echo "running $cmd" + eval "$cmd" + ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}" +} + +confbuild_make() { + make_target="$1" + test_phase="make_${make_target}" + eval "${setup_testenv}" + + if eval "test \${do_make_${make_target}} = no"; then + return 0 + fi + + mkdir -p "${test_logdir}" + + phase_start "running \"make ${make_target}\" for ${testname} ..." + ( cd "${test_workdir}" \ + && eval "${mc_make} ${mc_make_flags} ${make_target}" + ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}" +} + +confbuild() { + failed=no + + confbuild_cleanwork + if test ${failed} = yes; then return 0; fi + + confbuild_configure + if test ${failed} = yes; then return 0; fi + + confbuild_make "clean" + if test ${failed} = yes; then return 0; fi + + confbuild_make "all" + if test ${failed} = yes; then return 0; fi + + confbuild_make "install" + if test ${failed} = yes; then return 0; fi +} + + +test_plain() { + testname="plain" \ + configure_args="" \ + confbuild +} + +test_charset() { + testname="charset" \ + configure_args="--enable-charset" \ + confbuild +} + +test_no_charset() { + testname="no_charset" \ + configure_args="--disable-charset" \ + confbuild +} + +test_X11() { + testname="X11" \ + configure_args="--with-x" \ + confbuild +} + +test_no_X11() { + testname="no_X11" \ + configure_args="--without-x" \ + confbuild +} + +test_vfs() { + testname="vfs" \ + configure_args="--with-vfs" \ + confbuild +} + +test_no_vfs() { + testname="no_vfs" \ + configure_args="--without-vfs" \ + confbuild +} + +test_mcfs() { + testname="mcfs" \ + configure_args="--with-mcfs" \ + confbuild +} + +test_no_mcfs() { + testname="no_mcfs" \ + configure_args="--without-mcfs" \ + confbuild +} + +test_samba() { + testname="samba" \ + configure_args="--with-samba" \ + confbuild +} + +test_no_samba() { + testname="no_samba" \ + configure_args="--without-samba" \ + confbuild +} + +test_ext2undel() { + testname="ext2undel" \ + configure_args="--with-ext2undel" \ + confbuild +} + +test_no_ext2undel() { + testname="no_ext2undel" \ + configure_args="--without-ext2undel" \ + confbuild +} + +test_slang() { + testname="slang" \ + configure_args="--with-screen=slang" \ + confbuild +} + +test_mcslang() { + testname="mcslang" \ + configure_args="--with-screen=mcslang" \ + confbuild +} + +test_ncurses() { + testname="ncurses" \ + configure_args="--with-screen=ncurses" \ + confbuild +} + +test_maintainer() { + testname="maintainer" \ + configure_args="--enable-maintainer-mode" \ + confbuild +} + +test_no_maintainer() { + testname="no_maintainer" \ + configure_args="--disable-maintainer-mode" \ + confbuild +} + +test_i18n() { + testname="i18n" \ + configure_args="--enable-nls" \ + confbuild +} + +test_no_i18n() { + testname="no_i18n" \ + configure_args="--disable-nls" \ + confbuild +} + +test_no_features() { + testname="no_features" \ + configure_args="${configure_args_disable_all}" + confbuild +} + +test_all_features() { + testname="all_features" \ + configure_args="${configure_args_enable_all}" \ + confbuild +} + +test_all_warnings() { + testname="all_warnings" \ + configure_args="${configure_args_enable_all} --enable-gcc-warnings" \ + confbuild +} + +run_tests() { + failed=no + + preconf_download + if test ${failed} = yes; then return 0; fi + + preconf_autoconf + if test ${failed} = yes; then return 0; fi + + for i in "$@"; do + if type test_"${i}" 2>/dev/null \ + | grep "function" 1>/dev/null 2>&1; then + eval "test_${i}" + else + echo "[`date`] test \"$i\" not found." 1>&2 + errors=`expr $errors + 1` + fi + done +} + +if test -z "${mc_srcdir}"; then mc_srcdir="${mc_basedir}/src"; fi +if test -z "${mc_prefixdir}"; then mc_prefixdir="${mc_basedir}/installed"; fi +if test -z "${mc_builddir}"; then mc_builddir="${mc_basedir}/build"; fi +if test -z "${mc_logdir}"; then mc_logdir="${mc_basedir}/logs"; fi +if test -z "${mc_cpp}"; then mc_cpp="${mc_cc} -E"; fi + +if test ${do_clean_basedir} = yes; then + phase_start "cleaning up everything ..." + { rm -rf "${mc_basedir}" + } && phase_ok || phase_failed +else + if test $# -gt 0; then + run_tests "$@" + else + run_tests `sed -n -e 's,^test_\([a-z0-9_]*\)() .*{,\1,p' $0` + fi +fi + +if test ${errors} -ne 0 || test ${warnings} -ne 0; then + echo "[`date`] finished with ${errors} errors and ${warnings} warnings." +else + echo "[`date`] finished successfully." +fi +exit ${errors}