Files
steipete--codexbar/Scripts/check_repository_size.sh
T
2026-07-13 12:22:33 +08:00

59 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
MAX_BYTES=$((2 * 1024 * 1024))
failures=0
tracked_files=0
declare -a blob_paths=()
declare -a blob_ids=()
cd "$ROOT_DIR"
while IFS= read -r -d '' entry; do
metadata=${entry%%$'\t'*}
path=${entry#*$'\t'}
read -r mode object stage <<<"$metadata"
[[ "$stage" == "0" ]] || continue
tracked_files=$((tracked_files + 1))
case "$path" in
*.app | *.app/* | *.dSYM | *.dSYM/* | *.xcarchive/* | *.xcresult/* | *.ipa | *.zip | *.delta | *.dmg | \
*.pkg | *.tar.gz | *.tgz)
printf 'ERROR: generated artifact is tracked: %s\n' "$path" >&2
failures=$((failures + 1))
;;
esac
# Submodule entries name commits rather than file blobs.
[[ "$mode" == "160000" ]] && continue
blob_paths+=("$path")
blob_ids+=("$object")
done < <(git ls-files --stage -z)
if ((${#blob_ids[@]} > 0)); then
index=0
while read -r object type size; do
path=${blob_paths[$index]}
if [[ "$type" != "blob" ]]; then
printf 'ERROR: tracked index entry is not a readable blob: %q (%s)\n' "$path" "$object" >&2
failures=$((failures + 1))
index=$((index + 1))
continue
fi
if ((size > MAX_BYTES)); then
printf 'ERROR: tracked file exceeds %d bytes: %q (%d bytes)\n' "$MAX_BYTES" "$path" "$size" >&2
failures=$((failures + 1))
fi
index=$((index + 1))
done < <(printf '%s\n' "${blob_ids[@]}" | git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize)')
fi
if ((failures > 0)); then
printf 'Repository size check failed with %d violation(s).\n' "$failures" >&2
printf 'Publish build/release artifacts outside Git and optimize required source assets.\n' >&2
exit 1
fi
printf 'repository size OK: %d tracked files, maximum %d bytes each\n' "$tracked_files" "$MAX_BYTES"