shellinabox/commit

214 lines
7.5 KiB
Text
Raw Permalink Normal View History

#!/bin/bash -e
# The script ensures that all commands succeed unless an error occurred. If it
# does though, the shell terminates the script and our exit handler runs.
trap 'tput bel || :; echo Failed! >&2' EXIT
# Ask the user a yes/no question. This function does not require the user to
# press ENTER after making a selection.
yes_no() {
local c
while :; do
c="$(set +e
trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT
stty -echo iuclc -icanon 2>/dev/null
dd count=1 bs=1 2>/dev/null | od -An -tx1)"
case "$c" in
" 0a") if [ -n "$1" ]; then
[ $1 -eq 0 ] && echo "Y" || echo "N"
return $1
fi
;;
" 79") echo "Y"
return 0
;;
" 6e") echo "N"
return 1
;;
"") echo "Aborted" >&2
exit 1
;;
*) # The user pressed an unrecognized key. As we are not echoing
# any incorrect user input, alert the user by ringing the bell.
(tput bel) 2>/dev/null || :
;;
esac
done
}
# Build Debian package and create all the files that are needed by the
# distribution maintainer.
debian_package() {
set -e
(
# Try to build the package. If things fail, let the exit handler remove all
# temporary files.
trap 'rm -rf "${prj}-${ver}" "${prj}_${ver}"*' EXIT
# Clean up any old temporary files
rm -rf "${prj}-${ver}" "${prj}_${ver}"*
# Extract the distribution source archive
tar zfx "${prj}-${ver}.tar.gz"
# We want to ship the "debian" directory with the source archive that
# users download directly from the project web site. This allows them to
# easily build their own Debian package by following the instructions in
# INSTALL.Debian.
# But when preparing our package for direct integration with Debian-based
# distributions, we have to instead remove the "debian" directory, as the
# distribution prefers that third-party projects are not built "natively".
mv "${prj}-${ver}/debian" "${prj}_${ver}_debian"
tar zfc "${prj}_${ver}.orig.tar.gz" "${prj}-${ver}"
mv "${prj}_${ver}_debian" "${prj}-${ver}/debian"
# Reset compatibility level
echo 7 >"${prj}-${ver}/debian/compat"
sed -i -e 's/debhelper *([^0-9]*[^)]*)/debhelper (>= 7.0.0)/' \
"${prj}-${ver}/debian/control"
sed -i -e 's/dh_clean *-k/dh_prep/' "${prj}-${ver}/debian/rules"
# Check that the version number in the debian/changelog file matches
if [ "$(sed -e 's/^'"${prj}"' *(\([^-]*\)-.*).*/\1/;t1;d;:1;q' \
"${prj}-${ver}/debian/changelog")" != "${ver}" ]; then
echo "Debian changelog file does not match current version number!" >&2
exit 1
fi
# Build Debian packages.
(cd "${prj}-${ver}"
fakeroot dpkg-buildpackage -sa -us -uc || :)
trap '' EXIT
# Run lintian
lintian --verbose -I ${prj}_${ver}*_*.changes
) || exit 1
# Revert any changes that might be pending in distributions/debian/*
local revert="$(svn st |
grep distributions/debian |
grep '^[^?]' |
awk '{ print $2 }' |
tac)"
if [ -n "${revert}" ]; then
svn revert ${revert}
rm -f ${revert}
fi
# Create distributions/debian if it does not exist yet.
mkdir -p distributions/debian
for i in distributions distributions/debian; do
if [ -z "$(svn st "${i}" 2>/dev/null | grep -v '^[?]')" ]; then
svn add --depth=empty "${i}"
fi
done
# If this version of files already exists in the distribution directory,
# we are not yet ready to cut a new release. Just clean up and exit.
for i in "${prj}_${ver}"[-.]*.*; do
[ -r "distributions/debian/${i}" ] && {
rm $(ls "${prj}_${ver}"[-.]* | egrep -v '_*.changes|_*.deb')
return 0
}
done
# Move new Debian files into release area.
mv $(ls "${prj}_${ver}"[-.]* | egrep -v '_*.changes|_*.deb') \
distributions/debian/
svn add distributions/debian/"${prj}_${ver}"[-.]*.*
# Let the caller know that we added new packages.
return 1
}
# Quick sanity check that we are running from the correct directory
test -r configure.ac
# Make sure there are no stale files
svn update
# Determine Subversion revision number, project name, and public version
# number
{
rev=$(($(svn info | sed -e 's/^Revision: \(.*\)/\1/;t1;d;:1;q')+1))
prj="$(sed -e 's/^AC_INIT(\([^,]*\),.*/\1/;t1;d;:1;q' configure.ac)"
ver="$(sed -e 's/^AC_INIT([^,]*, *\([^,]*\),.*/\1/;t1;d;:1;q' configure.ac)"
} 2>/dev/null
# Update "configure.ac" with the next Subversion revision number. This
# information will trickle down into various source files where it becomes
# part of the user-visible version information.
sed -i -e 's/^\(VCS_REVISION=\).*/\1'"${rev}"'/' configure.ac
touch shellinabox/vt100.jspp shellinabox/shell_in_a_box.jspp
# If the manual page has been changed, make sure that the time stamp will be
# changed, too.
if [ -n "$(svn st shellinabox/shellinaboxd.man.in 2>/dev/null |
grep '^M')" ]; then
sed -i -e 's/^\([.]TH .*\)"[^"]*"/\1"'"$(date +'%b %d, %Y')"'"/
s/2008-2[01][0-9][0-9]/2008-'"$(date +'%Y')"'/g' \
shellinabox/shellinaboxd.man.in
fi
# Always update the year in the user visible copyright statement(s)
for i in shellinabox/shell_in_a_box.jspp \
shellinabox/vt100.jspp \
COPYING \
debian/copyright; do
sed -i -e 's/\(2[01][0-9][0-9]-\)2[01][0-9][0-9]/\1'"$(date +'%Y')"'/g' "$i"
done
# If a source file has changed, make sure to update the year in the copyright
# statement for that particular file.
svn st | egrep '^[MA]' | awk '{ print $2 }' |
egrep '^(shellinabox|libhttp|demo)/' |
egrep '[.](html|h|c|css|jspp)$' |
while read -r f; do
sed -i -e 's/\(2[01][0-9][0-9]-\)2[01][0-9][0-9]/\1'"$(date +'%Y')"'/g' "$f"
done
# For now, Ubuntu/Hardy is still quite popular. We want to make it easy for
# our users to build Debian packages from source. So, make sure we lock the
# compatibility level at 6. Once we no longer care about maintaining strict
# backwards compatibility, we can lift this restriction.
echo 6 >debian/compat
sed -i -e 's/debhelper *([^0-9]*[^)]*)/debhelper (>= 6.0.0)/' debian/control
sed -i -e 's/dh_prep/dh_clean *-k/' debian/rules
# Build all the sources, create the distribution tar archive, and run some
# basic sanity checks.
make all distcheck
# Build Debian package and create all the files that are needed by the
# distribution maintainer.
msg=
debian_package || {
msg="${msg}
NOTICE: New version released. Please do not forget to notify distributions"
if [ -r ~/.shellinabox-notifier ]; then
while read e; do
{
echo "This is an automatically generated e-mail notification that"
echo "a new release of ShellInABox has just been made available"
echo "on the project's website at http://shellinabox.com"
echo
echo "You had previously requested to be notified when this happens."
} | mail -s "New ShellInABox release" "$e"
done
else
msg="${msg}
NOTICE: Could not find ~/.shellinabox-notifier. Not sending e-mail..."
fi
}
svn diff $(svn st |
egrep -v ' configure$| aclocal.m4$|distributions|^[?]' |
sed -e 's/^[^ ]* *//') | less
echo -n 'Commit these changes (Y/n): '
yes_no 0 || exit 1
svn commit
echo "${msg}"
trap '' EXIT
exit 0