#!/bin/zsh

set -e
set -x

source ${0:h}/config.sh
[[ -f ${0:h}/config.local.sh ]] && source ${0:h}/config.local.sh

MODE=
FILE=
INSTALL_COMMAND="make DESTDIR=TMPDIR install"
PACKAGE=

function fail {
  print -- "$@"
  exit 1
}

function run_build {
  local package tmpdir install_command

  package=${PACKAGE:-${PWD:t}}
  tmpdir=$HOME/tmp/install-${$}-${package}
  install_command=${INSTALL_COMMAND//TMPDIR/${tmpdir}}
  echo PACKAGE $PACKAGE package $package tmpdir $tmpdir install_command $install_command
  $DEBUG mkdir -p $tmpdir $PACKAGE_DIR
  trap "command rm -rf $tmpdir" EXIT

  $DEBUG eval ${install_command}

  $DEBUG cd ${tmpdir}${TARGET}
  $DEBUG tar czf ${PACKAGE_DIR}/${package}.tar.gz .
  $DEBUG cd ${tmpdir}/..
  $DEBUG rm -rf $tmpdir
  $DEBUG cd ${TARGET}
  $DEBUG tar xzf ${PACKAGE_DIR}/${package}.tar.gz
}

function run_uninstall {
  if [[ -z $FILE ]] fail "No file given"
  FILE=${FILE:a}
  if [[ ! -f $FILE ]] FILE=${PACKAGE_DIR}/${FILE}.tar.gz
  if [[ ! -f $FILE ]] fail "No such package: $FILE"

  local tmpfile=$(mktemp ${TMPDIR}/uninstallXXXXXX)
  trap "command rm -f $tmpfile" EXIT
  cd ${TARGET}
  tar tzf ${FILE} > ${tmpfile}
  grep -v '/$' ${tmpfile} | tr '\n' '\0' | xargs -0 $DEBUG rm -f
  grep    '/$' ${tmpfile} | perl -le '$/ = ""; print join("\n", reverse split(/\n/, <>))' | tr '\n' '\0' | xargs -0 $DEBUG rmdir || true
  command rm ${tmpfile}
}

function run_install {
  if [[ -z $FILE ]] fail "No file given"
  FILE=${FILE:a}
  if [[ ! -f $FILE ]] FILE=${PACKAGE_DIR}/${FILE}.tar.gz
  if [[ ! -f $FILE ]] fail "No such package: $FILE"

  cd ${TARGET}
  tar xzf ${FILE}
}

while [[ -n $1 ]]; do
  case $1 in
    build|-b)     MODE=build ;;
    uninstall|-u) MODE=uninstall; FILE=$2; shift ;;
    install|-i)   MODE=install;   FILE=$2; shift ;;
    package|-p)   PACKAGE=$2;              shift ;;
    command|-c)   INSTALL_COMMAND=$2;      shift ;;
    --)           shift ;                  break; ;;
    *)            fail "Unknown option $1"        ;;
  esac

  shift
done

if [[ -z $MODE ]] fail "No mode given"

run_${MODE} $@
