#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SKILL_ROOT="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/_common.sh" : "${INPUT_DIR:=}" : "${INPUT_FILES:=}" : "${EXCLUDES:=.git,node_modules,target,dist,outputs}" : "${LABEL:=snapshot}" : "${NODE_NAME:=node-a}" : "${OUTPUT_DIR:=$SKILL_ROOT/outputs}" build_file_list() { local out="$1" local find_args=() IFS=',' read -r -a ex <<< "$EXCLUDES" for pat in "${ex[@]}"; do [[ -n "$pat" ]] && find_args+=( -not -path "*/$pat/*" ); done if [[ -n "$INPUT_FILES" ]]; then : > "$out" IFS=',' read -r -a files <<< "$INPUT_FILES" for f in "${files[@]}"; do f="${f#"${f%%[![:space:]]*}"}"; f="${f%"${f##*[![:space:]]}"}" [[ -f "$f" ]] || die "Not a file: $f" echo "$f" >> "$out" done else (cd "$INPUT_DIR" && find . -type f "${find_args[@]}" | sed 's|^\./||') > "$out.rel" awk -v root="$INPUT_DIR" '{print root "/" $0}' "$out.rel" > "$out" rm -f "$out.rel" fi sort -u "$out" -o "$out" } main() { local tmp; tmp="$(mktemp)" build_file_list "$tmp" local count; count="$(wc -l < "$tmp" | tr -d ' ')" echo "[PLAN] $(date -Iseconds) Merkle Forest" echo "[PLAN] Node: $NODE_NAME Label: $LABEL" echo "[PLAN] Hasher: $(pick_hasher)" echo "[PLAN] Files: $count" echo "[PLAN] Output: $OUTPUT_DIR" echo "[PLAN] Next: export DRY_RUN=0 && ./scripts/11_apply.sh" rm -f "$tmp" } main "$@"