forked from ungleich-public/cdist
		
	
		
			
	
	
		
			336 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			336 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  | #!/bin/sh | ||
|  | # | ||
|  | # 2011-2013 Nico Schottelius (nico-cdist at schottelius.org) | ||
|  | # 2016 Darko Poljak (darko.poljak at gmail.com) | ||
|  | # | ||
|  | # This file is part of cdist. | ||
|  | # | ||
|  | # cdist is free software: you can redistribute it and/or modify | ||
|  | # it under the terms of the GNU General Public License as published by | ||
|  | # the Free Software Foundation, either version 3 of the License, or | ||
|  | # (at your option) any later version. | ||
|  | # | ||
|  | # cdist is distributed in the hope that it will be useful, | ||
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||
|  | # GNU General Public License for more details. | ||
|  | # | ||
|  | # You should have received a copy of the GNU General Public License | ||
|  | # along with cdist. If not, see <http://www.gnu.org/licenses/>. | ||
|  | # | ||
|  | # | ||
|  | # This file contains the heavy lifting found usually in the Makefile | ||
|  | # | ||
|  | 
 | ||
|  | # vars for make | ||
|  | helper=$0 | ||
|  | 
 | ||
|  | basedir=${0%/*}/../ | ||
|  | # run_as is used to check how the script is called (by $0 value) | ||
|  | # currently supported sufixes for $0 are: | ||
|  | # .freebsd - run as freebsd | ||
|  | basename=${0##*/} | ||
|  | run_as=${basename#*.} | ||
|  | case "$run_as" in | ||
|  |     freebsd) | ||
|  |         to_a=cdist-configuration-management | ||
|  |         to_d=googlegroups.com | ||
|  |         from_a=darko.poljak | ||
|  |         from_d=gmail.com | ||
|  |         ml_name="Darko Poljak" | ||
|  |         ml_sig_name="Darko" | ||
|  | 
 | ||
|  |         # vars for make | ||
|  |         WEBDIR=../vcs/www.nico.schottelius.org | ||
|  |     ;; | ||
|  |     *) | ||
|  |         to_a=cdist | ||
|  |         to_d=l.schottelius.org | ||
|  |         from_a=nico-cdist | ||
|  |         from_d=schottelius.org | ||
|  |         ml_name="Nico -telmich- Schottelius" | ||
|  |         ml_sig_name="Nico" | ||
|  | 
 | ||
|  |         # vars for make | ||
|  |         WEBDIR=$$HOME/vcs/www.nico.schottelius.org | ||
|  |     ;; | ||
|  | esac | ||
|  | 
 | ||
|  | # Change to checkout directory | ||
|  | cd "$basedir" | ||
|  | 
 | ||
|  | version=$(git describe) | ||
|  | 
 | ||
|  | option=$1; shift | ||
|  | 
 | ||
|  | case "$option" in | ||
|  |     print-make-vars) | ||
|  |         printf "helper: ${helper}\n" | ||
|  |         printf "WEBDIR: ${WEBDIR}\n" | ||
|  |     ;; | ||
|  |     print-runas) | ||
|  |         printf "run_as: $run_as\n" | ||
|  |     ;; | ||
|  |     changelog-changes) | ||
|  |         if [ "$#" -eq 1 ]; then | ||
|  |             start=$1 | ||
|  |         else | ||
|  |             start="[[:digit:]]" | ||
|  |         fi | ||
|  | 
 | ||
|  |         end="[[:digit:]]" | ||
|  | 
 | ||
|  |         awk -F: "BEGIN { start=0 } | ||
|  |             { | ||
|  |                 if(start == 0) { | ||
|  |                     if (\$0 ~ /^$start/) { | ||
|  |                         start = 1 | ||
|  |                     } | ||
|  |                 } else { | ||
|  |                     if (\$0 ~ /^$end/) { | ||
|  |                         exit | ||
|  |                     } else { | ||
|  |                         print \$0  | ||
|  |                     } | ||
|  |                 } | ||
|  |             }" "$basedir/docs/changelog" | ||
|  |     ;; | ||
|  | 
 | ||
|  |     changelog-version) | ||
|  |         # get version from changelog | ||
|  |         grep '^[[:digit:]]' "$basedir/docs/changelog" | head -n1 | sed 's/:.*//' | ||
|  |     ;; | ||
|  | 
 | ||
|  |     check-date) | ||
|  |         # verify date in changelog is today | ||
|  |         date_today="$(date +%Y-%m-%d)" | ||
|  |         date_changelog=$(grep '^[[:digit:]]' "$basedir/docs/changelog" | head -n1 | sed 's/.*: //') | ||
|  | 
 | ||
