#!/bin/sh

CLASSPATH_CVS=~/mauve/classpath
CLASSPATH_PREFIX=~/mauve/root/classpath
MAUVE_CVS=~/mauve/mauve
KISSME_CVS=~/mauve/kissme
KISSME_PREFIX=~/mauve/root/kissme
KISSME_BIN=~/mauve/kissme/useful_scripts/kissme
LOG=/tmp/mauve.log
RESULTS=/tmp/kissme-mauve.txt
REPORT=/tmp/kissme-mauve-report.txt
TIMEOUT=30

rm -f ${LOG} > /dev/null 2>&1
rm -f ${RESULTS} > /dev/null 2>&1
today=`date`
echo "${today}" > ${LOG}
touch ${RESULTS}


_aclocal ()
{
  aclocal "$@" >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error running aclocal"
    exit 1
  fi
}

_autoheader ()
{
  autoheader "$@" >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error running autoheader"
    exit 1
  fi
}

_automake ()
{
  automake "$@" >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error running automake"
    exit 1
  fi
}

_autoconf ()
{
  autoconf "$@" >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error running autoconf"
    exit 1
  fi
}

classpath_checkout ()
{
  if [ ! -d "${CLASSPATH_CVS}" ]; then
    mkdir --parents ${CLASSPATH_CVS}
    local dir=`dirname "${CLASSPATH_CVS}"`
    cd "${dir}"
    cvs -z3 -d :pserver:anoncvs@subversions.gnu.org:/cvsroot/classpath co classpath >> ${LOG} 2>/dev/null
    if [ $? -ne 0 ]; then
      echo "Error checking out classpath"
      exit 1
    fi
  fi
}

classpath_update ()
{
  cd "${CLASSPATH_CVS}" && cvs update -d -P . >> ${LOG} 2>/dev/null
  if [ $? -ne 0 ]; then
    echo "Error checking out classpath"
    exit 1
  fi
}

classpath_clean ()
{
  if [ -d "${CLASSPATH_CVS}/build" ]; then
    rm -rf "${CLASSPATH_CVS}/build"
  fi
  if [ -d "${CLASSPATH_PREFIX}" ]; then
    rm -rf "${CLASSPATH_PREFIX}"
  fi
  mkdir --parents "${CLASSPATH_CVS}/build"
  mkdir --parents "${CLASSPATH_PREFIX}"
}

classpath_configure ()
{
  cd "${CLASSPATH_CVS}"

  _aclocal
  _autoheader
  _automake
  _autoconf

  cd "${CLASSPATH_CVS}/build" && ../configure --prefix=${CLASSPATH_PREFIX} --with-gcj --enable-jni >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error configuring"
    exit 1
  fi
}

classpath_build ()
{
  cd "${CLASSPATH_CVS}/build" && make >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error during make"
    exit 1
  fi
}

classpath_install ()
{
  cd "${CLASSPATH_CVS}/build" && make install >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error during make"
    exit 1
  fi
}

kissme_checkout ()
{
  if [ ! -d "${KISSME_CVS}" ]; then
    mkdir --parents ${KISSME_CVS}
    local dir=`dirname "${KISSME_CVS}"`
    cd "${KISSME_CVS}"
    cvs -z3 -d :pserver:anonymous@cvs.kissme.sourceforge.net:/cvsroot/kissme co . >> ${LOG} 2>/dev/null
    if [ $? -ne 0 ]; then
      echo "Error checking out kissme"
      exit 1
    fi
  fi
}

kissme_update ()
{
  cd "${KISSME_CVS}" && cvs update -d -P . >> ${LOG} 2>/dev/null
  if [ $? -ne 0 ]; then
    echo "Error checking out kissme"
    exit 1
  fi
}

kissme_clean ()
{
  if [ -d "${KISSME_CVS}/build" ]; then
    rm -rf "${KISSME_CVS}/build"
  fi
  if [ -d "${KISSME_PREFIX}" ]; then
    rm -rf "${KISSME_PREFIX}"
  fi
  mkdir --parents "${KISSME_CVS}/build"
  mkdir --parents "${KISSME_PREFIX}"
}

kissme_configure ()
{
  cd "${KISSME_CVS}"
  
  _aclocal
  _autoheader
  _automake -a
  _autoconf

  cd "${KISSME_CVS}" && ./configure --prefix=${KISSME_PREFIX} \
    --enable-use-zips --with-gnu-classpath=${CLASSPATH_CVS} \
    --with-gnu-classpath-build=${CLASSPATH_CVS}/build \
    --with-classpath-install-dir=${CLASSPATH_PREFIX} >> ${LOG} 2>&1

  if [ $? -ne 0 ]; then
    echo "Error configuring"
    exit 1
  fi
}

kissme_build ()
{
  cd "${KISSME_CVS}" && make >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error during make"
    exit 1
  fi
}

