#!/usr/bin/env bash
set -Eeuo pipefail

if [[ $# -lt 1 || $# -gt 2 || ! -r $1 ]]; then
  echo "Usage: $0 <env-file> [backup-directory]" >&2
  exit 2
fi

config_file=$(cd -- "$(dirname -- "$1")" && pwd)/$(basename -- "$1")
script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
backup_dir=${2:-"$script_dir/backups"}
mkdir -p "$backup_dir"
backup_dir=$(cd -- "$backup_dir" && pwd)

compose=(docker compose --env-file "$config_file" -f "$script_dir/compose.yaml")
was_running=$("${compose[@]}" ps --status running --services | grep -x gerrit || true)
restart_gerrit() {
  if [[ $was_running == gerrit ]]; then
    "${compose[@]}" up -d gerrit >/dev/null
  fi
}
trap restart_gerrit EXIT INT TERM

if [[ $was_running == gerrit ]]; then
  "${compose[@]}" stop gerrit
fi

for directory in gerrit_git gerrit_etc gerrit_db gerrit_data gerrit_plugins; do
  [[ -d "$script_dir/data/$directory" ]] || { echo "Missing data/$directory" >&2; exit 1; }
done

archive="$backup_dir/gerrit-$(date +%Y%m%d-%H%M%S).tar.gz"
tar --numeric-owner -C "$script_dir" -czf "$archive" \
  data/gerrit_git \
  data/gerrit_etc \
  data/gerrit_db \
  data/gerrit_data \
  data/gerrit_plugins
sha256sum "$archive" > "$archive.sha256"

trap - EXIT INT TERM
restart_gerrit
printf 'Backup: %s\nChecksum: %s\n' "$archive" "$archive.sha256"