|  |         if [ "$date_today" != "$date_changelog" ]; then | ||
|  |             echo "Date in changelog is not today" | ||
|  |             echo "Changelog: $date_changelog" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |     ;; | ||
|  | 
 | ||
|  |     check-unittest) | ||
|  |         "$0" test | ||
|  |     ;; | ||
|  | 
 | ||
|  |     blog) | ||
|  |         version=$1; shift | ||
|  |         blogfile=$1; shift | ||
|  |         dir=${blogfile%/*} | ||
|  |         file=${blogfile##*/} | ||
|  | 
 | ||
|  | 
 | ||
|  |         cat << eof > "$blogfile" | ||
|  | [[!meta title="Cdist $version released"]] | ||
|  | 
 | ||
|  | Here's a short overview about the changes found in version ${version}: | ||
|  | 
 | ||
|  | eof | ||
|  | 
 | ||
|  |         $0 changelog-changes "$version" >> "$blogfile" | ||
|  | 
 | ||
|  |         cat << eof >> "$blogfile" | ||
|  | For more information visit the [[cdist homepage|software/cdist]]. | ||
|  | 
 | ||
|  | [[!tag cdist config unix]] | ||
|  | eof | ||
|  |         cd "$dir" | ||
|  |         git add "$file" | ||
|  |         # Allow git commit to fail if there are no changes | ||
|  |         git commit -m "cdist blog update: $version" "$blogfile" || true | ||
|  |     ;; | ||
|  | 
 | ||
|  |     ml-release) | ||
|  |         if [ $# -ne 1 ]; then | ||
|  |             echo "$0 ml-release version" >&2 | ||
|  |             exit 1 | ||
|  |         fi | ||
|  | 
 | ||
|  |         version=$1; shift | ||
|  | 
 | ||
|  |         to=${to_a}@${to_d} | ||
|  |         from=${from_a}@${from_d} | ||
|  | 
 | ||
|  |         (  | ||
|  |         cat << eof | ||
|  | From: ${ml_name} <$from> | ||
|  | To: cdist mailing list <$to> | ||
|  | Subject: cdist $version released | ||
|  | 
 | ||
|  | Hello .*, | ||
|  | 
 | ||
|  | cdist $version has been released with the following changes: | ||
|  | 
 | ||
|  | eof | ||
|  | 
 | ||
|  |         "$0" changelog-changes "$version" | ||
|  |         cat << eof | ||
|  | 
 | ||
|  | Cheers, | ||
|  | 
 | ||
|  | ${ml_sig_name} | ||
|  | 
 | ||
|  | --  | ||
|  | Automatisation at its best level. With cdist. | ||
|  | eof | ||
|  |         ) | /usr/sbin/sendmail -f "$from" "$to" | ||
|  |     ;; | ||
|  | 
 | ||
|  |     release-git-tag) | ||
|  |         target_version=$($0 changelog-version) | ||
|  |         if git rev-parse --verify refs/tags/$target_version 2>/dev/null; then | ||
|  |             echo "Tag for $target_version exists, aborting" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |         printf "Enter tag description for ${target_version}: " | ||
|  |         read tagmessage | ||
|  |         git tag "$target_version" -m "$$tagmessage" | ||
|  |     ;; | ||
|  | 
 | ||
|  |     release) | ||
|  |         set -e | ||
|  |         target_version=$($0 changelog-version) | ||
|  |         target_branch=$($0 version-branch) | ||
|  | 
 | ||
|  |         echo "Beginning release process for $target_version" | ||
|  | 
 | ||
|  |         # First check everything is sane | ||
|  |         "$0" check-date | ||
|  |         "$0" check-unittest | ||
|  | 
 | ||
|  |         # Generate version file to be included in packaging | ||
|  |         "$0" version | ||
|  | 
 | ||
|  |         # Ensure the git status is clean, else abort | ||
|  |         if ! git diff-index --name-only --exit-code HEAD ; then | ||
|  |             echo "Unclean tree, see files above, aborting" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  | 
 | ||
|  |         # Ensure we are on the master branch | ||
|  |         masterbranch=yes | ||
|  |         if [ "$(git rev-parse --abbrev-ref HEAD)" != "master" ]; then | ||
|  |             echo "Releases are happening from the master branch, aborting" | ||
|  | 
 | ||
|  |             echo "Enter the magic word to release anyway" | ||
|  |             read magicword | ||
|  | 
 | ||
