unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* Release checks v3
@ 2012-09-04 14:49 Tomi Ollila
  2012-09-04 14:49 ` [PATCH v3 1/2] devel: add release-checks.sh Tomi Ollila
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Tomi Ollila @ 2012-09-04 14:49 UTC (permalink / raw)
  To: notmuch; +Cc: tomi.ollila

This if V3 of release-check.sh patches, displacing

id:"1346491928-2356-1-git-send-email-tomi.ollila@iki.fi"

Changes:

Bash kept, mainly for pipefail -- and that possible future pipeline 
additions have more protection.

Added set -o posix lessens drifts to more bashishms -- and somewhere was 
mentioned that posix mode provides a bit more robust pipefail...

Changed that one short circuit & continues to if... elif... fi construct.

Used  *[^0-9.]*) for matching non-digit and non-dot characters; this
was really nice one.

One formatting change (added newline).

Removed last 'exit 0'.

---

Something related: Some good pages for shell differences can be browsed at
http://www.in-ulm.de/~mascheck/

Diffdiff of the changes follows:

--- v2/release-checks.sh
+++ v3/release-checks.sh
@@ -10,13 +10,12 @@ then	echo
 	exit 1
 fi
 
+set -o posix
 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
@@ -28,9 +27,10 @@ append_emsg ()
 
 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"
+	if   [ ! -f "$f" ]; then append_emsg "File '$f' is missing"
+	elif [ ! -r "$f" ]; then append_emsg "File '$f' is unreadable"
+	elif [ ! -s "$f" ]; then append_emsg "File '$f' is empty"
+	fi
 done
 
 if [ -n "$emsgs" ]
@@ -62,18 +62,15 @@ verfail ()
 }
 
 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
+case $VERSION in
+	*[^0-9.]*)
+		verfail "'$VERSION' contains other characters than digits and periods" ;;
+	.*)	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
 
 
 # In the rest of this file, tests collect list of errors to be fixed
@@ -168,7 +165,9 @@ manfiles=`find man -type f | sort`
 man_pages_ok=Yes
 for mp in $manfiles
 do
-	case $mp in *.[0-9]) ;; # fall below this 'case ... esac'
+	case $mp in
+		*.[0-9]) ;; # fall below this 'case ... esac'
+
 		*/Makefile.local | */Makefile ) continue ;;
 		*/.gitignore)	continue ;;
 		*.bak)		continue ;;
@@ -201,7 +200,6 @@ 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

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3 1/2] devel: add release-checks.sh
  2012-09-04 14:49 Release checks v3 Tomi Ollila
@ 2012-09-04 14:49 ` Tomi Ollila
  2012-09-04 14:49 ` [PATCH v3 2/2] {., man}/Makefile.local: edit/remove release-checks.sh related targets Tomi Ollila
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Tomi Ollila @ 2012-09-04 14:49 UTC (permalink / raw)
  To: notmuch; +Cc: tomi.ollila

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 "script" when it gets longer.

The embedded 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 the script to fail when any of the commands in pipeline fails
(and 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.
---
 devel/release-checks.sh |  209 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 209 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..e1d19f2
--- /dev/null
+++ b/devel/release-checks.sh
@@ -0,0 +1,209 @@
+#!/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 posix
+set -o pipefail # bash feature
+
+# Avoid locale-specific differences in output of executed commands
+LANG=C LC_ALL=C; export LANG LC_ALL
+
+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
+	if   [ ! -f "$f" ]; then append_emsg "File '$f' is missing"
+	elif [ ! -r "$f" ]; then append_emsg "File '$f' is unreadable"
+	elif [ ! -s "$f" ]; then append_emsg "File '$f' is empty"
+	fi
+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... "
+case $VERSION in
+	*[^0-9.]*)
+		verfail "'$VERSION' contains other characters than digits and periods" ;;
+	.*)	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
+
+
+# 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
+ '('[2-9][0-9][0-9][0-9]-[01][0-9]-[0123][0-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`
+man_pages_ok=Yes
+for mp in $manfiles
+do
+	case $mp in
+		*.[0-9]) ;; # fall below this 'case ... esac'
+
+		*/Makefile.local | */Makefile ) continue ;;
+		*/.gitignore)	continue ;;
+		*.bak)		continue ;;
+
+		*)	append_emsg "'$mp': extra file"
+			man_pages_ok=No
+			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"
+		mman_pages_ok=No
+	fi
+	if [ "$man_date" != "$DATE" ]
+	then	append_emsg "DATE '$man_date' is not '$DATE' in $mp"
+		man_pages_ok=No
+	fi
+done
+echo $man_pages_ok.
+
+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.'
+
+
+# Local variables:
+# mode: shell-script
+# sh-basic-offset: 8
+# tab-width: 8
+# End:
+# vi: set sw=8 ts=8
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 2/2] {., man}/Makefile.local: edit/remove release-checks.sh related targets
  2012-09-04 14:49 Release checks v3 Tomi Ollila
  2012-09-04 14:49 ` [PATCH v3 1/2] devel: add release-checks.sh Tomi Ollila
@ 2012-09-04 14:49 ` Tomi Ollila
  2012-09-04 15:41 ` Release checks v3 Michal Nazarewicz
  2012-09-05 11:45 ` David Bremner
  3 siblings, 0 replies; 5+ messages in thread