kissme_install ()
{
  cd "${KISSME_CVS}" && make install >> ${LOG} 2>&1
  if [ $? -ne 0 ]; then
    echo "Error during make"
    exit 1
  fi
}

mauve_checkout ()
{
  if [ ! -d "${MAUVE_CVS}" ]; then
    mkdir --parents ${MAUVE_CVS}
    local dir=`dirname "${MAUVE_CVS}"`
    cd "${dir}"
    cvs -z3 -d :pserver:anoncvs@sources.redhat.com:/cvs/mauve co mauve >> ${LOG} 2>/dev/null
    if [ $? -ne 0 ]; then
      echo "Error checking out mauve"
      exit 1
    fi
  fi
}

mauve_update ()
{
  cd "${MAUVE_CVS}" && cvs update -d -P . >> ${LOG} 2>/dev/null
  if [ $? -ne 0 ]; then
    echo "Error checking out mauve"
    exit 1
  fi
}

kissme_mauve ()
{
  export JAVAC="jikes -bootclasspath ${CLASSPATH_PREFIX}/share/classpath/glibj.zip"
  export JAVA="${KISSME_BIN}"

#  if [ -f "${KISSME_CVS}/useful_scripts/mauve-kissme" ]; then
#    cp -f "${KISSME_CVS}/useful_scripts/mauve-kissme" "${MAUVE_CVS}"
#  fi

  if [ -f "${CLASSPATH_CVS}/mauve-classpath" ]; then
    cp -f "${CLASSPATH_CVS}/mauve-classpath" "${MAUVE_CVS}"
  fi

  cd "${MAUVE_CVS}"
  if [ $? -ne 0 ]; then
    echo "Error configuring mauve"
    exit 1
  fi

  _aclocal
  _automake
  _autoconf

  ./configure >> "${LOG}" 2>&1
  if [ $? -ne 0 ]; then
    echo "Error configuring mauve"
    exit 1
  fi

  # create class choices from key file
  if [ -f classes ]; then 
    rm -f classes 2>/dev/null
  fi
  if [ -f choices ]; then
    rm -f choices 2>/dev/null
  fi
  /bin/sh choose "${MAUVE_CVS}" classpath
  if [ $? -ne 0 ]; then
    echo "Error during choose for mauve"
    exit 1
  fi

  # compile classes
  compile=`cat "${MAUVE_CVS}/classes" | tr '.' '/' | awk '{print $1".java"}' | xargs`
  ${JAVAC} -classpath "${MAUVE_CVS}" -d "${MAUVE_CVS}" ${compile} >> "${LOG}" 2>&1
  if [ $? -ne 0 ]; then
    echo "Error during compile for mauve"
    exit 1
  fi

  set -m
  for i in `cat "${MAUVE_CVS}/classes"`; do
    echo "$i" | ${JAVA} gnu.testlet.SimpleTestHarness -verbose >> "${RESULTS}" 2>&1 &

    vm_pid=$!
    sleep ${TIMEOUT} && kill -9 $vm_pid > /dev/null 2>&1 && echo "FAIL: $i execution aborted" >> "${RESULTS}" &
    kill_pid=$!
    fg %- 2>/dev/null
    kill -9 $kill_pid >/dev/null 2>&1 # && echo Test did not time out
  done
}

mauve_summary ()
{
  if [ ! -f "${RESULTS}" ]; then
    echo "Error creating summary"
    exit 1
  fi

  pass_cnt=`grep PASS "${RESULTS}" | wc -l`
  fail_cnt=`grep FAIL "${RESULTS}" | wc -l`
  total_cnt=`expr $pass_cnt + $fail_cnt`

  today=`date`
  echo "Mauve test results for Kissme" > "${REPORT}"
  echo "Report generated on ${today}" >> "${REPORT}"
  echo "" >> "${REPORT}"
  echo "${fail_cnt} of ${total_cnt} tests failed." >> "${REPORT}"
  echo "" >> "${REPORT}"
  cat "${RESULTS}" >> "${REPORT}"
}

#--------------------------------------------------------------------
# Update Classpath CVS
#--------------------------------------------------------------------
classpath_checkout
classpath_update

#--------------------------------------------------------------------
# Build Classpath with GCJ 3.2
#--------------------------------------------------------------------
classpath_clean
classpath_configure
classpath_build
classpath_install

#--------------------------------------------------------------------
# Update Kissme CVS
#--------------------------------------------------------------------
kissme_checkout
kissme_update

#--------------------------------------------------------------------
# Build Kissme
#--------------------------------------------------------------------
kissme_clean
kissme_configure
kissme_build
#kissme_install

#--------------------------------------------------------------------
# Update Mauve CVS
#--------------------------------------------------------------------
mauve_checkout
mauve_update

#--------------------------------------------------------------------
# Execute Mauve
#--------------------------------------------------------------------
kissme_mauve

#--------------------------------------------------------------------
# Create report
#--------------------------------------------------------------------
mauve_summary
