Files
.profile/scripts/summarize_git_changes

73 lines
2.4 KiB
Bash
Executable File

#!/bin/sh
set -eu
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo "Usage: $0 DIR [SINCE [UNTIL]]"
exit 1
fi
readonly DIR="$1"; shift
if [ $# -gt 0 ]; then
SINCE="$(date -d "$1" +%Y-%m-%d)"; readonly SINCE
else
SINCE="$(date +%Y-%m-01)"; readonly SINCE
fi
if [ $# -gt 1 ]; then
UNTIL="$(date -d "$2" +%Y-%m-%d)"; readonly UNTIL
else
UNTIL="$(date -d "${SINCE} + 1 month - 1 day" +%Y-%m-%d)"; readonly UNTIL
fi
PROMPT=$(cat <<'EOF'
Write a summary of the following commit messages.
Do not refer to commits, instead write in a style suitable for a release note that non-technical people would understand.
The output format should be Markdown where the repository name and remote ULR should be the header as a link and bullit lists should use dashes (-).
EOF
)
readonly PROMPT
summarize() {
repo_dir=$1
since=$2
until=$3
commits="$(git -C "$repo_dir" log --since="$since" --until="$until" --pretty=format:"%s")"
if [ -n "$commits" ]; then
echo >&2 "The repository in ${repo_dir} is being summarized."
repo_name="$(basename "$repo_dir")"
remote_url="$(git -C "$repo_dir" remote get-url origin)"
content="$(printf "%s\nRepository name: %s\nRemote URL: %s\nCommit messages:\n%s" \
"$PROMPT" "$repo_name" "$remote_url" "$(echo "$commits" | sed 's/^/- /')")"
json="{ \"model\": \"${OPENAI_CHAT_MODEL_ID}\",
\"messages\": [{ \"role\": \"user\",
\"content\": \"$( echo "$content" | sed ':a;N;$!ba;s/\n/\\n/g')\" }]}"
tmpfile="$(mktemp)"; trap 'rm -f -- "$tmpfile"' EXIT
curl -s "${OPENAI_BASE_URL}/chat/completions" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${OPENAI_API_KEY}" \
-d "$json" | tee "$tmpfile" | jq -r ".choices[0].message.content"
[ -n "${DEBUG:-}" ] && jq >&2 . "$tmpfile"
echo
else
echo >&2 "The repository in ${repo_dir} contains no commits for the period, skipping."
fi
}
echo >&2 "Generating summary for period: ${SINCE}...${UNTIL}"
find "$DIR" -type d -name .git -prune -print | sed 's|/\.git$||' | sort | while read -r repo_dir; do
if [ -f "${repo_dir}/.no-git-summary" ]; then
echo >&2 "The repository in ${repo_dir} is configured with no-git-summary, skipping."
continue
fi
summarize "$repo_dir" "$SINCE" "$UNTIL"
done