diff options
Diffstat (limited to 'bin/continuous_build.sh')
-rwxr-xr-x | bin/continuous_build.sh | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/bin/continuous_build.sh b/bin/continuous_build.sh new file mode 100755 index 0000000..6f47c69 --- /dev/null +++ b/bin/continuous_build.sh @@ -0,0 +1,126 @@ +# /bin/sh +# $Id$ +# vim:et:ft=sh:sts=2:sw=2 +# +# Copyright 2010 Kate Ward. All Rights Reserved. +# Author: kate.ward@forestent.com (Kate Ward) +# +# Continuous build script for shell library testing. +# +# Sample usages: +# $ blah + +# treat unset variables as an error +set -u + +# global constants +ARGV0=`basename "$0"` +ARGV0_DIR=`dirname "$0"` +SHLIB_DIR="${ARGV0_DIR}/../lib" + +# load libraries +. ${SHFLAGS_LIB:-${SHLIB_DIR}/shflags} \ + || (echo 'unable to load shflags library' >&2; exit 1) +. ${VERSIONS_LIB:-${SHLIB_DIR}/versions} \ + || (echo 'unable to load versions library' >&2; exit 1) + +OUTPUT_FILE="${VERSIONS_OS_NAME}_${VERSIONS_OS_RELEASE}" + +# define flags +DEFINE_string 'command' '' 'the command to start a build' 'c' +DEFINE_string 'watch' '' 'file to watch for changes' 'w' +DEFINE_string 'watch_from' '' 'file containing filenames to watch' 'W' +DEFINE_string 'output' "${OUTPUT_FILE}" 'output file to write to' 'o' +DEFINE_string 'output_dir' '.' 'directory to write output file' 'O' +DEFINE_integer 'pause' 60 'pause between successive runs (sec)' 'p' + +FLAGS_HELP="USAGE: ${ARGV0} [flags]" + +#------------------------------------------------------------------------------ +# functions +# + +# This function exits the script, optionally printing a message +# +# Args: +# message: string: an error message to be output (optional) +# Output: +# string: usable flags +die() { + [ $# -ne 0 ] && echo "$@" >&2 + flags_help + exit 1 +} + +# Function to give the current date in ISO format +# +# Args: +# none +# Output: +# string: isodate +isodate() { + date -u '+%Y%m%dT%H%M%SZ' +} + +age() { + awkScript='' + case ${VERSIONS_OS_NAME} in + FreeBSD|Solaris) awkScript='{print $6,$7,$8}' ;; + Linux) awkScript='{print $6,$7}' ;; + *) echo "unrecognized OS name (${VERSIONS_OS_NAME})" >&2 ;; + esac + ls -l "$1" |awk "${awkScript}" +} + +#------------------------------------------------------------------------------ +# main +# + +main() +{ + # checks + [ -n "${FLAGS_command}" ] || die 'command required' + [ -z "${FLAGS_watch}" -a -z "${FLAGS_watch_from}" ] \ + && die 'one of watch or watch_from required' + [ -n "${FLAGS_watch}" -a -n "${FLAGS_watch_from}" ] \ + && die 'only one of watch or watch_from can be specified' + [ -r "${FLAGS_watch}" ] || die 'unable to read watch file' + [ -w "${FLAGS_output_dir}" ] || die 'unable to write to output directory' + + watchAge=`age "${FLAGS_watch}"` + watchAgePrev=${watchAge} + + # build + while true; do + if [ ! "${watchAge}" == "${watchAgePrev}" ]; then + date=`isodate` + echo "building ${VERSIONS_OS_NAME}-${VERSIONS_OS_RELEASE} @ ${date}" + outputFileDated="${FLAGS_output}-${date}" + ${FLAGS_command} >"${FLAGS_output_dir}/${outputFileDated}" 2>&1 + + ( cd "${FLAGS_output_dir}"; + rm -f "${FLAGS_output}"; + ln -s "${outputFileDated}" "${FLAGS_output}"; + grep FAIL "${FLAGS_output}"; ) + + watchAgePrev=${watchAge} + fi + + watchAge=`age "${FLAGS_watch}"` + if [ "${watchAge}" == "${watchAgePrev}" ]; then + echo 'sleeping...' + while [ "${watchAge}" == "${watchAgePrev}" ]; do + sleep ${FLAGS_pause} + watchAge=`age "${FLAGS_watch}"` + done + fi + done +} + +# execute main() if this is run in standalone mode (i.e. not in a unit test) +argv0=`echo "${ARGV0}" |sed 's/_test$//;s/_test\.sh$//'` +if [ "${ARGV0}" = "${argv0}" ]; then + FLAGS "$@" || exit $? + eval set -- "${FLAGS_ARGV}" + if [ $# -gt 0 ]; then main "$@"; else main; fi +fi |