Release script for SVN
I am currently working on a project that comprises several components individually managed in SVN. These components are built and then linked in to the final binary. To makes things easier I wrote a release script that creates an editable commit message with the SVN revisions of the components and commits the final binary. I thought it might be useful to others so generalised it.
The script is available here and is shown below.
#!/bin/bash
# Returns the SVN revision of a directory and whether it is modified.
getsvnrev() {
if [ -n "$1" ] ; then
dir=$1
else
dir=.
fi
if [ -d $dir ] ; then
# Get the last changed revision
ver=$(svn info $dir | sed -n "/^Last Changed Rev/p")
if [ -n "$ver" ] ; then
ver=$(echo $ver | awk '{ print $NF; }')
fi
# Test to see if there are modified files in the sandbox
if [ -n "$ver" ] ; then
mod=$(svn status $dir | sed -n "/^[AMD]/p")
if [ -n "$mod" ] ; then
echo "R$ver(modified)"
else
echo "R$ver"
fi
fi
fi
}
# tempfile is nicer but not always supported
mktempfile() {
if [ -n "$(which tempfile)" ]; then
tempfile
else
mktemp /tmp/makerelease.XXXXX
fi
}
# Output usage to stderr
usage() {
echo "usage: makerelease [option] dir [dir]" >&2
}
# Output help to stdout
fullhelp() {
echo "Usage: makerelease [option] dir [dir]"
echo " -r directory commit specified release directory"
echo " -h display this help"
}
# If no release directory supplied commits pwd
reldir=.
# Process command line options
while getopts :r:h opt
do
case "$opt" in
r)
reldir="$OPTARG"
;;
h)
fullhelp
exit 0
;;
🙂
echo "Missing argument for $OPTARG" >&2
usage
exit 1
;;
*)
echo "Invalid option: $OPTARG" >&2
usage
exit 1
;;
esac
done
# Skip all the options processed above
shift `expr $OPTIND - 1`
# Check we have at least one argument
if [ $# -ne 1 ] ; then
echo "You need to supply at least one component directory." >&2
usage
exit 1
fi
# Check to see if release directory is modified
reldirmod=$(svn status $reldir | sed -n "/^[AMD]/p")
if [ -z "$reldirmod" ] ; then
echo "No changes to commit." >&2
exit 1
fi
# Create a log file and allow user to edit it
msgfile=$(mktempfile)
if [ $? -ne 0 ] ; then
echo "Could not create temp file." >&2
exit 1
fi
echo "Components..." > $msgfile
while (( "$#" ))
do
echo " $1: $(getsvnrev $1)" >> $msgfile
shift
done
nano $msgfile
if [ $? -ne 0 ] ; then
echo "Editor returned an error." >&2
rm -f $msgfile
exit 1
fi
# Commit changes
svn commit -F $msgfile $reldir
if [ $? -ne 0 ] ; then
echo "Commit failed." >&2
rm -f $msgfile
exit 1
fi
# Clean up
rm $msgfile
exit 0
It is commented so I will not explain it further. To use it either run it in the directory you wish to commit, or use the -r option (followed by the path to the directory to commit), together with a list of directories comprising the SVN components.