diff --git a/tools/add-license-headers.sh b/tools/add-license-headers.sh new file mode 100755 index 0000000..f823524 --- /dev/null +++ b/tools/add-license-headers.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +# Prepend SPDX license identifiers to every Rust and Lua source file. +# Idempotent: files already containing an `SPDX-License-Identifier:` line are skipped. +# Run from the repository root: `./tools/add-license-headers.sh` + +set -euo pipefail + +readonly LICENSE_ID="AGPL-3.0-only" +readonly RUST_HEADER="// SPDX-License-Identifier: ${LICENSE_ID}" +readonly LUA_HEADER="-- SPDX-License-Identifier: ${LICENSE_ID}" + +# Directories to scan, relative to the repository root. +readonly RUST_DIRS=("crates") +readonly LUA_DIRS=("assets/scripts" "mods") + +added=0 +skipped=0 + +prepend_if_missing() { + local file="$1" + local header="$2" + + if grep -q "SPDX-License-Identifier:" "$file"; then + skipped=$((skipped + 1)) + return + fi + + # Use a temp file in the same directory so the rename is atomic on the same filesystem. + local tmp + tmp=$(mktemp "${file}.XXXXXX") + { + printf '%s\n\n' "$header" + cat "$file" + } >"$tmp" + mv "$tmp" "$file" + added=$((added + 1)) +} + +scan_dir() { + local dir="$1" + local ext="$2" + local header="$3" + + [[ -d "$dir" ]] || return 0 + + while IFS= read -r -d '' file; do + prepend_if_missing "$file" "$header" + done < <(find "$dir" -type f -name "*.${ext}" -print0) +} + +for dir in "${RUST_DIRS[@]}"; do + scan_dir "$dir" "rs" "$RUST_HEADER" +done + +for dir in "${LUA_DIRS[@]}"; do + scan_dir "$dir" "lua" "$LUA_HEADER" +done + +printf 'License headers — added: %d, already present: %d\n' "$added" "$skipped"