git-lfs/script/changelog
brian m. carlson dc52bfe3ac
script: add a noninteractive mode to the changelog generator
While the current changelog generator is useful, it is interactive,
which makes it hard to extract the changelog output from the standard
output of the script.  Provide a noninteractive mode, which specifies
sections but doesn't categorize any of the items.  This can be used
to store the output in a file and allow the user to edit it with the
editor of their choice.  This file can then be programmatically inserted
into the various places the changelog entry is required.
2019-02-07 16:51:30 +00:00

121 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Interactively generates a changelog over a range of commits:
commit_summary() {
local hash=$1
pr=$(git show $hash | grep -o "#\([0-9]*\)" | cut -c 2-)
prjson="$(curl -n https://api.github.com/repos/git-lfs/git-lfs/pulls/$pr 2>/dev/null)"
title="$(echo $prjson | jq -r -e ".title")"
id="$(echo $prjson | jq -r -e ".number")"
author="$(echo $prjson | jq -r -e ".user.login")"
# If the title begins with "Backport", then strip everything until the actual
# pull-request title.
if grep -q "Backport" <(echo $title); then
title="$(echo $title | sed 's/^[^:]*: //g')"
fi
echo "* $title #$id (@$author)"
}
revisions_in () {
git rev-list --merges --first-parent $1
}
noninteractive () {
local range="$1"
printf '### Uncategorized\n'
for rev in $(revisions_in "$range"); do
commit_summary $rev
done
cat <<-EOF
### Features
### Bugs
### Misc
EOF
}
if [ "$1" = "--noninteractive" ]; then
noninteractive=1
shift
fi
range=$1
if [ "$range" = "" ]; then
echo "Usage: $0 [options] base..next"
exit 1
fi
if [ -n "$noninteractive" ]
then
noninteractive "$range"
exit
fi
features=""
bugs=""
misc=""
for rev in $(revisions_in "$range"); do
git show $rev
processed=0
while [ $processed -eq 0 ]; do
echo "Categorize this change: [f,b,m,s,?] ?"
read -n 1 opt
echo ""
case $opt in
[fbms])
processed=1
;;
?)
echo "f - mark this merge as a feature"
echo "b - mark this merge as a bugfix"
echo "m - make this merge as a misc. change"
echo "s - skip this merge, excluding it from the changelog"
echo "? - display this help message"
;;
*)
echo "Unknown option: $opt, try again."
;;
esac
done
if [ $opt != "s" ]; then
summary="$(commit_summary $rev)"
fi
case $opt in
f)
features="$(printf "%s\n%s\n" "$features" "$summary")"
;;
b)
bugs="$(printf "%s\n%s\n" "$bugs" "$summary")"
;;
m)
misc="$(printf "%s\n%s\n" "$misc" "$summary")"
;;
esac
done
echo "" >&2
cat <<- EOF
### Features
$features
### Bugs
$bugs
### Misc
$misc
EOF