[PATCH] devel: add release-checks.sh

Tomi Ollila tomi.ollila at iki.fi
Wed Aug 8 13:01:47 PDT 2012


Currently Makefile.local contains some machine executable release
checking functionality. This is unnecessarily complex way to do it:

Multiline script functionality is hard to embed -- from Makefile point
of view there is just one line split using backslashes and every line
ends with ';'. It is hard to maintain such "scripts" when it gets longer.

The script does not fail as robust as separate script; set -eu could
be added to get same level of robustness -- but the provided Bourne
Again Shell (bash) script exceeds this with 'set -o pipefail', making
script to fail when any of the commands in pipeline fails (i.e. not
just the last one).

Checking for release is done very seldom compared to all other use;
The whole Makefile.local gets simpler and easier to grasp when most
release checking targets are removed.

When release checking is done, the steps are executed sequentially;
nothing is allowed to be skipped due to some satisfied dependency.
---

I did not send patch to remove corresponding lines from Makefile.local
just yet. This allows David to run this script in parallel to the code
currently in Makefile.local -- and make sure 0.14 gets best release
engineering treatment so far. Then Makefile.local can be made to execute
this script in place of code it supersedes.

 devel/release-checks.sh |  210 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 210 insertions(+), 0 deletions(-)
 create mode 100755 devel/release-checks.sh

