mirror of
https://github.com/obra/superpowers.git
synced 2026-08-22 14:39:03 +00:00
99f9f00869
When an SDD implementer commits to the wrong branch (#2050), the BASE..HEAD range handed to review-package is either empty or not rooted at BASE. Both cases previously produced a review package silently — an empty one lets the reviewer approve "clean" work that isn't there. Add two mechanical guards after BASE/HEAD validation, exiting 3 (vs 2 for usage errors) so callers can distinguish range problems: - git merge-base --is-ancestor BASE HEAD, else "HEAD is not a descendant of BASE" - git rev-list --count BASE..HEAD > 0, else "empty commit range" Guard shape credits the analysis in closed PR #2082 by @stantheman0128. Fixes #2050
52 lines
1.8 KiB
Bash
Executable File
52 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Generate a review package: commit list, stat summary, and the net
|
|
# diff with extended context, written to a file the reviewer reads in one
|
|
# call. Using the recorded per-task BASE (not HEAD~1) keeps multi-commit
|
|
# tasks intact.
|
|
#
|
|
# Usage: review-package PLAN_FILE BASE HEAD [OUTFILE]
|
|
# Default OUTFILE: <repo-root>/.superpowers/sdd/<plan-basename>/review-<base7>..<head7>.diff
|
|
# (named per range, so a re-review after fixes gets a distinct fresh file).
|
|
set -euo pipefail
|
|
|
|
if [ $# -lt 3 ] || [ $# -gt 4 ]; then
|
|
echo "usage: review-package PLAN_FILE BASE HEAD [OUTFILE]" >&2
|
|
exit 2
|
|
fi
|
|
|
|
plan=$1
|
|
base=$2
|
|
head=$3
|
|
[ -f "$plan" ] || { echo "no such plan file: $plan" >&2; exit 2; }
|
|
|
|
git rev-parse --verify --quiet "$base" >/dev/null || { echo "bad BASE: $base" >&2; exit 2; }
|
|
git rev-parse --verify --quiet "$head" >/dev/null || { echo "bad HEAD: $head" >&2; exit 2; }
|
|
|
|
# Range guards (exit 3): a wrong-branch HEAD yields a range that is empty or
|
|
# not rooted at BASE; either would silently produce a bogus review package.
|
|
git merge-base --is-ancestor "$base" "$head" || { echo "HEAD is not a descendant of BASE: ${base}..${head}" >&2; exit 3; }
|
|
[ "$(git rev-list --count "${base}..${head}")" -gt 0 ] || { echo "empty commit range: ${base}..${head}" >&2; exit 3; }
|
|
|
|
if [ $# -eq 4 ]; then
|
|
out=$4
|
|
else
|
|
dir=$("$(cd "$(dirname "$0")" && pwd)/sdd-workspace" "$plan")
|
|
out="$dir/review-$(git rev-parse --short "$base")..$(git rev-parse --short "$head").diff"
|
|
fi
|
|
|
|
{
|
|
echo "# Review package: ${base}..${head}"
|
|
echo
|
|
echo "## Commits"
|
|
git log --oneline "${base}..${head}"
|
|
echo
|
|
echo "## Files changed"
|
|
git diff --stat "${base}..${head}"
|
|
echo
|
|
echo "## Diff"
|
|
git diff -U10 "${base}..${head}"
|
|
} > "$out"
|
|
|
|
commits=$(git rev-list --count "${base}..${head}")
|
|
echo "wrote ${out}: ${commits} commit(s), $(wc -c < "$out" | tr -d ' ') bytes"
|