Files
steipete--codexbar/Scripts/regenerate-codex-parser-hash.sh
T
2026-07-13 12:22:33 +08:00

84 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SOURCE_DIR="${ROOT_DIR}/Sources/CodexBarCore/Vendored/CostUsage"
OUTPUT_FILE="${ROOT_DIR}/Sources/CodexBarCore/Generated/CodexParserHash.generated.swift"
MODE="${1:-write}"
case "$MODE" in
write | --write)
CHECK_ONLY=0
;;
check | --check)
CHECK_ONLY=1
;;
*)
echo "Usage: $0 [write|--write|check|--check]" >&2
exit 2
;;
esac
if command -v shasum >/dev/null 2>&1; then
HASH_CMD=(shasum -a 256)
elif command -v sha256sum >/dev/null 2>&1; then
HASH_CMD=(sha256sum)
else
echo "error: shasum or sha256sum is required" >&2
exit 1
fi
FILE_LIST="$(mktemp)"
trap 'rm -f "$FILE_LIST"' EXIT
find "$SOURCE_DIR" \
-type f \
-name '*.swift' \
! -name '*Claude*' \
-print |
sed "s#^${ROOT_DIR}/##" |
LC_ALL=C sort >"$FILE_LIST"
HASH="$(
while IFS= read -r file; do
printf '== %s ==\n' "$file"
cat "${ROOT_DIR}/${file}"
printf '\n'
done <"$FILE_LIST" | "${HASH_CMD[@]}"
)"
HASH="${HASH%% *}"
SHORT_HASH="${HASH:0:16}"
render_generated() {
cat <<SWIFT
// Generated by Scripts/regenerate-codex-parser-hash.sh. Do not edit by hand.
enum CodexParserHash {
static let value = "$SHORT_HASH"
}
SWIFT
}
if [[ "$CHECK_ONLY" -eq 1 ]]; then
EXPECTED_FILE="$(mktemp)"
trap 'rm -f "$FILE_LIST" "$EXPECTED_FILE"' EXIT
render_generated >"$EXPECTED_FILE"
if ! cmp -s "$EXPECTED_FILE" "$OUTPUT_FILE"; then
echo "error: ${OUTPUT_FILE#${ROOT_DIR}/} is stale. Run Scripts/regenerate-codex-parser-hash.sh and commit the result." >&2
if [[ -f "$OUTPUT_FILE" ]]; then
diff -u "$OUTPUT_FILE" "$EXPECTED_FILE" >&2 || true
else
diff -u /dev/null "$EXPECTED_FILE" >&2 || true
fi
exit 1
fi
echo "Codex parser hash is current (${SHORT_HASH})"
exit 0
fi
mkdir -p "$(dirname "$OUTPUT_FILE")"
render_generated >"$OUTPUT_FILE"
echo "Updated ${OUTPUT_FILE#${ROOT_DIR}/} to ${SHORT_HASH}"