diff --git a/devel/release-checks.sh b/devel/release-checks.sh
new file mode 100755
index 0000000..29e27df
--- /dev/null
+++ b/devel/release-checks.sh
@@ -0,0 +1,210 @@
+#!/usr/bin/env bash
+
+set -eu
+#set -x # or enter bash -x ... on command line.
+
+if [ x"${BASH_VERSION-}" = x ]
+then	echo
+	echo "Please execute this script using 'bash' interpreter."
+	echo
+	exit 1
+fi
+
+set -o pipefail # bash feature
+
+# Avoid locale-specific differences in output of executed commands.
+LANG=C LC_ALL=C; export LANG LC_ALL
+
+readonly DEFAULT_IFS="$IFS"
+
+readonly PV_FILE='bindings/python/notmuch/version.py'
+
+# using array here turned out to be unnecessarily complicated
+emsgs=''
+append_emsg ()
+{
+	emsgs="${emsgs:+$emsgs\n}  $1"
+}
+
+for f in ./version debian/changelog NEWS "$PV_FILE"
+do
+	test -f $f || { append_emsg "File '$f' is missing"; continue; }
+	test -r $f || { append_emsg "File '$f' is unreadable"; continue; }
+	test -s $f ||   append_emsg "File '$f' is empty"
+done
+
+if [ -n "$emsgs" ]
+then
+	echo 'Release files problems; fix these and try again:'
+	echo -e "$emsgs"
+	exit 1
+fi
+
+if read VERSION
+then
+	if read rest
+	then	echo "'version' file contains more than one line"
+		exit 1
+	fi
+else
+	echo "Reading './version' file failed (suprisingly!)"
+	exit 1
+fi < ./version
+
+readonly VERSION
+
+verfail ()
+{
+	echo No.
+	echo "$@"
+	echo "Please follow the instructions in RELEASING to choose a version"
+	exit 1
+}
+
+echo -n "Checking that '$VERSION' is good with digits and periods... "
+if [ -z "${VERSION//[0123456789.]/}" ] # bash feature
+then
+	case $VERSION in
+		.*)	verfail "'$VERSION' begins with a period" ;;
+		*.)	verfail "'$VERSION' ends with a period" ;;
+		*..*)	verfail "'$VERSION' contains two consecutive periods";;
+		*.*)	echo Yes. ;;
+		*)	verfail "'$VERSION' is a single number" ;;
+	esac
+else
+	verfail "'$VERSION' contains other characters than digits and periods"
+fi
+
+
+# In the rest of this file, tests collect list of errors to be fixed
+
+echo -n "Checking that this is Debian package for notmuch... "
+read deb_notmuch deb_version rest < debian/changelog
+if [ "$deb_notmuch" = 'notmuch' ]
+then
+	echo Yes.
+else
+	echo No.
+	append_emsg "Package name '$deb_notmuch' is not 'notmuch' in debian/changelog"
+fi
+
+echo -n "Checking that Debian package version is $VERSION-1... "
+
+if [ "$deb_version" = "($VERSION-1)" ]
+then
+	echo Yes.
+else
+	echo No.
+	append_emsg "Version '$deb_version' is not '($VERSION-1)' in debian/changelog"
+fi
+
+echo -n "Checking that python bindings version is $VERSION... "
+py_version=`python -c "execfile('$PV_FILE'); print __VERSION__"`
+if [ "$py_version" = "$VERSION" ]
+then
+	echo Yes.
+else
+	echo No.
+	append_emsg "Version '$py_version' is not '$VERSION' in $PV_FILE"
+fi
+
+echo -n "Checking that this is Notmuch NEWS... "
+read news_notmuch news_version news_date < NEWS
+if [ "$news_notmuch" = "Notmuch" ]
+then
+	echo Yes.
+else
+	echo No.
+	append_emsg "First word '$news_notmuch' is not 'Notmuch' in NEWS file"
+fi
+
+echo -n "Checking that NEWS version is $VERSION... "
+if [ "$news_version" = "$VERSION" ]
+then
+	echo Yes.
+else
+	echo No.
+	append_emsg "Version '$news_version' in NEWS file is not '$VERSION'"
+fi
+
+#eval `date '+year=%Y mon=%m day=%d'`
+today0utc=`date --date=0Z +%s` # gnu date feature
+
+echo -n "Checking that NEWS date is right... "
+case $news_date in
+ '('201[0-9]-[0-1][1-9]-[0-3][1-9]')')
+	newsdate0utc=`nd=${news_date#\\(}; date --date="${nd%)} 0Z" +%s`
+	ddiff=$((newsdate0utc - today0utc))
+	if [ $ddiff -lt -86400 ] # since beginning of yesterday...
+	then
+		echo No.
+		append_emsg "Date $news_date in NEWS file is too much in the past"
+	elif [ $ddiff -gt 172800 ] # up to end of tomorrow...
+	then
+		echo No.
+		append_emsg "Date $news_date in NEWS file is too much in the future"
+	else
+		echo Yes.
+	fi ;;
+ *)
+	echo No.
+	append_emsg "Date '$news_date' in NEWS file is not in format (yyyy-mm-dd)"
+esac
+
+readonly DATE=${news_date//[()]/} # bash feature
+manthdata ()
+{
+	set x $*
+	if [ $# != 7 ]
+	then
+		append_emsg "'$mp' has too many '.TH' lines"
+		man_mismatch=1
+	fi
+	man_date=${5-} man_version=${7-}
+}
+
+echo -n "Checking that manual page dates and versions are $DATE and $VERSION... "
+manfiles=`find man -type f | sort`
+for mp in $manfiles
+do
+	case $mp in *.[0-9]) ;; # fall below this case ... esac
+		*/Makefile.local | */Makefile ) continue ;;
+		*/.gitignore) continue ;;
+		*)	append_emsg "'$mp': extra file"
+			man_mismatch=1
+			continue ;;
+	esac
+	manthdata `sed -n '/^[.]TH NOTMUCH/ { y/"/ /; p; }' "$mp"`
+	if [ "$man_version" != "$VERSION" ]
+	then	append_emsg "Version '$man_version' is not '$VERSION' in $mp"
+		man_mismatch=1
+	fi
+	if [ "$man_date" != "$DATE" ]
+	then	append_emsg "DATE '$man_date' is not '$DATE' in $mp"
+		man_mismatch=1
+	fi
+done
+
+test "${man_mismatch-}" != 1 && echo Yes. || echo No.
+
+
+if [ -n "$emsgs" ]
+then
+	echo
+	echo 'Release check failed; check these issues:'
+	echo -e "$emsgs"
+	exit 1
+fi
+
+echo All checks this script executed completed successfully.
+echo Make sure that everything else mentioned in RELEASING
+echo file is in order, too.
+
+exit 0
+
+# Local variables:
+# mode: shell-script
+# sh-basic-offset: 8
+# tab-width: 8
+# End:
+# vi: set sw=8 ts=8
--
1.7.1



More information about the notmuch mailing list