#!/bin/bash version=0.10 program=${0##*/} progdir=${0%/*} if [ "$progdir" = "$program" ]; then progdir="."; fi # ---------------------------------------------------------------------- function usage() { cat < COPYRIGHT Copyright 2007,2013 The IETF Trust. EOF } # ---------------------------------------------------------------------- function die() { echo -e "\n$program: error: $*" > /dev/stderr exit 1 } function note() { if [ -n "$VERBOSE" ]; then echo -e "$*"; fi } # ---------------------------------------------------------------------- function version() { echo -e "$program $version" } # ---------------------------------------------------------------------- trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR # ---------------------------------------------------------------------- # Option parsing # Options shortopts=hnvV longopts=help,dry-run,verbose,version # Default values MSG="" PROJ=postconfirm VERFILE=$PROJ/__init__.py SETUP=setup.py do="" if [ "$(uname)" = "Linux" ]; then args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@") if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi eval set -- "$args" sed="sed -r" else # Darwin, BSDs args=$(getopt -o$shortopts $SV $*) if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi set -- $args sed="sed -E" fi while true ; do case "$1" in -h| --help) usage; exit;; # Show this help, then exit -m| --message) MSG=$2; shift;; # Specify a commit message -n| --dry-run) do="echo ==> ";; # Show what would be done -v| --verbose) VERBOSE=1;; # Be more talkative -V| --version) version; exit;; # Show program version, then exit --) shift; break;; *) die "Internal error, inconsistent option specification: '$1'";; esac shift done # ---------------------------------------------------------------------- # The program itself ARGMIN=1 if [ $# -lt $ARGMIN ]; then usage die "$# arguments found, $ARGMIN required" fi VER=$1 WORK=$2 REPO=$(svn info | grep "^Repository Root:" | awk '{ print $3 }') RURL=$(svn info | grep "^URL:" | awk '{ print $2 }') RDIR=${RURL#$REPO} DIR=${RDIR#/} if [ -z "$DIR" ]; then die "Couldn't find anything to release here" elif [ "${DIR%%/*}" = "trunk" ]; then SRC="trunk" elif [ "${DIR%%/*}" = "branch" ]; then tmp=${DIR#*/} # get rid of 'branch/' SRC="branch/${tmp%%/*}" # keep first subdir under branch/ fi # If a project subdirectory was specified on the command line, then use it SRC=$SRC${WORK:+/$WORK} note "" note "Releasing from $SRC" note "Locating the root of the working copy..." while [ "${#DIR}" -gt "${#SRC}" ]; do [ "$DIR" = "$prev" ] && die "Internal error" cd .. #note " now at $PWD" prev=$DIR DIR=${DIR%/*} done if [ "$DIR" != "$SRC" ]; then die "Couldn't find the root of your '$SRC' working copy" fi note " $DIR" REPO=${REPO%/} # remove trailing slash SRC=${SRC#/} # remove leading slash MAJOR=${VER%%.*} REST=${VER#*.} MINOR=${REST%.*} MAINT=${REST#*.} VER="$(printf %d.%d.%d $MAJOR $MINOR $MAINT)" NEXT=$(( $MAINT + 1 )) DEV="$(printf %d.%d.%ddev1 $MAJOR $MINOR $NEXT)" note "Checking that changelog information is available" changes=$( sed -n "/^$PROJ ($VER.*)/,/^ -- /p" changelog ) [ "$changes" ] || die "No changelog information for $VER found" contributors=$(echo "$changes" | sed 's/\.[ \t\n]/ /'| tr -c "a-z0-9.@-" "\n" | sort | uniq | grep '@' | sed -r -e 's/^\.+//' -e 's/\.+$//' -e 's/^/-c /' || true) note "Set the current time on the release notes in the changelog file" $do sed -r -i -e "1,/^ -- /s/([A-Za-z-]+ <[a-z0-9.-]+@[a-z0-9.-]+> ).*$/\1$(date +'%d %b %Y %H:%M:%S %z')/" changelog note " $(grep -m1 "^ -- " changelog)" note "Verifying that version $VER doesn't already exist..." $do svn info $REPO/tags/${WORK:+$WORK/}$VER 2>&1 | $do egrep -q "(Not a valid URL|URL .* non-existent)" || die "The tag '$VER' already exists (or there was an error testing for it)." note " Ok" note "\nUpdating the version info in $VERFILE and settings.py" $do sed -i -r -e "/^__version__/s/['\"][\.0-9]+(dev[0-9]+)?['\"]/'$VER'/" $VERFILE $do sed -i -r -e "/version=/s/['\"][\.0-9]+(dev[0-9]?)?['\"]/'$VER'/" setup.py note "\nVerifying that we're now reporting the correct version" $do python setup.py -q install [ "$(postconfirmd --version)" = "postconfirmd $VER" ] || die "postconfirmd reported the wrong version number" note "\nCommitting version information for version $VER: $MSG" $do svn commit $VERFILE setup.py -m "Set version info to release version $VER before tagging." note "Verifying there's no uncommitted changes..." $do svn st | grep -v changelog | grep "^[AMGRD] " && die "There seems to be uncommitted changes in this working copy" note "Committing the changelog..." $do svn commit changelog -m "Changelog entry for $VER" note "\nDoing the upload" $do python setup.py sdist upload --sign note "\nCreating new tag 'tags/${WORK:+$WORK/}$VER' from $SRC" $do svn cp $REPO/$SRC $REPO/tags/${WORK:+$WORK/}$VER -m "Creating new tag 'tags/${WORK:+$WORK/}$VER' from $SRC" note "\nUpdating version info to indicate development mode" $do sed -i -r -e "/^__version__/s/'[\.0-9]+(dev[0-9]?)?\"/'$NEXT'/" $VERFILE $do sed -i -r -e "/version=/s/'[\.0-9]+(dev[0-9]?)?\"/'$NEXT'/" setup.py note "\nCommitting the updated version" $do svn commit $VERFILE setup.py -m "Set version info back to development mode" $do svn update # echo " # Hi, # # This is an automatic notification about a new xml2rfc release, # v$VER, generated when running the mkrelease script. # # Release notes: # # $changes # # The preferred way to install xml2rfc is by doing 'pip install xml2rfc', # and 'pip install --upgrade xml2rfc' to upgrade. If there are system- # installed python modules which pip will not upgrade, you may have to # use 'pip install --upgrade --no-deps xml2rfc' and install dependencies # manually. # # The new version is also available through SVN checkout, with # 'svn checkout $REPO/tags/${WORK:+$WORK/}$VER' # # Regards, # # Henrik # (via the mkrelease script) # " > ./mail/release-mail-v$VER.txt # note "\nSend mail to interested parties" # cat ./mail/release-mail-v$VER.txt | $do mail -s "New xml2rfc release: v$VER" -c henrik@levkowetz.com -c glen@amsl.com -c mlarson@amsl.com -c rjs@nostrum.com -c housley@vigilsec.com -c arusso@amsl.com -c sginoza@amsl.com -c mferguson@amsl.com $contributors rse@rfc-editor.org # note "\nSend mail to mailing lists (avoiding too many addressees" # cat ./mail/release-mail-v$VER.txt | $do mail -s "New xml2rfc release: v$VER" xml2rfc@ietf.org -c rfc-markdown@ietf.org -c codesprints@ietf.org # # #$do toolsfeed control changelog /www/tools.ietf.org/tools/atomfeed.xml # $do toolpush /www/tools.ietf.org/tools/atomfeed.xml # $do toolcmd sudo pip install --upgrade xml2rfc