mirror of
https://github.com/proski/madwifi
synced 2024-11-25 07:49:43 +03:00
f647d069c2
gets pulled in by Subversion as external dependency. This adds some more lines to the output of "svn status", which caused the check for not yet committed changes in the local working copy to fail. These lines are now filtered out to fix this issue. git-svn-id: http://madwifi-project.org/svn/madwifi/trunk@3831 0192ed92-7a03-0410-a25b-9323aeb14dbd
299 lines
7.9 KiB
Bash
Executable File
299 lines
7.9 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Purpose: automate the process of tagging a release and packing a tarball
|
|
# for it.
|
|
|
|
# check_dir_prereq:
|
|
# ensures that a given directory name exist and is writeable
|
|
# note: $1 is expected to be set to the name of the variable that contains
|
|
# the name of the directory that is to be tested (indirect reference)
|
|
function check_dir_prereq {
|
|
eval d="\$$1"
|
|
n="$1"
|
|
|
|
if [[ ! -d "$d" || ! -w "$d" ]]; then
|
|
echo
|
|
echo "ERROR:"
|
|
echo -n "$n, currently set to $d, "
|
|
[[ ! -d "$d" ]] && echo "does not exist" || echo "is not writable"
|
|
echo
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
|
|
# check if the script has been called directly
|
|
if [[ "$(basename $(pwd))" == "scripts" ]]; then
|
|
echo
|
|
echo "ERROR:"
|
|
echo "Call this script via \"make release\" in the top-level directory of your"
|
|
echo "working copy."
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
# RELEASE_TMP and RELEASE_STORE are expected to be exported by make (from
|
|
# Makefile.inc)
|
|
if [[ "$RELEASE_TMP" == "" || "$RELEASE_STORE" == "" ]]; then
|
|
echo
|
|
echo "ERROR:"
|
|
echo "RELEASE_TMP and/or RELEASE_STORE are not set. Check Makefile.inc and try again."
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
# make sure that the directories passed in RELEASE_TMP and RELEASE_STORE
|
|
# actually exist and are writable for the caller
|
|
check_dir_prereq "RELEASE_TMP"
|
|
check_dir_prereq "RELEASE_STORE"
|
|
|
|
# caller must have write access to the madwifi.org repository
|
|
valid=0
|
|
repos=$(svn info | grep "Repository Root" | cut -d" " -f3)
|
|
for f in ~/.subversion/auth/svn.simple/*; do
|
|
if [[ "$(grep -c "$repos" $f)" != "0" ]]; then
|
|
valid=1
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [[ "$valid" != "1" ]]; then
|
|
echo
|
|
echo "WARNING:"
|
|
echo "Write access to the repository is needed in order to successfully run this"
|
|
echo "script."
|
|
|
|
read -n1 -p "Do you want to continue? [yN] " choice
|
|
if [[ "$choice" != "y" && "$choice" != "Y" ]]; then
|
|
echo
|
|
echo "Aborted."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
|
|
# check if we're in the top-level directory of the snapshot
|
|
if [[ ! -f ./release.h ]]; then
|
|
echo
|
|
echo "ERROR:"
|
|
echo "It seems that the script has not been called with the top-level directory"
|
|
echo "of the working copy as current working directory. This should not happen"
|
|
echo "if you run \"make release\" in the top-level directory of the working"
|
|
echo "copy."
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
# this script does not work for tarball snapshots
|
|
svn info > /dev/null 2>&1 || {
|
|
echo
|
|
echo "ERROR:"
|
|
echo "It seems this is no Subversion working copy of MadWifi. This script does"
|
|
echo "not work in such cases."
|
|
echo
|
|
exit 1
|
|
}
|
|
|
|
# check if local working copy has uncommitted changes
|
|
changes="$(svn status | sed -e "/^X/d" -e "/^$/d" -e "/external item/d")"
|
|
if [[ ! -z "$changes" ]]; then
|
|
echo
|
|
echo "ERROR:"
|
|
echo "Your working copy has changes which are not yet committed."
|
|
echo "Either commit or revert them before you continue to make a release."
|
|
echo "Aborting for now."
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
# make sure that the local working copy is in sync with the repository
|
|
repos=$(svn info | grep URL | cut -d" " -f2)
|
|
localrev=$(svn info | grep Last\ Changed\ Rev | cut -d" " -f4)
|
|
remoterev=$(svn log -r HEAD --quiet $repos | grep '^r[0-9]* ' | cut -d" " -f1 | cut -b2-)
|
|
|
|
if [[ "$localrev" != "$remoterev" ]]; then
|
|
echo
|
|
echo "ERROR:"
|
|
echo "Your working copy is not in sync with the repository. Please update your"
|
|
echo "working copy, then restart the release process."
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
|
|
|
|
|
|
# ask developer about the version of the new release
|
|
reproot=$(svn info | grep URL | cut -d" " -f2 | cut -d"/" -f1-4)
|
|
latest=$(svn list $reproot/tags | grep -e "^release-" | cut -d"-" -f2 | cut -d"/" -f1 | sort | tail -n 1)
|
|
|
|
echo
|
|
if [[ ! -z "$latest" ]]; then
|
|
major=$(echo $latest | cut -d"." -f1)
|
|
minor=$(echo $latest | cut -d"." -f2)
|
|
point=$(echo $latest | cut -d"." -f3)
|
|
micro=$(echo $latest | cut -d"." -f4)
|
|
|
|
if [ -n "$micro" ]; then
|
|
echo "The latest release is: $major.$minor.$point.$micro"
|
|
else
|
|
micro="0"
|
|
echo "The latest release is: $major.$minor.$point"
|
|
fi
|
|
else
|
|
latest="0.0.0"
|
|
major="0"; minor="0"; point="0"; micro="0"
|
|
|
|
echo "No releases yet."
|
|
fi
|
|
|
|
valid=0
|
|
while ! ((valid)); do
|
|
echo
|
|
echo "Please choose the release type:"
|
|
echo " 1: major release (new version will be $((major+1)).0.0)"
|
|
echo " 2: minor release (new version will be $major.$((minor+1)).0)"
|
|
echo " 3: point release (new version will be $major.$minor.$((point+1)))"
|
|
echo " 4: micro release (new version will be $major.$minor.$point.$((micro+1))"
|
|
echo " 5: other (enter new version manually)"
|
|
echo " 0: abort"
|
|
echo
|
|
|
|
read -n1 -p "Your choice: " choice
|
|
case "$choice" in
|
|
1) newmajor=$((major+1)); newminor=0; newpoint=0; newmicro=0; valid=1 ;;
|
|
2) newmajor=$major; newminor=$((minor+1)); newpoint=0; newmicro=0; valid=1 ;;
|
|
3) newmajor=$major; newminor=$minor; newpoint=$((point+1)); newmicro=0; valid=1 ;;
|
|
4) newmajor=$major; newminor=$minor; newpoint=$point; newmicro=$((micro+1)); valid=1 ;;
|
|
5)
|
|
echo
|
|
read -p "Enter release number (a.b.c.d): " newrelease
|
|
if [[ "$(echo $newrelease | grep -c '^[0-9]*\.[0-9]*\.[0-9]*\(\.[0-9]\)\?$')" == "1" ]]; then
|
|
newmajor=$(echo $newrelease | cut -d"." -f1)
|
|
newminor=$(echo $newrelease | cut -d"." -f2)
|
|
newpoint=$(echo $newrelease | cut -d"." -f3)
|
|
newmicro=$(echo $newrelease | cut -d"." -f4)
|
|
|
|
if [ -n "$newmicro" ]; then
|
|
newversion="$newmajor.$newminor.$newpoint.$newmicro"
|
|
else
|
|
newversion="$newmajor.$newminor.$newpoint"
|
|
newmicro="0"
|
|
fi
|
|
|
|
if [[ "$(svn list $reproot/tags | grep -c ^release-$newversion)" != "0" ]]; then
|
|
echo "Release $newversion already exists. Try again."
|
|
else
|
|
valid=1
|
|
fi
|
|
else
|
|
echo "Invalid release number."
|
|
fi
|
|
;;
|
|
0)
|
|
echo
|
|
echo "Aborted."
|
|
exit 0
|
|
;;
|
|
|
|
*)
|
|
echo "Invalid."
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# reassure that everything is correct
|
|
if [[ "$micro" != "0" ]]; then
|
|
oldrelease="$major.$minor.$point.$micro"
|
|
else
|
|
oldrelease="$major.$minor.$point"
|
|
fi
|
|
|
|
if [[ "$newmicro" != "0" ]]; then
|
|
newrelease="$newmajor.$newminor.$newpoint.$newmicro"
|
|
else
|
|
newrelease="$newmajor.$newminor.$newpoint"
|
|
fi
|
|
|
|
echo
|
|
echo "Last release: $oldrelease"
|
|
echo "New release : $newrelease"
|
|
echo
|
|
|
|
read -n1 -p "Is this correct? [yN] " choice
|
|
if [[ "$choice" != "y" && "$choice" != "Y" ]]; then
|
|
echo
|
|
echo "Aborted."
|
|
exit 0
|
|
fi
|
|
|
|
echo; echo
|
|
|
|
|
|
# now we have every information we need, let's start the actual release process
|
|
|
|
# temporarily adjust release type in release.h
|
|
echo "temporarily adjusting release.h..."
|
|
|
|
mv release.h release.h.old
|
|
sed -e "/svnversion.h/d" \
|
|
-e "/RELEASE_TYPE/ s/\".*\"/\"RELEASE\"/" \
|
|
-e "/RELEASE_VERSION/ s/\".*\"/\"$newrelease\"/" release.h.old > release.h
|
|
rm -f release.h.old
|
|
|
|
|
|
# tagging the release in the repository
|
|
echo "tagging release..."
|
|
|
|
msg="Tagging r$localrev as release $newrelease."
|
|
tag="release-$newrelease"
|
|
svn copy . $reproot/tags/release-$newrelease -m "$msg"
|
|
|
|
# revert local changes to release.h ...
|
|
echo "revert changes to release.h..."
|
|
svn revert release.h
|
|
|
|
# ... and modify the RELEASE_VERSION for trunk, too. We assume that the next
|
|
# release will be a point release.
|
|
echo "adjusting release.h in trunk..."
|
|
trunkrelease="$newmajor.$newminor.$((newpoint+1))"
|
|
mv release.h release.h.old
|
|
sed -e "/RELEASE_VERSION/ s/\"[0-9.]*\"/\"$trunkrelease\"/" release.h.old > release.h
|
|
rm -f release.h.old
|
|
|
|
msg="Adjust release version in response to release $newrelease."
|
|
svn commit release.h -m "$msg"
|
|
svn update -q
|
|
|
|
# create the tarball packaging directory
|
|
tmp=$RELEASE_TMP
|
|
store=$RELEASE_STORE
|
|
|
|
[[ -d $tmp/madwifi-release ]] || {
|
|
echo "creating packaging directory..."
|
|
mkdir $tmp/madwifi-release || exit 1
|
|
}
|
|
|
|
# remove old directories
|
|
rm -r $tmp/madwifi-release/* > /dev/null 2>&1
|
|
|
|
# create tarball
|
|
echo "exporting new release from repository..."
|
|
pushd $tmp/madwifi-release
|
|
svn export $reproot/tags/release-$newrelease madwifi-$newrelease
|
|
|
|
echo "packing release tarball (.tar.gz)..."
|
|
tar cf - "madwifi-$newrelease" | gzip -f9 > "madwifi-$newrelease.tar.gz"
|
|
|
|
echo "packing release tarball (.tar.bz2)..."
|
|
tar cf - "madwifi-$newrelease" | bzip2 -f > "madwifi-$newrelease.tar.bz2"
|
|
|
|
echo "cleaning up..."
|
|
rm -r $tmp/madwifi-release/madwifi-$newrelease
|
|
popd > /dev/null
|
|
mv $tmp/madwifi-release/madwifi-$newrelease.tar.* $store
|
|
|
|
echo "done."
|