|  |             if [ "$magicword" = "iknowwhatido" ]; then | ||
|  |                 masterbranch=no | ||
|  |             else | ||
|  |                 exit 1 | ||
|  |             fi | ||
|  |         fi | ||
|  | 
 | ||
|  |         if [ "$masterbranch" = yes ]; then | ||
|  |             # Ensure version branch exists | ||
|  |             if ! git rev-parse --verify refs/heads/$target_branch 2>/dev/null; then | ||
|  |                 git branch "$target_branch" | ||
|  |             fi | ||
|  | 
 | ||
|  |             # Merge master branch into version branch | ||
|  |             git checkout "$target_branch" | ||
|  |             git merge master | ||
|  |         fi | ||
|  | 
 | ||
|  |         # Verify that after the merge everything works | ||
|  |         "$0" check-date | ||
|  |         "$0" check-unittest | ||
|  | 
 | ||
|  |         # Generate man pages (indirect check if they build) | ||
|  |         make helper=${helper} WEBDIR=${WEBDIR} man | ||
|  | 
 | ||
|  |         # Generate speeches (indirect check if they build) | ||
|  |         make helper=${helper} WEBDIR=${WEBDIR} speeches | ||
|  | 
 | ||
|  |         #############################################################  | ||
|  |         # Everything green, let's do the release | ||
|  | 
 | ||
|  |         # Tag the current commit | ||
|  |         "$0" release-git-tag | ||
|  | 
 | ||
|  |         # Also merge back the version branch | ||
|  |         if [ "$masterbranch" = yes ]; then | ||
|  |             git checkout master | ||
|  |             git merge "$target_branch" | ||
|  |         fi | ||
|  | 
 | ||
|  |         # Publish git changes | ||
|  |         make helper=${helper} WEBDIR=${WEBDIR} pub | ||
|  | 
 | ||
|  |         # publish man, speeches, website | ||
|  |         if [ "$masterbranch" = yes ]; then | ||
|  |             make helper=${helper} WEBDIR=${WEBDIR} web-release-all | ||
|  |         else | ||
|  |             make helper=${helper} WEBDIR=${WEBDIR} web-release-all-no-latest | ||
|  |         fi | ||
|  | 
 | ||
|  |         # Ensure that pypi release has the right version | ||
|  |         "$0" version | ||
|  | 
 | ||
|  |         # Create and publish package for pypi | ||
|  |         make helper=${helper} WEBDIR=${WEBDIR} pypi-release | ||
|  | 
 | ||
|  |         case "$run_as" in | ||
|  |             freebsd) | ||
|  |             ;; | ||
|  |             *) | ||
|  |                 # Archlinux release is based on pypi | ||
|  |                 make archlinux-release | ||
|  |             ;; | ||
|  |         esac | ||
|  | 
 | ||
|  |         # Announce change on ML | ||
|  |         make helper=${helper} WEBDIR=${WEBDIR} ml-release | ||
|  | 
 | ||
|  |         cat << eof | ||
|  | Manual steps post release: | ||
|  | 
 | ||
|  |     - linkedin | ||
|  |     - hackernews | ||
|  |     - reddit | ||
|  |     - twitter | ||
|  | 
 | ||
|  | eof | ||
|  | 
 | ||
|  |         case "$run_as" in | ||
|  |             freebsd) | ||
|  |                 cat <<eof | ||
|  | Additional steps post release: | ||
|  |     - archlinux release | ||
|  | eof | ||
|  |             ;; | ||
|  |             *) | ||
|  |             ;; | ||
|  |         esac | ||
|  | 
 | ||
|  |     ;; | ||
|  | 
 | ||
|  |     test) | ||
|  |         export PYTHONPATH="$(pwd -P)" | ||
|  | 
 | ||
|  |         if [ $# -lt 1 ]; then | ||
|  |             python3 -m cdist.test | ||
|  |         else | ||
|  |             python3 -m unittest "$@" | ||
|  |         fi | ||
|  |     ;; | ||
|  | 
 | ||
|  |     version-branch) | ||
|  |         "$0" changelog-version | cut -d. -f '1,2' | ||
|  |     ;; | ||
|  | 
 | ||
|  |     version) | ||
|  |         echo "VERSION = \"$(git describe)\"" > cdist/version.py | ||
|  |     ;; | ||
|  | 
 | ||
|  |     *) | ||
|  |         echo "Unknown helper target $@ - aborting" | ||
|  |         exit 1 | ||
|  |     ;; | ||
|  | 
 | ||
|  | esac |