#!/bin/bash
set -euo pipefail
umask 022

releases_dir="/var/www/html/randomdrift/.EACompanion-releases"
publish_dir="/var/www/html/randomdrift/.EACompanion-publish"
public_link="${publish_dir}/current"
original_command="${SSH_ORIGINAL_COMMAND:-}"

if [[ ! "${original_command}" =~ ^deploy\ ([0-9a-f]{40})$ ]]; then
  echo "Invalid deployment command" >&2
  exit 1
fi

revision="${BASH_REMATCH[1]}"
release_dir="${releases_dir}/${revision}"

exec 9>/var/lib/eacompanion/deploy.lock
flock -n 9 || exit 1

if [[ ! -f "${release_dir}/index.html" ]]; then
  archive_path="$(mktemp /var/lib/eacompanion/artifact.XXXXXX.tar.gz)"
  staging_dir="$(mktemp -d "${releases_dir}/.incoming.XXXXXX")"

  cleanup() {
    case "${archive_path}" in
      /var/lib/eacompanion/artifact.*.tar.gz) rm -f -- "${archive_path}" ;;
    esac
    case "${staging_dir}" in
      "${releases_dir}"/.incoming.*) rm -rf -- "${staging_dir}" ;;
    esac
  }
  trap cleanup EXIT

  cat > "${archive_path}"
  tar --extract --gzip --file "${archive_path}" --directory "${staging_dir}" \
    --no-same-owner --no-same-permissions

  if [[ ! -f "${staging_dir}/index.html" ]]; then
    echo "Artifact does not contain index.html" >&2
    exit 1
  fi
  if find "${staging_dir}" -type l -print -quit | grep -q .; then
    echo "Artifact contains a symbolic link" >&2
    exit 1
  fi

  chmod -R a+rX,u+w "${staging_dir}"
  mv "${staging_dir}" "${release_dir}"
  rm -f -- "${archive_path}"
  trap - EXIT
fi

temporary_link="${public_link}.new"
ln -sfn "${release_dir}" "${temporary_link}"
mv -Tf "${temporary_link}" "${public_link}"
