From 688ea5616782f36c0fe1d72f58f610491467e5c2 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 3 Sep 2012 10:49:41 -0500 Subject: release_helpers: New directory --- release-helpers/cut_release | 353 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100755 release-helpers/cut_release diff --git a/release-helpers/cut_release b/release-helpers/cut_release new file mode 100755 index 0000000..40889d7 --- /dev/null +++ b/release-helpers/cut_release @@ -0,0 +1,353 @@ +#! /bin/bash +# +# Cut a snapshot of a module in CVS +# +# Example Invocations: +# +# +# $Id: cut_release,v 1.11 2004/07/29 16:05:40 joel Exp $ +# + + +usage() +{ + echo "$0 [options]" + echo " options:" + echo " -c release -- current release (required)" + echo " -p release -- previous release (NA == none)" + echo " -m module -- CVS module name (required)" + echo " -r release_name -- base of release image name" + echo " -d directory -- release directory (required)" + echo " -z -- use gzip not bzip2 for archives" + echo " -V -- generate file Version report" + echo " -v -- be verbose" + echo + echo "Must be run from top level directory of checked out source." + echo + exit 1 +} + +fatal() +{ + echo $* + usage +} + +previous=NA +current=NOT_SET +reldir_base=NOT_SET +module_name=NOT_SET +release_name=NOT_SET +verbose=no +zipper=bzip2 +unzipper=bunzip2 +zext=bz2 +do_version_report=no + +while test $# -ge 1; do + case $1 in + -c) shift ; current=$1 ;; + -p) shift ; previous=$1 ;; + -m) shift ; module_name=$1 ;; + -r) shift ; release_name=$1 ;; + -d) shift ; reldir_base=$1 ;; + -z) zipper=gzip ; unzipper=gunzip ; zext=gz ;; + -V) do_version_report=yes ;; + -v) verbose=yes ;; + *) + fatal "invalid option $1" + ;; + esac + shift +done + +if test ${module_name} = NOT_SET ; then + grep "/" CVS/Repository >/dev/null + if test $? -eq 0 ; then + fatal "Module name not specified." + fi + module_name=`cat CVS/Repository` +fi + +if test ${reldir_base} = NOT_SET ; then + reldir_base=/home/releases/${module_name} + if test ! -d ${reldir_base} ; then + fatal "Release directory not specified and ${reldir_base} does not exist." + fi + module_name=`cat CVS/Repository` +else + if test ! -d ${reldir_base} ; then + fatal "Release directory (${reldir_base}) does not exist." + fi +fi + +if test ${verbose} = yes ; then + echo "===========================================" + echo "Current Release :" ${current} + echo "Previous Release :" ${previous} + echo "Module Name :" ${module_name} + echo "Release Base Name :" ${release_name} + echo "Release Directory :" ${reldir_base} + echo "Compression :" ${zipper} ${unzipper} ${zext} + echo "Generate Version Report :" ${do_version_report} + echo "===========================================" + exit 0 +fi + +# Now check the arguments + +if test ${current} = NOT_SET ; then + fatal "Current release not specified." +fi + +if test ${release_name} = NOT_SET ; then + echo "Using module_name (${module_name}) as release name.". + release_name=${module_name} +fi + +##### setup some directory assumptions +reldir_prev=${reldir_base}/${previous} +reldir_curr=${reldir_base}/${current} +export_dir=${reldir_base}/export +base=`pwd` +cvs_root=`cat ${base}/CVS/Root` +cvs_repository=`cat ${base}/CVS/Repository` +cvs_module=`basename ${cvs_repository}` + +# Make sure we are at the top of a checked out tree +if [ "${cvs_module}"X != "${module_name}"X ] ; then + echo You do not appear to be in the top level of a checked out ${module_name} tree + exit 1 +fi + +# Test if we generate diffs and the old release is there. +if [ ${previous} != "NA" ] ; then + if [ ! -d ${reldir_prev} ] ; then + echo Previous release ${previous} not found + exit 1 + fi +fi + +# Check that the export directory exists +test -d ${export_dir} || mkdir ${export_dir} + +# turn the version string into a valid cvs tag +mk_version_tag() +{ + echo ${release_name}-${1} | tr "." "-" +} + +current_tag=`mk_version_tag ${current}` +previous_tag=`mk_version_tag ${previous}` + +if [ ${previous} != "NA" ] ; then + echo Using $previous_tag as the tag for the previous version +else + echo No previous version +fi +echo Using $current_tag as the tag for the current version + +# Changing the version string + +cd ${base} +Pname=${module} +if test -x ${base}/release_support ; then + Pname=`${base}/release_support name` + test $? -ne 0 && (echo "release support (name) script failed." ; exit 1) +fi + +# make sure certain special files are there prior to a release +if [ ! -r VERSION -o ! -r SUPPORT ] ; then + echo Error unable to find VERSION or SUPPORT in the working tree. + exit 1 +fi + +# We often need to know who is cutting the release +if test "X${LOGNAME}" = "X" ; then + echo "LOGNAME not set" + usage +fi + +user_name=`grep ^$LOGNAME /etc/passwd | cut -d':' -f5 | cut -d',' -f1` +# If you don't have user information, then we won't commit anything. +if test "X${user_name}" = "X" ; then + echo "User information not set" + usage +fi + +# before we tag anything make sure it hasn't previously been exported +if [ -d ${export_dir}/${release_name}-${current} ] ; then + echo You must have run this before. + echo Removing ${release_name}-${current} + rm -rf ${export_dir}/${release_name}-${current} +fi + +# This is where the module has the opportunity to do actions before we tag. +if test -x ${base}/release_support ; then + ${base}/release_support pretag ${release_name} ${current} + test $? -ne 0 && (echo "release support (pretag) script failed." ; exit 1) +fi + +# +# Whether or not there were special considerations, there might be a +# version file. +# +version_file=VERSION +if [ -r ${version_file} ] ; then + if test "X${user_name}" = "X" ; then + echo "ERROR: User information not set in password file" + usage + fi + ( echo "#" ; + echo "# This file is automatically generated -- DO NOT EDIT!!!" ; + echo "#" ; + echo "# \$Id\$" ; + echo "#" ; + echo ; + echo ${Pname} "Version ${current}" ) >$version_file + ( echo `date +"%Y-%m-%d"`" ${user_name}" ; + echo ; + echo " * ${version_file}: Updated to ${release_name}-${current}." ; + echo ) >YYY + if [ -r ChangeLog ] ; then + cat YYY ChangeLog >XXX + mv XXX ChangeLog + cvs -d ${cvs_root} commit -F YYY ChangeLog ${version_file} + rm -f YYY + else + cvs -d ${cvs_root} commit -m \ + "changed version to ${current}" ${version_file} + fi +fi + +# tag the current source +cd ${base} +cvs -d ${cvs_root} tag ${current_tag} `grep -v "^D$" CVS/Entries | cut -d'/' -f2` +if test $? -ne 0 ; then + echo Unable to tag source + exit 1 +fi + +# export the current source +cd ${export_dir} +cvs -d ${cvs_root} export -r ${current_tag} -d ${release_name}-${current} ${module_name} +if test $? -ne 0 ; then + echo Unable to export source + exit 1 +fi + +# Now start dealing with the exported source +cd ${release_name}-${current} +#if [ ! -r VERSION -o ! -r SUPPORT ] ; then +# echo Error unable to find VERSION or SUPPORT in the exported tree. +# exit 1 +#fi + +# This is where the module has the opportunity to do actions after we export. +if test -x ${base}/release_support ; then + ${base}/release_support postexport + test $? -ne 0 && (echo "release support (postexport) script failed." ; exit 1) +fi + +# cut the release files +test -d ${reldir_curr} || mkdir ${reldir_curr} + +# Generate tar and compress it. +cd .. +tar cf ${reldir_curr}/${release_name}-${current}.tar ${release_name}-${current} +${zipper} ${reldir_curr}/${release_name}-${current}.tar + + +# generate diffs if requested +if [ ${previous} != "NA" ] ; then + if [ -r ${reldir_prev}/${release_name}-${previous}.tgz ] ; then + tar xzf ${reldir_prev}/${release_name}-${previous}.tgz + fi + if [ -r ${reldir_prev}/${release_name}-${previous}.tar.gz ] ; then + tar xzf ${reldir_prev}/${release_name}-${previous}.tar.gz + fi + if [ -r ${reldir_prev}/${release_name}-${previous}.tar.bz2 ] ; then + bzcat ${reldir_prev}/${release_name}-${previous}.tar.bz2 | tar xf - + fi + + diff -N -P -r -u ${release_name}-${previous} ${release_name}-${current} \ + >${reldir_curr}/${release_name}-${previous}-${current}.diff + + ls -l ${reldir_curr}/${release_name}-${previous}-${current}.diff + + ${zipper} ${reldir_curr}/${release_name}-${previous}-${current}.diff + + ls -l ${reldir_curr}/${release_name}-${previous}-${current}.diff.${zext} + +fi + +# This is where the module has the opportunity to do actions after +# the tarball is made. This can be used to capture host information, +# sign the tarball, etc. +# +# NOTE: The contents are virgin before this is executed and it is OK +# if the script generates files in the tree. This is commonly +# where documentation might be automatically generated. +cd ${release_name}-${current} +if test -x ${base}/release_support ; then + ${base}/release_support after_tar ${current} ${reldir_curr} +fi + +# generate a ChangeLog difference +# +# NOTE: Removes ALL files not named ChangeLog. Export directory is +# useless past this point. +cd .. +if [ ${previous} != "NA" ] ; then + if [ -r ${release_name}-${current}/ChangeLog ] ; then + find ${release_name}-${previous} ${release_name}-${current} -type f | \ + grep -v ChangeLog | xargs -e rm -rf + + diff -N -P -r -c ${release_name}-${previous} ${release_name}-${current} \ + >${reldir_curr}/${release_name}-ChangeLog-${previous}-${current}.diff + fi +fi + +# generate the version report +cd ${base} +if [ ${do_version_report} = yes ] ; then + # trace output from here down is EXTREMEMLY noisy + set +x + find . -type d -name "CVS" | while read d + do + D=`dirname $d` + cat $d/Entries | grep -v ^D | while read entry + do + # echo $entry + file=`echo $entry | cut -d'/' -f2` + ffile=`echo $D/$file | sed -e 's/^\.\///'` + version=`echo $entry | cut -d'/' -f3` + modified=`echo $entry | cut -d'/' -f4` + # printf "%s\t%s\t%s\n" $D/$file $version "$modified" + printf "%s\t%s\t%s\n" $version "$modified" $ffile + done + done >${reldir_curr}/${release_name}-${current}-FILES +fi + +# generate md5 checksums +cd ${reldir_curr} +find `pwd` -type d | while read d +do + cd $d + rm -f md5sum.txt + files=`find . -maxdepth 1 -type f | wc -l` + if [ ${files} -eq 0 ] ; then + echo $d is empty so no checksum generated + else + echo Checksum generated for $d + md5sum `find . -maxdepth 1 -type f` >md5sum.txt + fi +done + +# remove the exported source to save space +rm -rf ${export_dir} + +echo ${reldir_curr}/${release_name}-${current}.tar* + +exit 0 + -- cgit v1.2.3