#!/bin/bash
# Verifies certain criteria before pushing.

set -u

echo 'Starting pre-push hook'

branch=$(git branch --show-current)
if [[ ${branch} == scratch ]]; then
  echo "Ignoring branch: ${branch}"
  exit
fi

messages=()
while read -r _ local_oid _ remote_oid; do
  range="${remote_oid}..${local_oid}"
  while read -r filename; do
    echo "examining: ${filename}"
    us_ver=''
    doc_ver=''
    lib_ver=''

    case ${filename} in
      *.js)
        us_ver=$(git diff "${range}" "${filename}" |
          awk '/^\+\/\/ @version/ {print $NF}')

        [[ -z ${us_ver} ]] && messages+=("${filename} needs a UserScript bump.")
        ;;
      *) ;;
    esac

    case ${filename} in
      *.js)
        doc_ver=$(git diff "${range}" "${filename}" |
          awk '/^\+ \* @version/ {print $NF}')

        [[ -z ${doc_ver} ]] && messages+=("${filename} needs a JSDoc bump.")
        ;;
      *) ;;
    esac

    case ${filename} in
      *.user.js) ;;
      *.js)
        lib_ver=$(git diff "${range}" "${filename}" |
          awk '/^\+  const version = / {
                      sub(/;/, "")
                      print $NF
                    }')
        if [[ -z ${lib_ver} ]]; then
          messages+=("${filename} needs an internal version bump.")
        fi
        ;;
      *) ;;
    esac

    case ${filename} in
      *.user.js) ;;
      *.js)
        if [[ "${us_ver}" != "${lib_ver}" ]]; then
          messages+=("${filename} versions do not match: US:${us_ver} LIB:${lib_ver}")
        fi
        if [[ "${doc_ver}" != "${lib_ver}" ]]; then
          messages+=("${filename} versions do not match: DOC:${doc_ver} LIB:${lib_ver}")
        fi
        ;;
      *) ;;
    esac

    if [[ "${us_ver}" != "${doc_ver}" ]]; then
      messages+=("${filename} versions do not match: US:${us_ver} DOC:${doc_ver}")
    fi

  done < <(git diff --name-only "${range}")

  cnt=${#messages[*]}

  if ((cnt)); then
    echo "Issues found (${cnt}):"
    for msg in "${messages[@]}"; do
      echo "${msg}"
    done
    exit 1
  fi
done
echo 'Pre-push hook success!'
