#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
REPOSITORY="$(git -C "${ROOT}" rev-parse --show-toplevel)"
RESOLVED_COMMIT="$(git -C "${REPOSITORY}" rev-parse "${1:-HEAD}^{commit}")"
OUTPUT="${ROOT}/results/clean-export" TEMPORARY="$(mktemp -d)"
readonly ROOT REPOSITORY RESOLVED_COMMIT OUTPUT TEMPORARY
trap 'rm -rf "${TEMPORARY}"' EXIT
mkdir -p "${OUTPUT}"
printf 'git archive %q editorial/reproductions/svc-03 | tar -x\n' "${RESOLVED_COMMIT}" >"${OUTPUT}/command.txt"
git -C "${REPOSITORY}" archive "${RESOLVED_COMMIT}" editorial/reproductions/svc-03 | tar -x -C "${TEMPORARY}"
EXPORTED="${TEMPORARY}/editorial/reproductions/svc-03"; readonly EXPORTED
"${EXPORTED}/run.sh" >"${OUTPUT}/output.txt.tmp" 2>&1
compare() {
  local relative="$1" label="$2" clean_hash working_hash
  clean_hash="$(sha256sum "${EXPORTED}/${relative}" | cut -d' ' -f1)"; working_hash="$(sha256sum "${ROOT}/${relative}" | cut -d' ' -f1)"
  [[ "${clean_hash}" == "${working_hash}" ]] || { echo "clean ${label} differs" >&2; exit 1; }
  printf '%s_sha256=%s\n' "${label}" "${clean_hash}"
}
record() {
  local relative="$1" label="$2" clean_hash
  clean_hash="$(sha256sum "${EXPORTED}/${relative}" | cut -d' ' -f1)"
  printf '%s_sha256=%s\n' "${label}" "${clean_hash}"
}
{
  printf 'resolved_commit=%s\n' "${RESOLVED_COMMIT}"
  compare results/verification/results/output.txt verifier
  compare results/analysis/topologies/output.txt topologies
  compare results/analysis/comparison/output.txt comparison
  record results/sources/primary/output.txt clean_primary_sources
  compare results/provenance/manifest/output.txt source_manifest
  compare results/diffs/MUT-06/output.txt failure_diff
  compare results/diffs/MUT-14/output.txt context_diff
  printf 'exit_code=0\n'
} >"${OUTPUT}/metadata.txt"
sed -E -e 's/[[:space:]]+$//' -e '${/^$/d;}' "${OUTPUT}/output.txt.tmp" >"${OUTPUT}/output.txt"; rm "${OUTPUT}/output.txt.tmp"
echo "Clean export verified at ${RESOLVED_COMMIT}"
