| #!/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 '/: \(Claude\|Gemini\|ChatGPT\) /d' \ | |
| -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 |