#!/bin/bash # Sourceforge username SFUSER=${SFUSER:-$USER} set -ex ## Parse command line arguments usage () { if ! [ -z "$1" ] then echo $1 fi cat < /dev/null || echo "unknown") if ([ "tag" != "$type" ] && [ "commit" != "$type" ]) then usage "$rev is $type, not a tag or a commit." fi fi if ! [ -z "$@" ] then usage "Extra command-line arguments: $@" fi SBCL_RELEASE_DIR=${SBCL_RELEASE_DIR:-$(mktemp -d $PWD/sbcl-release-dir-$(date +%Y%m%d)-XXXXXXXXX)} SBCL_DIR=$SBCL_RELEASE_DIR/sbcl-$VERSION GIT_DIR=$PWD/release.sbcl LOGFILE=$SBCL_RELEASE_DIR/log.txt ## Frob the git repository, and clone the repo to a clean build directory. if [ ! -d $SBCL_DIR ]; then cd $GIT_DIR sbcl_directory="$(cd "$(dirname $0)"; pwd)" branch_name="release-$(date '+%s')" original_branch="$(git describe --all --contains HEAD)" echo "Checking that the tree is clean." if ! [ $(git status --porcelain | wc -l) = 0 ] then echo "There are uncommitted / unpushed changes in this checkout!" git status exit 1 fi ## Perform the necessary changes to the NEWS file: echo "Munging NEWS" sed -i.orig "/^changes relative to sbcl-.*:/ s/changes/changes in sbcl-$VERSION/ " NEWS rm -f NEWS.orig if ! grep "^changes in sbcl-$VERSION relative to" NEWS > /dev/null then echo "NEWS munging failed!" exit 1 fi ## Commit cd "$sbcl_directory" echo "Committing release version." git add NEWS git commit -m "$VERSION: will be tagged as \"sbcl-$VERSION\"" ## Make release notes if [ ! -f $SBCL_RELEASE_DIR/sbcl-$VERSION-release-notes.txt ]; then awk "BEGIN { state = 0 } /^changes in sbcl-/ { state = 0 } /^changes in sbcl-$VERSION/ { state = 1 } { if(state == 1) print \$0 }" < $GIT_DIR/NEWS > $SBCL_RELEASE_DIR/sbcl-$VERSION-release-notes.txt fi ## Tag tag="sbcl-$VERSION" echo "Tagging as $tag" git tag $sign -F $SBCL_RELEASE_DIR/sbcl-$VERSION-release-notes.txt "$tag" git clone $GIT_DIR $SBCL_DIR fi ## Make the source tarball. if [ ! \( -f $SBCL_RELEASE_DIR/sbcl-$VERSION-source.tar -o -f $SBCL_RELEASE_DIR/sbcl-$VERSION-source.tar.bz2 \) ]; then cd $SBCL_DIR $SBCL_DIR/generate-version.sh mkdir -p CVS sh ./distclean.sh rm -rf .git cd $SBCL_RELEASE_DIR sh sbcl-$VERSION/source-distribution.sh sbcl-$VERSION mv $SBCL_DIR $SBCL_DIR.git tar xvf sbcl-$VERSION-source.tar fi ## Build x86-64 binary for bootstrap. if [ ! -d $SBCL_RELEASE_DIR/bin ]; then cd $SBCL_DIR nice -20 ./make.sh >$LOGFILE 2>&1 cd tests nice -20 sh ./run-tests.sh >>$LOGFILE 2>&1 mkdir -p $SBCL_RELEASE_DIR/bin cp $SBCL_DIR/src/runtime/sbcl $SBCL_RELEASE_DIR/bin/sbcl cp $SBCL_DIR/output/sbcl.core $SBCL_RELEASE_DIR/bin/sbcl.core fi ## Build x86-64 release binary. if [ ! -d $SBCL_RELEASE_DIR/sbcl-$VERSION-x86-64-linux ]; then cd $SBCL_DIR sh clean.sh nice -20 ./make.sh "$SBCL_RELEASE_DIR/bin/sbcl --core $SBCL_RELEASE_DIR/bin/sbcl.core --no-userinit" >> $LOGFILE 2>&1 cd doc && sh ./make-doc.sh cd $SBCL_RELEASE_DIR ln -s $SBCL_DIR $SBCL_RELEASE_DIR/sbcl-$VERSION-x86-64-linux sh $SBCL_DIR/binary-distribution.sh sbcl-$VERSION-x86-64-linux sh $SBCL_DIR/html-distribution.sh sbcl-$VERSION fi ## Build x86 release binary. #if [ ! -d $SBCL_RELEASE_DIR/sbcl-$VERSION-x86-linux ]; then # cd $SBCL_DIR # sh clean.sh # export SBCL_ARCH=x86 # export PATH=/scratch/src/release/x86-gcc-wrapper:$PATH # nice -20 ./make.sh "$SBCL_RELEASE_DIR/bin/sbcl --core $SBCL_RELEASE_DIR/bin/s#bcl.core --no-userinit" >> $LOGFILE 2>&1 # cd tests # nice -20 sh ./run-tests.sh >>$LOGFILE 2>& # cd $SBCL_RELEASE_DIR # ln -s $SBCL_DIR $SBCL_RELEASE_DIR/sbcl-$VERSION-x86-linux # sh $SBCL_DIR/binary-distribution.sh sbcl-$VERSION-x86-linux #fi ## Checksum if [ ! -f $SBCL_RELEASE_DIR/sbcl-$VERSION-$SFUSER ]; then cd $SBCL_RELEASE_DIR echo "The SHA256 checksums of the following distribution files are:" > sbcl-$VERSION-$SFUSER echo >> sbcl-$VERSION-$SFUSER sha256sum sbcl-$VERSION*.tar >> sbcl-$VERSION-$SFUSER bzip2 sbcl-$VERSION*.tar fi ## Bug closing email if [ ! -f $SBCL_RELEASE_DIR/sbcl-$VERSION-bugmail.txt ]; then cd $SBCL_RELEASE_DIR echo Bugs fixed by sbcl-$VERSION release > sbcl-$VERSION-bugmail.txt for bugnum in $(egrep -o "#[1-9][0-9][0-9][0-9][0-9][0-9]+" sbcl-$VERSION-release-notes.txt | sed s/#// | sort -n); do printf "\n bug %s\n status fixreleased" $bugnum >> sbcl-$VERSION-bugmail.txt done echo >> sbcl-$VERSION-bugmail.txt fi ## Sign if [ ! -f $SBCL_RELEASE_DIR/sbcl-$VERSION-$SFUSER.asc ]; then cd $SBCL_RELEASE_DIR gpg -sta $SBCL_RELEASE_DIR/sbcl-$VERSION-$SFUSER fi ## Upload to sf.net if [ ! -f $SBCL_RELEASE_DIR/uploaded ]; then read -n 1 -p "Ok to upload? " A; echo if [ $A \!= "y" ]; then exit 1 fi cd $SBCL_RELEASE_DIR cat > $SBCL_RELEASE_DIR/sftp-batch <>$LOGFILE 2>&1 COMMIT=false git diff || COMMIT=true links -dump platform-table.html read -n 1 -p "Ok? " A; echo if [ $A = "y" ]; then if [ $COMMIT ]; then git commit -a -m "Update for $VERSION" git push fi make upload-pages upload-manual SBCL_TAG=sbcl-$VERSION touch $SBCL_RELEASE_DIR/sbcl-page-uploaded else exit 1 fi fi set +x echo TODO: echo echo perform administrative tasks: echo echo \* visit https://sourceforge.net/projects/sbcl/files/ echo \* select sbcl -> $VERSION -> "view details" for the source echo \ \ tarball, "Select all" and Save echo \* mail sbcl-announce echo \* check and send sbcl-$VERSION-bugmail.txt to edit@bugs.launchpad.net echo \ \ '(sign: C-c RET s p)'