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

limit_bytes="${GIT_MAX_FILE_SIZE_BYTES:-52428800}"
limit_mb=$((limit_bytes / 1024 / 1024))
failed=0

format_size() {
  local bytes="$1"
  awk -v bytes="$bytes" 'BEGIN {
    if (bytes >= 1073741824) {
      printf "%.1fGB", bytes / 1073741824
    } else if (bytes >= 1048576) {
      printf "%.1fMB", bytes / 1048576
    } else if (bytes >= 1024) {
      printf "%.1fKB", bytes / 1024
    } else {
      printf "%dB", bytes
    }
  }'
}

while IFS= read -r -d '' path; do
  size="$(git cat-file -s ":$path" 2>/dev/null || printf '0')"
  if [ "$size" -gt "$limit_bytes" ]; then
    if [ "$failed" -eq 0 ]; then
      printf '\nLarge files are not allowed in git. Limit: %sMB\n\n' "$limit_mb" >&2
    fi
    printf '  %s  %s\n' "$(format_size "$size")" "$path" >&2
    failed=1
  fi
done < <(git diff --cached --name-only -z --diff-filter=ACMR)

if [ "$failed" -ne 0 ]; then
  cat >&2 <<'EOF'

Move large files to S3/CDN or local storage, then commit only the URL/metadata.
To override the limit locally for one commit, set GIT_MAX_FILE_SIZE_BYTES, but avoid doing that for media/archive files.
EOF
  exit 1
fi
