45 lines
1.2 KiB
Bash
Executable File
45 lines
1.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
LB_DIR="$ROOT_DIR/.loop-build"
|
|
SNAP_DIR="$LB_DIR/state/snapshots"
|
|
mkdir -p "$SNAP_DIR"
|
|
label="${1:-manual}"
|
|
mkdir -p "$LB_DIR/state"
|
|
stamp="$(date -u +%Y%m%dT%H%M%SZ)"
|
|
out="$SNAP_DIR/snapshot-${stamp}-${label}.json"
|
|
|
|
if [[ -d "$ROOT_DIR/.git" ]]; then
|
|
head="$(git -C "$ROOT_DIR" rev-parse --short HEAD 2>/dev/null || true)"
|
|
if [[ -z "$head" ]]; then
|
|
head="NO_HEAD"
|
|
fi
|
|
else
|
|
head="UNKNOWN"
|
|
fi
|
|
|
|
changed_lines=""
|
|
if [[ -d "$ROOT_DIR/.git" ]]; then
|
|
changed_lines="$(git -C "$ROOT_DIR" status --porcelain --untracked-files=normal | cut -c4- | sed '/^$/d' | sort -u || true)"
|
|
fi
|
|
|
|
changed_json='[]'
|
|
if [[ -n "$changed_lines" ]]; then
|
|
changed_json="$(printf '%s\n' "$changed_lines" | jq -R -s 'split("\n") | map(select(length > 0))')"
|
|
fi
|
|
|
|
jq -n \
|
|
--arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
--arg snap_label "$label" \
|
|
--arg repo "$ROOT_DIR" \
|
|
--arg head "$head" \
|
|
--argjson changed_files "$changed_json" \
|
|
'{timestamp:$timestamp,label:$snap_label,repo:$repo,head:$head,changed_files:$changed_files}' \
|
|
> "$out"
|
|
|
|
echo "[snapshot] created: $out"
|
|
if [[ -d "$ROOT_DIR/.git" ]]; then
|
|
git -C "$ROOT_DIR" status --short --untracked-files=normal
|
|
fi
|