1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
#!/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
|