From: Tomi Ollila @ 2012-09-04 14:49 UTC (permalink / raw)
  To: notmuch; +Cc: tomi.ollila

Use new target release-checks in place of verify-version-debian,
verify-version-python verify-version-manpage. This target executes
devel/release-checks.sh which does all the verifications the three
dropped targets did, and some more.
---
 Makefile.local     |   28 ++++------------------------
 man/Makefile.local |    9 +--------
 2 files changed, 5 insertions(+), 32 deletions(-)

diff --git a/Makefile.local b/Makefile.local
index de984ab..7f2d4f1 100644
--- a/Makefile.local
+++ b/Makefile.local
@@ -187,7 +187,7 @@ release-message:
 verify-source-tree-and-version: verify-no-dirty-code
 
 .PHONY: verify-no-dirty-code
-verify-no-dirty-code: verify-version-debian verify-version-python verify-version-manpage
+verify-no-dirty-code: release-checks
 ifeq ($(IS_GIT),yes)
 	@printf "Checking that source tree is clean..."
 ifneq ($(shell git ls-files -m),)
@@ -204,29 +204,9 @@ else
 endif
 endif
 
-.PHONY: verify-version-debian
-verify-version-debian: verify-version-components
-	@echo -n "Checking that Debian package version is $(VERSION)-1..."
-	@[ "$(VERSION)-1" = $$(sed '1{ s/).*//; s/.*(//; q; }' debian/changelog) ] || \
-		(echo "No." && \
-		 echo "Please edit version and debian/changelog to have consistent versions." && false)
-	@echo "Good."
-
-.PHONY: verify-version-python
-verify-version-python: verify-version-components
-	@echo -n "Checking that python bindings version is $(VERSION)..."
-	@[ "$(VERSION)" = $$(python -c "execfile('$(PV_FILE)'); print __VERSION__") ] || \
-		(echo "No." && \
-		 echo "Please edit version and $(PV_FILE) to have consistent versions." && false)
-	@echo "Good."
-
-.PHONY: verify-version-components
-verify-version-components:
-	@echo -n "Checking that $(VERSION) consists only of digits and periods..."
-	@echo $(VERSION) | grep -q -x '^[0-9.]*$$' || \
-		(echo "No." && \
-	         echo "Please follow the instructions in RELEASING to choose a version" && false)
-	@echo "Good."
+.PHONY: release-checks
+release-checks:
+	devel/release-checks.sh
 
 .PHONY: verify-newer
 verify-newer:
diff --git a/man/Makefile.local b/man/Makefile.local
index d43a949..72e2a18 100644
--- a/man/Makefile.local
+++ b/man/Makefile.local
@@ -32,7 +32,7 @@ COMPRESSED_MAN := $(MAN1_GZ) $(MAN5_GZ) $(MAN7_GZ)
 %.gz: %
 	gzip --stdout $^ > $@
 
