#!/bin/sh
# Announcement message skelton
#
: ${MASTER=master}

tmpbase=/var/tmp/git-announce.$$
trap 'rm -f $tmpbase.*' 0
branch=${1?branch}
previous=${2?previous}
commit=${3-"$1"}

relname=$(git describe "$commit") &&
vername=$(expr "$relname" : 'v\(.*\)') || exit $?

git rev-parse --verify "$previous" >/dev/null || exit $?

case "$branch" in
maint)
	kind="The latest maintenance release" ;;
mainto/* | maint-[0-9]*)
	kind="A maintenance release" ;;
$MASTER)
	kind="The latest feature release" ;;
esac

case "$vername" in
*-rc[0-9]*)
	rpmroot=testing
	case "$vername" in
	*-rc0)
		kind="An early preview release"
		;;
	*)
		kind="A release candidate"
		;;
	esac
	for_testing=" for testing"
	;;
*)
	for_testing=
	rpmroot='RPMS/$arch'
	;;
esac

vername=$(echo "$vername" | tr "-" ".")

people () {
	git shortlog -s --no-merges \
		--group=author \
		--group=trailer:co-authored-by \
		--group=trailer:reviewed-by \
		--group=trailer:mentored-by \
		--group=trailer:helped-by \
		--group=trailer:tested-by \
		--group=trailer:reported-by \
		"$@" |
	sed -e 's/^[ 	0-9]*[ 	]//' -e 's/$/,/' |
	sort -u
}

people "$previous" >"$tmpbase.prev"
people "$previous..$commit" >"$tmpbase.this"

comm -12 "$tmpbase.prev" "$tmpbase.this" >"$tmpbase.old"
comm -13 "$tmpbase.prev" "$tmpbase.this" >"$tmpbase.new"

all=$(wc -l <"$tmpbase.this")
new=$(wc -l <"$tmpbase.new")
cnt=$(git rev-list --no-merges "$previous..$commit" | wc -l)

cat <<EOF
To: git@vger.kernel.org
Cc: Linux Kernel <linux-kernel@vger.kernel.org>,
    git-packagers@googlegroups.com
Bcc: lwn@lwn.net, gitster@pobox.com
Subject: [ANNOUNCE] Git $relname

EOF

(
	echo "$kind Git $relname is now available$for_testing at the usual places."
	if test "$branch" = $MASTER
	then
		cat <<-EOF
		It is comprised of $cnt non-merge commits since $previous,
		contributed by $all people, $new of which are new faces [*].
		EOF
	fi
) | fmt -68

cat <<EOF

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/${for_testing:+testing/}

EOF

(
	cat <<-EOF
	The following public repositories all have a copy of
	the '$relname' tag and
	EOF
	case "$branch" in
	maint-* | mainto/*)
		echo "some of them have"
		;;
	esac
	echo "the '$branch' branch that the tag points at:"
) | fmt -68

cat <<\EOF

  url = https://git.kernel.org/pub/scm/git/git
  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git
EOF

fmt_people () {
	# Yes, I don't perform well without 2 or more people.
	# Sue me. The heading says "are as follows" anyway ;-).
	sed -e '${
		s/^/and /
		s/,$/./
	}' "$1" |
	fmt -66 |
	sed -e 's/^/  /'

}

if test "$branch" = $MASTER
then
	cat <<-EOF

	New contributors whose contributions weren't in $previous are as follows.
	Welcome to the Git development community!

	$(fmt_people "$tmpbase.new")

	Returning contributors who helped this release are as follows.
	Thanks for your continued support.

	$(fmt_people "$tmpbase.old")

	[*] We are counting not just the authorship contribution but issue
	    reporting, mentoring, helping and reviewing that are recorded in
	    the commit trailers.
	EOF
fi

cat <<EOF

----------------------------------------------------------------

EOF

case "$(git ls-tree ${branch} RelNotes)" in
120000' '*)
	RelNotes=$(git cat-file blob "${branch}:RelNotes")
	;;
*)
	RelNotes=RelNotes
	;;
esac &&
git cat-file blob "${branch}:$RelNotes" |
case "$relname" in
*-*)
	sed -e 's/^Git .* Release Notes$/& (draft)/' \
	    -e 's/^=============/&========/'
	;;
*)
	cat
	;;
esac

cat <<EOF

----------------------------------------------------------------

Changes since $previous are as follows:

EOF

git log --no-merges "$previous".."$branch" |
git shortlog
