blob: 32084fb9fd904cf308135f842a20a5f9e8a99615 [file] [log] [blame]
#!/bin/sh
#
# Automate generation of a new release
#
# Need to first update these files:
#
# VERSION (with new version number)
# docs/CHANGES (with changelog and version/date string)
# configure.ac (with new version string)
# debian/changelog (with new release entry, only for release version)
set -e
KUP=0
COMMIT=1
LAST_HEAD=""
FOR_NEXT=0
help() {
echo "$(basename $0) - prepare xfsprogs release tarball or for-next update"
printf "\t[--kup|-k] upload final tarball with KUP\n"
printf "\t[--no-commit|-n] don't create release commit\n"
printf "\t[--last-head|-l] commit of the last release\n"
printf "\t[--for-next|-f] generate announce email for for-next update\n"
}
update_version() {
echo "Updating version files"
# doc/CHANGES
header="xfsprogs-${version} ($(date +'%d %b %Y'))"
sed -i "1s/^/$header\n\t<TODO list user affecting changes>\n\n/" doc/CHANGES
$EDITOR doc/CHANGES
# ./configure.ac
CONF_AC="AC_INIT([xfsprogs],[${version}],[linux-xfs@vger.kernel.org])"
sed -i "s/^AC_INIT.*/$CONF_AC/" ./configure.ac
# ./debian/changelog
sed -i "1s/^/\n/" ./debian/changelog
sed -i "1s/^/ -- Nathan Scott <nathans@debian.org> `date -R`\n/" ./debian/changelog
sed -i "1s/^/\n/" ./debian/changelog
sed -i "1s/^/ * New upstream release\n/" ./debian/changelog
sed -i "1s/^/\n/" ./debian/changelog
sed -i "1s/^/xfsprogs (${version}-1) unstable; urgency=low\n/" ./debian/changelog
}
prepare_mail() {
branch="$1"
mail_file=$(mktemp)
if [ -n "$LAST_HEAD" ]; then
if [ $branch == "master" ]; then
reason="$(git describe --abbrev=0 $branch) released"
else
reason="for-next updated to $(git log --oneline --format="%h" -1 $branch)"
fi;
cat << EOF > $mail_file
To: linux-xfs@vger.kernel.org
Cc: $(./tools/git-contributors.py $LAST_HEAD..$branch --separator ', ')
Subject: [ANNOUNCE] xfsprogs: $reason
Hi folks,
The xfsprogs $branch branch in repository at:
git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git
has just been updated.
Patches often get missed, so if your outstanding patches are properly reviewed
on the list and not included in this update, please let me know.
The for-next branch has also been updated to match the state of master.
The new head of the $branch branch is commit:
$(git log --oneline --format="%H" -1 $branch)
New commits:
$(git shortlog --format="[%h] %s" $LAST_HEAD..$branch)
Code Diffstat:
$(git diff --stat --summary -C -M $LAST_HEAD..$branch)
EOF
fi
}
while [ $# -gt 0 ]; do
case "$1" in
--kup|-k)
KUP=1
;;
--no-commit|-n)
COMMIT=0
;;
--last-head|-l)
LAST_HEAD=$2
shift
;;
--for-next|-f)
FOR_NEXT=1
;;
--help|-h)
help
exit 0
;;
*)
>&2 printf "Error: Invalid argument\n"
exit 1
;;
esac
shift
done
if [ $FOR_NEXT -eq 1 ]; then
echo "Push your for-next branch:"
printf "\tgit push origin for-next:for-next\n"
prepare_mail "for-next"
if [ -n "$LAST_HEAD" ]; then
echo "Command to send ANNOUNCE email"
printf "\tneomutt -H $mail_file\n"
fi
exit 0
fi
if [ -z "$EDITOR" ]; then
EDITOR=$(command -v vi)
fi
if [ $COMMIT -eq 1 ]; then
if git diff --exit-code ./VERSION > /dev/null; then
$EDITOR ./VERSION
fi
fi
. ./VERSION
version=${PKG_MAJOR}.${PKG_MINOR}.${PKG_REVISION}
date=`date +"%-d %B %Y"`
if [ $COMMIT -eq 1 ]; then
update_version
git diff --color=always | less -r
[[ "$(read -e -p 'All good? [Y/n]> '; echo $REPLY)" == [Nn]* ]] && exit 0
echo "Commiting new version update to git"
git commit --all --signoff --message="xfsprogs: Release v${version}
Update all the necessary files for a v${version} release."
echo "Tagging git repository"
git tag --annotate --sign --message="Release v${version}" v${version}
fi
echo "Cleaning up"
make realclean
rm -rf "xfsprogs-${version}.tar" \
"xfsprogs-${version}.tar.gz" \
"xfsprogs-${version}.tar.asc" \
"xfsprogs-${version}.tar.sign"
echo "Making source tarball"
make dist
gunzip -k "xfsprogs-${version}.tar.gz"
echo "Sign the source tarball"
gpg \
--detach-sign \
--armor \
"xfsprogs-${version}.tar"
echo "Verify signature"
gpg \
--verify \
"xfsprogs-${version}.tar.asc"
if [ $? -ne 0 ]; then
echo "Can not verify signature of tarball"
exit 1
fi
mv "xfsprogs-${version}.tar.asc" "xfsprogs-${version}.tar.sign"
if [ $KUP -eq 1 ]; then
kup put \
xfsprogs-${version}.tar.gz \
xfsprogs-${version}.tar.sign \
pub/linux/utils/fs/xfs/xfsprogs/
fi;
prepare_mail "master"
echo ""
echo "Done. Please remember to push out tags and the branch."
printf "\tgit push origin v${version} master:master master:for-next\n"
if [ -n "$LAST_HEAD" ]; then
echo "Command to send ANNOUNCE email"
printf "\tneomutt -H $mail_file\n"
fi