#!/bin/bash

# To deploy this script:
# cd ../.git/hooks
# ln -s ../../bin/git-hook_pre-commit pre-commit
#
# See http://www.davidpashley.com/articles/writing-robust-shell-scripts.html
# exit when encountering undeclared variables
set -u;

# exit when encountering a non-zero exit status
# (disabled here as we do are own checking)
# set -e;

## BEGIN Layout variables ==================================================
NODE_EXE=$(which node);
LINK_PATH=$(readlink -f -- "${0}");
BIN_PATH=$(cd "${LINK_PATH%/*}" && echo "${PWD}");
GGG_DIR=$(cd "$(git rev-parse --show-toplevel)" && pwd );
PKG_FILE=$(find "${GGG_DIR}" -type f -wholename "${GGG_DIR}/package.json" );
PKG_DIR=$(dirname "${PKG_FILE}");
MODS_DIR=$(find "${GGG_DIR}" -type d -wholename "${GGG_DIR}/node_modules" );
WAPP_DIR=$(dirname "${MODS_DIR}");
JSLINT_EXE="${MODS_DIR}/.bin/jslint";
NU_EXE="${MODS_DIR}/.bin/nodeunit";
NU_FILE="${WAPP_DIR}/test/t.js";
MAKEDOC_EXE="${GGG_DIR}/bin/make_doc";
LIST_FILE="/tmp/git-pre-commit.${$}.list.tmp";
TMP_FILE="/tmp/git-pre-commit.${$}.tmp";
CHECK_STR="";
## END Layout variables ====================================================

## BEGIN Debug
# echo "
# NODE_EXE     : ${NODE_EXE}
# LINK_PATH    : ${LINK_PATH}
# BIN_PATH     : ${BIN_PATH}
# GGG_DIR      : ${GGG_DIR}
# PKG_FILE     : ${PKG_FILE}
# PKG_DIR      : ${PKG_DIR}
# MODS_DIR     : ${MODS_DIR}
# WAPP_DIR     : ${WAPP_DIR}
# JSLINT_EXE   : ${JSLINT_EXE}
# NU_EXE       : ${NU_EXE}
# NU_FILE      : ${NU_FILE}
# MAKEDOC_EXE  : ${MAKEDOC_EXE}
# LIST_FILE    : ${LIST_FILE}
# TMP_FILE     : ${TMP_FILE}
# CHECK_STR    : ${CHECK_STR}
# ";
# exit 0;
## END Debug

## BEGIN Lint JavaScript files =============================================
if [ ! -x "${JSLINT_EXE}" ]; then
  echo "JSLint executable not found."
  echo "Please execute the following command: "
  echo "  cd ${WAPP_DIR}; npm install ";
  exit 1;
fi

cd "${GGG_DIR}";
pwd;

git status \
  | grep '.js$' \
  | grep -v '/vendor/' \
  | grep -v 'pcss._ex004_.js' \
  | grep '^\s\+\(modified\|new file\)' \
  | cut -d ":" -f 2- > "${LIST_FILE}"

## BEGIN Debug
# echo ">>>>${LIST_FILE}<<<<";
# echo ">>>>LIST_FILE:";
# cat "${LIST_FILE}";
# echo "<<<<";
# exit 1;
## END Debug

echo;
echo "Tests of updated or new *.js files ...";
cat "${LIST_FILE}" | while read FILE_NAME; do
  echo "====> ${FILE_NAME}";
  CHECK_STR=$(${JSLINT_EXE} "${FILE_NAME}");
  CHECK_CODE=$?;
  if [ "${CHECK_CODE}" -gt 0 ]; then
    echo "  JSLint check FAILED";
    echo "  ${CHECK_STR}";
  fi;
  CHECK_STR=$(grep -nP '\t' "${FILE_NAME}");
  if [ ! -z "${CHECK_STR}" ]; then
    echo "  Tab check FAILED";
    echo "  ${CHECK_STR}";
    echo;
  fi
  CHECK_STR=$(grep -nP '\s+$' ${FILE_NAME});
  if [ ! -z "${CHECK_STR}" ]; then
    echo "  Trailing space check FAILED";
    echo "  ${CHECK_STR}";
    echo;
  fi
  CHECK_STR=$(grep '^\s*.use strict.;$' ${FILE_NAME});
  if [ -z "${CHECK_STR}" ]; then
    echo "  Strict use check FAILED";
    echo "  Please add 'use strict'; at the top of your module function.";
    echo;
  fi
  echo "<====";
  echo;
done | tee "${TMP_FILE}";

echo "Tests complete";
if grep -qs 'FAIL' "${TMP_FILE}"; then
  echo "Checks did not pass.";
  echo "  Please fix the problem files and commit again.";
  rm "${TMP_FILE}";
  exit 1;
fi

rm "${TMP_FILE}";
rm "${LIST_FILE}";

echo;
## END Lint JavaScript files ===============================================

## BEGIN Process changed documents ========================================
## TODO
##  if [ ! -x "${MAKEDOC_EXE}" ]; then
##    echo "bin/make_doc not found.  This file should exist.";
##    echo "Please check your installation.";
##    exit 1;
##  fi
##  echo "Updating HTML documents from MarkDown";
##  "${MAKEDOC_EXE}";
##  RET_VAL=$?;
##  if [ "${RET_VAL}" -eq "0" ]; then
##    echo "Document file failure".
##    echo "Please check your installation.";
##    exit "${RET_VAL}";
##  fi
##
## END Process changed documents ==========================================

## BEGIN Run regression tests ==============================================
if [ ! -x "${NODE_EXE}" ]; then
  echo "Node not found.  Please install nodejs and ensure it is "
  echo " found in your PATH environment variable."
  exit 1;
fi

if [ ! -x "${NU_EXE}" ]; then
  echo "Nodeunit not found.  Please run "
  echo "cd ${WAPP_DIR}; npm install"
  echo
fi

if [ ! -r "${NU_FILE}" ]; then
  echo "Nodeunit file ${NU_FILE} not found."
  echo "Please ensure it exists."
  echo
  exit 1;
fi

echo "Running regression tests";
"${NU_EXE}" "${NU_FILE}"
exit $?;
## END Run regression tests ================================================
