Files
codex-skills/summarise/scripts/git-summary-evidence.sh
T

78 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
repo="${1:-.}"
cd "$repo"
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "Not inside a Git repository: $repo" >&2
exit 1
fi
echo "# Repository"
printf "Root: %s\n" "$(git rev-parse --show-toplevel)"
printf "HEAD: %s\n" "$(git log -1 --format='%h %ad %s' --date=short)"
echo
echo "# Working Tree"
git status --short || true
echo
echo "# Tags Chronological"
tags=()
while IFS= read -r tag; do
tags+=("$tag")
done < <(git tag --sort=creatordate)
if ((${#tags[@]} == 0)); then
echo "No tags found."
else
for tag in "${tags[@]}"; do
printf "%s | %s | %s\n" \
"$tag" \
"$(git log -1 --format='%ad' --date=short "$tag")" \
"$(git log -1 --format='%h %s' "$tag")"
done
fi
echo
echo "# Milestone Diff Stats"
if ((${#tags[@]} > 0)); then
first_commit="$(git rev-list --max-parents=0 HEAD | tail -n 1)"
prev="$first_commit"
prev_label="first commit ${first_commit:0:7}"
for tag in "${tags[@]}"; do
printf "## %s -> %s\n" "$prev_label" "$tag"
git diff --shortstat "$prev".."$tag" || true
prev="$tag"
prev_label="$tag"
done
printf "## %s -> HEAD\n" "$prev_label"
git diff --shortstat "$prev"..HEAD || true
else
git diff --shortstat "$(git rev-list --max-parents=0 HEAD | tail -n 1)"..HEAD || true
fi
echo
echo "# Recent Commit Timeline"
git log --date=short --pretty=format:'%h | %ad | %s' --reverse --max-count=120
echo
echo
echo "# Largest Commits By Changed Files"
git log --pretty=format:'%h' --max-count=300 |
while read -r commit; do
files="$(git show --shortstat --format= "$commit" | awk '/files? changed/ {print $1 + 0}')"
printf "%06d %s %s\n" "${files:-0}" "$commit" "$(git log -1 --format='%ad | %s' --date=short "$commit")"
done | sort -rn | head -n 30
echo
echo "# Largest Commits By Line Churn"
git log --pretty=format:'%h' --max-count=300 |
while read -r commit; do
stat="$(git show --shortstat --format= "$commit")"
inserted="$(awk '/insertions?\(\+\)/ {for (i=1;i<=NF;i++) if ($i ~ /insertions?\(\+\)/) print $(i-1)}' <<<"$stat")"
deleted="$(awk '/deletions?\(-\)/ {for (i=1;i<=NF;i++) if ($i ~ /deletions?\(-\)/) print $(i-1)}' <<<"$stat")"
churn="$(( ${inserted:-0} + ${deleted:-0} ))"
printf "%08d %s %s\n" "$churn" "$commit" "$(git log -1 --format='%ad | %s' --date=short "$commit")"
done | sort -rn | head -n 30