-.PHONY: install-man update-man-versions verify-version-manpage
+.PHONY: install-man update-man-versions
 
 install-man: $(COMPRESSED_MAN)
 	mkdir -p "$(DESTDIR)$(mandir)/man1"
@@ -43,13 +43,6 @@ install-man: $(COMPRESSED_MAN)
 	install -m0644 $(MAN7_GZ) $(DESTDIR)/$(mandir)/man7
 	cd $(DESTDIR)/$(mandir)/man1 && ln -sf notmuch.1.gz notmuch-setup.1.gz
 
-verify-version-manpage: verify-version-components
-	@echo -n "Checking that manual page version is $(VERSION)..."
-	@[ "$(VERSION)" = $$(sed -n '/^[.]TH NOTMUCH 1/{s/.*"Notmuch //;s/".*//p;}' $(MAIN_PAGE)) ] || \
-		(echo "No." && \
-		 echo "Please edit version and notmuch.1 to have consistent versions." && false)
-	@echo "Good."
-
 update-man-versions: $(MAN_SOURCE)
 	for file in $(MAN_SOURCE); do \
 	    cp $$file $$file.bak ; \
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: Release checks v3
  2012-09-04 14:49 Release checks v3 Tomi Ollila
  2012-09-04 14:49 ` [PATCH v3 1/2] devel: add release-checks.sh Tomi Ollila
  2012-09-04 14:49 ` [PATCH v3 2/2] {., man}/Makefile.local: edit/remove release-checks.sh related targets Tomi Ollila
@ 2012-09-04 15:41 ` Michal Nazarewicz
  2012-09-05 11:45 ` David Bremner
  3 siblings, 0 replies; 5+ messages in thread
From: Michal Nazarewicz @ 2012-09-04 15:41 UTC (permalink / raw)
  To: Tomi Ollila, notmuch; +Cc: tomi.ollila

[-- Attachment #1: Type: text/plain, Size: 973 bytes --]

On Tue, Sep 04 2012, Tomi Ollila wrote:
> This if V3 of release-check.sh patches, displacing
>
> id:"1346491928-2356-1-git-send-email-tomi.ollila@iki.fi"
>
> Changes:
>
> Bash kept, mainly for pipefail -- and that possible future pipeline 
> additions have more protection.
>
> Added set -o posix lessens drifts to more bashishms -- and somewhere was 
> mentioned that posix mode provides a bit more robust pipefail...
>
> Changed that one short circuit & continues to if... elif... fi construct.
>
> Used  *[^0-9.]*) for matching non-digit and non-dot characters; this
> was really nice one.
>
> One formatting change (added newline).
>
> Removed last 'exit 0'.

Looks good to me.

-- 
Best regards,                                         _     _
.o. | Liege of Serenely Enlightened Majesty of      o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz    (o o)
ooo +----<email/xmpp: mpn@google.com>--------------ooO--(_)--Ooo--

[-- Attachment #2.1: Type: text/plain, Size: 0 bytes --]



[-- Attachment #2.2: Type: application/pgp-signature, Size: 835 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Release checks v3
  2012-09-04 14:49 Release checks v3 Tomi Ollila
                   ` (2 preceding siblings ...)
  2012-09-04 15:41 ` Release checks v3 Michal Nazarewicz
@ 2012-09-05 11:45 ` David Bremner
  3 siblings, 0 replies; 5+ messages in thread
From: David Bremner @ 2012-09-05 11:45 UTC (permalink / raw)
  To: Tomi Ollila, notmuch

Tomi Ollila <tomi.ollila@iki.fi> writes:

> This if V3 of release-check.sh patches, displacing
>
> id:"1346491928-2356-1-git-send-email-tomi.ollila@iki.fi"
>

pushed, 

d

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-09-05 11:45 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-04 14:49 Release checks v3 Tomi Ollila
2012-09-04 14:49 ` [PATCH v3 1/2] devel: add release-checks.sh Tomi Ollila
2012-09-04 14:49 ` [PATCH v3 2/2] {., man}/Makefile.local: edit/remove release-checks.sh related targets Tomi Ollila
2012-09-04 15:41 ` Release checks v3 Michal Nazarewicz
2012-09-05 11:45 ` David Bremner

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).