#!/bin/bash

set -e

SELF=$(basename "$0")
GEN_DATA_DIR=releng_generated_data
CLOG=${GEN_DATA_DIR}/log.${SELF}

PASSED_OPTIONS=""

if   [ "${1}" == "-cleanup" ]; then
 PASSED_OPTIONS="-cleanup"
elif [ "${1}" == "-rc" -a "${2}" == "-keep" ]; then
 PASSED_OPTIONS="-rc -keep"
elif [ "${1}" == "-rc" ]; then
 PASSED_OPTIONS="-rc"
else
cat << HLP

${SELF} runs executables from CWD starting with releng_*.
stdout/stderr output stored in ${CLOG}

 ${SELF} -rc [-keep]
 ${SELF} -cleanup

HLP
 exit 101
fi

########################################################
 if [ -f "${CLOG}" ]; then
   mv "${CLOG}" "${CLOG}".prev
 fi
 > ${CLOG}
 DSTART=`date --utc`
 printf "\n${SELF}: Started at ${DSTART}"
 E1=`date '+%s'`
 # require ^releng_, avoid running (your)self explicitly
 for s in `ls | grep ^releng_ | grep -v ${SELF} | sort -n`; do
  if [ -x ${s} -a ! -d ${s} ]; then
    # tee(1) does trailing \n, which is unwanted in that case
    printf  "\n${SELF}: Running ./${s} ${PASSED_OPTIONS}..."
    echo -e "\n${SELF}: Running ./${s} ${PASSED_OPTIONS}..." >> ${CLOG}
    echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" >> ${CLOG}
    T1=`date '+%s'`
    set +e
    ./${s} ${PASSED_OPTIONS} &>> ${CLOG}
    RET=$?
    T2=`date '+%s'`
    let TS="${T2} - ${T1}"
    case ${RET} in
         0)
           printf "done in ${TS} sec. ok."
           ;;
         *)
           printf "done in ${TS} sec. FAIL. EXIT CODE: $RET;"
           ;;
    esac
    set -e
  fi
 done

 DEND=`date --utc`
 printf "\n${SELF}: Stopped at ${DEND}."
 
 if   [ "${1}" == "-cleanup" ]; then
      if [ -f "${CLOG}" ]; then rm -f "${CLOG}"; fi
      if [ -f "${CLOG}".prev ]; then rm -f "${CLOG}".prev; fi      
 else
      E2=`date '+%s'`
      let ES="${E2} - ${E1}"
      printf " Total elapsed ${ES} sec."

      #####
      printf "\n${SELF}: Std(out|err) logged in ${CLOG}."
      printf "\n${SELF}: Trivial log file examination:"
      printf "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
      # severity classes of libdax_msgs.h in libburn and libisofs
      # List of boring keywords:
      #   'UPDATE' A pacifier message during long running operations.
      # List of interesting keywords:
        # thrown by xorriso and underlying libraries
      LIST_KWD="(NEVER|ABORT|FATAL|FAILURE|MISHAP|SORRY|WARNING|HINT|NOTE|DEBUG|ALL"
        # thrown by others
      LIST_KWD+="|FAIL)"

      if [ -f "${CLOG}" ]; then
          set +e
	  # lines, perl regex, leading tabs
          grep -n -PT "${LIST_KWD}" "${CLOG}"
	  RET_GREP="$?"
          case ${RET_GREP} in
              0) # found
                 ;;
              1) # not found
		 printf "\n${SELF}: Log file looks clear.\n"
                 ;;
	      *) #
                 printf "\n${SELF}: grep returned EXIT CODE: ${RET_GREP}.\n"
		 ;;
          esac
	  set -e
      fi
      printf "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"

      ##### TODO: work out a less noisy diff'ing technique!
      if [ -f "${CLOG}".prev -a -f "${CLOG}" ]; then
        printf "${SELF}: See diff against previous log file (might be long):\n"
	printf "diff -Naur ${CLOG}.prev ${CLOG} | less"
      fi
 fi

 printf "\n"

 exit 0