review-package 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/env bash
  2. # Generate a review package: commit list, stat summary, and the net
  3. # diff with extended context, written to a file the reviewer reads in one
  4. # call. Using the recorded per-task BASE (not HEAD~1) keeps multi-commit
  5. # tasks intact.
  6. #
  7. # Usage: review-package PLAN_FILE BASE HEAD [OUTFILE]
  8. # Default OUTFILE: <repo-root>/.superpowers/sdd/<plan-basename>/review-<base7>..<head7>.diff
  9. # (named per range, so a re-review after fixes gets a distinct fresh file).
  10. set -euo pipefail
  11. if [ $# -lt 3 ] || [ $# -gt 4 ]; then
  12. echo "usage: review-package PLAN_FILE BASE HEAD [OUTFILE]" >&2
  13. exit 2
  14. fi
  15. plan=$1
  16. base=$2
  17. head=$3
  18. [ -f "$plan" ] || { echo "no such plan file: $plan" >&2; exit 2; }
  19. git rev-parse --verify --quiet "$base" >/dev/null || { echo "bad BASE: $base" >&2; exit 2; }
  20. git rev-parse --verify --quiet "$head" >/dev/null || { echo "bad HEAD: $head" >&2; exit 2; }
  21. if [ $# -eq 4 ]; then
  22. out=$4
  23. else
  24. # Invoke via bash rather than direct exec: some extractors (Python zipfile)
  25. # strip Unix exec bits when unpacking marketplace packages (#2040).
  26. dir=$("${BASH:-bash}" "$(cd "$(dirname "$0")" && pwd)/sdd-workspace" "$plan")
  27. out="$dir/review-$(git rev-parse --short "$base")..$(git rev-parse --short "$head").diff"
  28. fi
  29. {
  30. echo "# Review package: ${base}..${head}"
  31. echo
  32. echo "## Commits"
  33. git log --oneline "${base}..${head}"
  34. echo
  35. echo "## Files changed"
  36. git diff --stat "${base}..${head}"
  37. echo
  38. echo "## Diff"
  39. git diff -U10 "${base}..${head}"
  40. } > "$out"
  41. commits=$(git rev-list --count "${base}..${head}")
  42. echo "wrote ${out}: ${commits} commit(s), $(wc -c < "$out" | tr -d ' ') bytes"