#!/bin/bash ############################################## # CoolProp release management ############################################## # # Things to remember when you make a new release: # # * Force a new build on all buildbots from the release branch # * Run the script and check the logs # * Make a tag in your git software # * Update the default download on sourceforge to point to the new sources # # In case you experience problems with permissions, login to # sourceforge by creating a new shell with # ssh -t username,coolprop@shell.sf.net create # and the run # find . -type d ! -perm 0775 -exec chmod 0775 {} \; # find . -type f ! -perm 0664 -exec chmod 0664 {} \; # in /home/project-web/coolprop/htdocs and /home/frs/project/coolprop/ # to reset all permissions. # # Force quit on all errors set -e # # Make sure that only two arguments are passed to this script - the version that # will be released and the dryrun vs. release option. if [ $# != 2 ]; then echo "Only two arguments should be passed to this script: " echo "The version that will be released and if you would like a dry run or a release." echo "for example: \"release.bsh 5.0.0 dryrun\" or \"release.bsh nightly release\" " exit 1 fi # # Just a small function print messages SEPARATOR="---------------------------------------------------" function printMessage { echo " " echo $SEPARATOR echo "$1" echo $SEPARATOR return 0 } # rm -f release.bsh.cmds.txt function runCommand { echo "Running command: ${@}" echo "${@}" >> release.bsh.cmds.txt case "${1}" in "echo") eval ${@};; "cd") eval ${@};; "pushd") eval ${@};; "popd") eval ${@};; "") echo "undefined command";; #*) echo "no action";; *) eval ${@};; esac } # Process the version number and set parameters accordingly CPVERSION="$1" if [[ $CPVERSION == +([0-9]).+([0-9]).+([0-9]) ]]; then BINFOLDER="release" elif [ "$CPVERSION" == "nightly" ]; then BINFOLDER="binaries" else echo "CPVERSION = $CPVERSION - not valid!" exit 1 fi # Process the dryrun option if [ "$2" == "release" ]; then DRYRUN=false else DRYRUN=true fi # printMessage "Detected parameters" echo "CPVERSION = $CPVERSION - which is a valid input" echo "DRYRUN = $DRYRUN" echo "BINFOLDER = $BINFOLDER" # # SFUSER="jorritw" # ibell or jorritw # Absolute (!) paths -> XXXXDIR BASEDIR="$HOME/buildbot/server-master/public_html" REPODIR="$HOME/src/CoolPropFull.git" TMPSDIR="$HOME/src/CoolProp.sources" SRCSDIR="$BASEDIR/$BINFOLDER/source" COVEDIR="$HOME/src/CoolPropCoverity.git" # # Relative (!) paths -> XXXFOLDER DOCFOLDER="$BINFOLDER/docs" SPHFOLDER="$BINFOLDER/sphinx" DOC4FILES="4.2.5/coolpropv425docs.zip" DOC4FOLDER="$SPHFOLDER/v4" RSYNC_EXCL="--exclude=sphinx --exclude=shared_library/Linux" # DOCFILE="documentation.zip" # # if [ "$DRYRUN" != "false" ]; then printMessage "Dry run detected" echo "Dry run; no zipping of the sources" echo "Dry run; no zipping of the docs" echo "Dry run; skipping python upload" RSYNC_DRY_RUN=--dry-run else RSYNC_DRY_RUN= ###################################### # We start with the absolute paths ... ###################################### runCommand mkdir -p "$TMPSDIR" "$SRCSDIR" # Generating directories printMessage "Updating sources" runCommand pushd "$REPODIR" runCommand find . -type d ! -perm -a+rx -exec chmod -v a+rx {} \\\; runCommand find . -type f ! -perm -a+r -exec chmod -v a+r {} \\\; runCommand git clean -xfd runCommand git reset --hard runCommand git submodule foreach --recursive git clean -xfd runCommand git submodule foreach --recursive git reset --hard runCommand git checkout -B master origin/master runCommand git pull runCommand git submodule update --init --recursive runCommand popd printMessage "Generating headers" runCommand rsync -a --delete "$REPODIR/" "$TMPSDIR" runCommand pushd "$TMPSDIR" runCommand git reset --hard HEAD runCommand python "dev/generate_headers.py" runCommand find . -iwholename \"*/.git*\" -prune -exec rm -rf {} \\\; runCommand cd .. runCommand rm -f $SRCSDIR/CoolProp_sources.zip runCommand zip -rq $SRCSDIR/CoolProp_sources.zip $(basename $TMPSDIR) runCommand cd $(basename $TMPSDIR) runCommand popd printMessage "Avoid security warnings caused by commands in externals/pybind11/docs/benchmark.py" runCommand rm "$REPODIR"/externals/pybind11/docs/benchmark.py runCommand rm "$TMPSDIR"/externals/pybind11/docs/benchmark.py ###################################### # ... and now we use relative paths ###################################### runCommand pushd ${BASEDIR} runCommand mkdir -p \"$DOCFOLDER\" \"$SPHFOLDER\" \"$DOC4FOLDER\" printMessage "Preparing the docs and moving them into the $BINFOLDER folder for staging" runCommand rsync $RSYNC_DRY_RUN $RSYNC_OPTS \"frs.sf.net-$SFUSER:/home/frs/project/coolprop/CoolProp/$DOC4FILES\" \"$(basename $DOC4FILES)\" runCommand unzip -qo \"$(basename $DOC4FILES)\" -d \"$DOC4FOLDER\" runCommand zip -rq \"$DOCFILE\" $SPHFOLDER/* -x */$(basename $DOC4FOLDER)/* runCommand mv \"$DOCFILE\" \"$DOCFOLDER\" # if [ "$CPVERSION" == "nightly" ]; then printMessage "Detected nightly release, updating README.rst.txt" echo "CoolProp nightly binaries" > "$BINFOLDER/README.rst.txt" echo "-------------------------" >> "$BINFOLDER/README.rst.txt" echo -n "Development binaries of the" >> "$BINFOLDER/README.rst.txt" echo -n " \`CoolProp project \`_ " >> "$BINFOLDER/README.rst.txt" echo "updated on $(date +%F) at $(date +%X) $(date +%Z)." >> "$BINFOLDER/README.rst.txt" RSYNC_OPTS="-a --chmod=Dug=rwx,Do=rx,Fug=rw,Fo=r -z --stats --delete" #for i in {1..2}; do for j in $BINFOLDER/Python/*.tar.gz; do binstar upload --force -u coolprop -t pypi -c dev $j; done; done #for i in {1..5}; do for j in $BINFOLDER/Python_conda/*/*.tar.bz2; do binstar upload --force -u coolprop -t conda -c dev $j && rm $j; done; done printMessage "Overwriting the coverity_scan branch with the master branch" runCommand pushd \"$COVEDIR\" runCommand git checkout -B master origin/master runCommand git pull runCommand git push origin +master:coverity_scan runCommand popd else printMessage "Updating README.rst.txt with the full release information" echo "Welcome to CoolProp's download directory v$CPVERSION" > "$BINFOLDER/README.rst.txt" echo "-----------------------------------------------" >> "$BINFOLDER/README.rst.txt" cat "$REPODIR/dev/scripts/release_readme.rst.txt" >> "$BINFOLDER/README.rst.txt" echo "This README.rst.txt was generated automatically on $(date +%F) at $(date +%X) $(date +%Z)." >> "$BINFOLDER/README.rst.txt" RSYNC_OPTS="-a --chmod=Dug=rwx,Do=rx,Fug=rw,Fo=r -z --stats" printMessage "Detected full release, uploading the python binaries to pypi" runCommand twine upload $BINFOLDER/Python/*.whl $BINFOLDER/Python/*.tar.gz #printMessage "and uploading the python binaries to binstar" #for i in {1..2}; do for j in $BINFOLDER/Python/*.tar.gz; do binstar upload --force -u coolprop -t pypi -c main $j; done; done #for i in {1..5}; do for j in $BINFOLDER/Python_conda/*/*.tar.bz2; do binstar upload --force -u coolprop -t conda -c main $j && rm $j; done; done fi popd fi ###################################### # ... we continue with relative paths ###################################### runCommand pushd ${BASEDIR} printMessage "Copying the binaries to SourceForge" runCommand rsync $RSYNC_DRY_RUN $RSYNC_OPTS $RSYNC_EXCL "$BINFOLDER/" frs.sf.net-$SFUSER:/home/frs/project/coolprop/CoolProp/$CPVERSION # if [ ${CPVERSION:0:7} != "nightly" ]; then printMessage "Publishing the docs on SourceForge" runCommand rsync $RSYNC_DRY_RUN $RSYNC_OPTS \"$SPHFOLDER/\" frs.sf.net-$SFUSER:/home/project-web/coolprop/htdocs printMessage "Updating the default Javascript library on SourceForge" runCommand pushd \"$BINFOLDER/Javascript/\" runCommand cp coolprop.js \"coolprop-${CPVERSION}.js\" runCommand cp coolprop.wasm \"coolprop-${CPVERSION}.wasm\" runCommand rsync $RSYNC_DRY_RUN $RSYNC_OPTS coolprop.js \"coolprop-${CPVERSION}.js\" coolprop.wasm \"coolprop-${CPVERSION}.wasm\" index.html frs.sf.net-$SFUSER:/home/project-web/coolprop/htdocs/jscript/ runCommand popd else printMessage "Publishing the development docs on SourceForge" runCommand rsync $RSYNC_DRY_RUN $RSYNC_OPTS \"$SPHFOLDER/\" frs.sf.net-$SFUSER:/home/project-web/coolprop/htdocs/dev fi # if [[ ("$BINFOLDER" == "release") && ("$DRYRUN" == "false") ]]; then printMessage "Removing release directory" runCommand rm -rf "release" runCommand mkdir -p "release" printMessage "Removing binaries directory to clean the nightly builds" runCommand rm -rf "binaries" runCommand mkdir -p "binaries" printMessage "Removing unstable directory to clean the custom builds" runCommand rm -rf "unstable" runCommand mkdir -p "unstable" fi runCommand popd printMessage "All done, goodbye." exit 0