dovecot-2.0: {master,doveconf}: Show the version with hg's node ...

dovecot at dovecot.org dovecot at dovecot.org
Sat Mar 27 02:41:01 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/a2c6c91635b5
changeset: 10999:a2c6c91635b5
user:      Pascal Volk <user at localhost.localdomain.org>
date:      Sat Mar 27 00:35:44 2010 +0000
description:
{master,doveconf}: Show the version with hg's node id, if unreleased.
Affects output from `dovecot --version` and `doveconf`.

diffstat:

 .hgignore             |   1 +
 Makefile.am           |  13 ++++++
 is-tagged.py          |  55 +++++++++++++++++++++++++++
 src/config/doveconf.c |   3 +-
 src/master/main.c     |   3 +-
 update-version.sh     |  67 +++++++++++++++++++++++++++++++++
 6 files changed, 140 insertions(+), 2 deletions(-)

diffs (222 lines):

diff -r be5b93c18203 -r a2c6c91635b5 .hgignore
--- a/.hgignore	Sat Mar 27 01:54:31 2010 +0200
+++ b/.hgignore	Sat Mar 27 00:35:44 2010 +0000
@@ -13,6 +13,7 @@
 config.rpath
 configure
 configure.scan
+dovecot-version.h
 libtool
 libtool-shared
 ltconfig
diff -r be5b93c18203 -r a2c6c91635b5 Makefile.am
--- a/Makefile.am	Sat Mar 27 01:54:31 2010 +0200
+++ b/Makefile.am	Sat Mar 27 00:35:44 2010 +0000
@@ -5,13 +5,19 @@
 endif
 
 SUBDIRS = \
+	. \
 	src \
 	$(DOCS)
 
+dist_pkginclude_HEADERS = \
+	dovecot-version.h
+
 EXTRA_DIST = \
 	COPYING.LGPL \
 	COPYING.MIT \
 	ChangeLog \
+	is-tagged.py \
+	update-version.sh \
 	$(conf_DATA)
 
 datafiles = \
@@ -31,6 +37,11 @@
 
 aclocal_DATA = dovecot.m4
 
+dovecot-version.h: noop
+	$(SHELL) $(top_srcdir)/update-version.sh $(top_srcdir) $(top_builddir)
+
+noop:
+
 dovecot-config: dovecot-config.in Makefile
 	old=`pwd` && cd $(top_builddir) && abs_builddir=`pwd` && cd $$old && \
 	cd $(top_srcdir) && abs_srcdir=`pwd` && cd $$old && \
@@ -61,3 +72,5 @@
 endif
 
 CLEANFILES = $(datafiles)
+
+DISTCLEANFILES = $(top_builddir)/dovecot-version.h
diff -r be5b93c18203 -r a2c6c91635b5 is-tagged.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/is-tagged.py	Sat Mar 27 00:35:44 2010 +0000
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+    Checks if the current revision of the repository is a tagged revision,
+    but not 'tip'.
+
+    usage:
+    python is-tagged.py [/path/to/repo]
+    if no path is given, the current working directory will be used.
+
+    Exit status:
+      0 if the current revision is a tagged version OR
+        if the current revision was used for signing/tagging OR
+        if path is not a Mercurial repository OR
+        if module import should fail for some reason
+      1 if the current revision has no tag, except 'tip'
+"""
+import re
+import sys
+
+from mercurial import hg, ui
+try:
+    from mercurial.error import Abort, RepoError
+except ImportError:
+    try:
+        from mercurial.repo import RepoError
+        from mercurial.util import Abort
+    except ImportError:  # something old/new?
+        sys.exit(0)
+
+RE = r'^Added\s(?:signature|tag)\s(?:[\w\.]+\s)?for\schangeset\s[\da-f]{12,}$'
+
+
+def main():
+    if len(sys.argv) > 1:
+        path = sys.argv[1].strip()
+    else:
+        path = '.'
+    try:
+        repo = hg.repository(ui.ui(), path)
+    except (Abort, RepoError):  # no/bad repo? no extra version info
+        return 0
+    parents_id = repo.dirstate.parents()[0]
+    ctx = repo.changectx(parents_id)
+    if re.match(RE, ctx.description()):  # tag or sig was added for a release
+        return 0
+    for tag, nodeid in repo.tags().iteritems():
+        if tag != 'tip' and parents_id == nodeid:  # tagged
+            return 0
+    # not tagged
+    return 1
+
+
+if __name__ == '__main__':
+    sys.exit(main())
diff -r be5b93c18203 -r a2c6c91635b5 src/config/doveconf.c
--- a/src/config/doveconf.c	Sat Mar 27 01:54:31 2010 +0200
+++ b/src/config/doveconf.c	Sat Mar 27 00:35:44 2010 +0000
@@ -13,6 +13,7 @@
 #include "config-connection.h"
 #include "config-parser.h"
 #include "config-request.h"
+#include "dovecot-version.h"
 
 #include <stdio.h>
 #include <unistd.h>
@@ -513,7 +514,7 @@
 	} else {
 		/* print the config file path before parsing it, so in case
 		   of errors it's still shown */
-		printf("# "VERSION": %s\n", config_path);
+		printf("# "DOVECOT_VERSION_FULL": %s\n", config_path);
 		fflush(stdout);
 	}
 	master_service_init_finish(master_service);
diff -r be5b93c18203 -r a2c6c91635b5 src/master/main.c
--- a/src/master/main.c	Sat Mar 27 01:54:31 2010 +0200
+++ b/src/master/main.c	Sat Mar 27 00:35:44 2010 +0000
@@ -21,6 +21,7 @@
 #include "service-monitor.h"
 #include "service-process.h"
 #include "service-log.h"
+#include "dovecot-version.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -694,7 +695,7 @@
 
 	while (optind < argc) {
 		if (strcmp(argv[optind], "--version") == 0) {
-			printf("%s\n", VERSION);
+			printf("%s\n", DOVECOT_VERSION_FULL);
 			return 0;
 		} else if (strcmp(argv[optind], "--build-options") == 0) {
 			print_build_options();
diff -r be5b93c18203 -r a2c6c91635b5 update-version.sh
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/update-version.sh	Sat Mar 27 00:35:44 2010 +0000
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+SRCDIR="${1:-`pwd`}"
+BUILDDIR="${2:-`pwd`}"
+VERSION_H="dovecot-version.h"
+VERSION_HT="dovecot-version.h.tmp"
+
+abspath()
+{ #$1 the path
+  #$2 1 -> SRCDIR || 2 -> BUILDDIR
+	old=`pwd`
+	cd "${1}"
+	if [ ${2} -eq 1 ]; then
+		SRCDIR=`pwd`
+	else
+		BUILDDIR=`pwd`
+	fi
+	cd "$old"
+}
+
+abspath "${SRCDIR}" 1
+abspath "${BUILDDIR}" 2
+
+# when using a different BUILDDIR just copy from SRCDIR, if there is no .hg
+if [ "${BUILDDIR}" != "${SRCDIR}" ]; then
+	if [ ! -d "${SRCDIR}/.hg" ]  && [ -f "${SRCDIR}/${VERSION_H}" ]; then
+		cmp -s "${SRCDIR}/${VERSION_H}" "${BUILDDIR}/${VERSION_H}"
+		if [ $? -ne 0 ]; then
+			cp "${SRCDIR}/${VERSION_H}" "${BUILDDIR}/${VERSION_H}"
+			exit 0
+		fi
+	fi
+fi
+
+# Don't generate dovecot-version.h if the source tree has no .hg dir but
+# a dovecot-version.h. This may be the result of a release/nightly tarball.
+[ ! -d "${SRCDIR}/.hg" ] && [ -f "${BUILDDIR}/${VERSION_H}" ] && exit 0
+
+# Lets generate the dovecot-version.h
+[ -f "${BUILDDIR}/${VERSION_HT}" ] && rm -f "${BUILDDIR}/${VERSION_HT}"
+python "${SRCDIR}/is-tagged.py" "${SRCDIR}"
+if [ $? = 1 ]; then
+	# older hg doesn't recognize option -i
+	#HGID=`hg -R ${SRCDIR} id -i 2>/dev/null`
+	HGID=`hg -R ${SRCDIR} id 2>/dev/null | awk '{print $1}'`
+	cat > "${BUILDDIR}/${VERSION_HT}" <<EOF
+#ifndef DOVECOT_VERSION_H
+#define DOVECOT_VERSION_H
+
+#define DOVECOT_VERSION_FULL VERSION" (${HGID})"
+
+#endif /* DOVECOT_VERSION_H */
+EOF
+else
+	cat > "${BUILDDIR}/${VERSION_HT}" <<EOF
+#ifndef DOVECOT_VERSION_H
+#define DOVECOT_VERSION_H
+
+#define DOVECOT_VERSION_FULL VERSION
+
+#endif /* DOVECOT_VERSION_H */
+EOF
+fi
+
+cmp -s "${BUILDDIR}/${VERSION_H}" "${BUILDDIR}/${VERSION_HT}" && \
+	rm -f "${BUILDDIR}/${VERSION_HT}" || \
+	mv "${BUILDDIR}/${VERSION_HT}" "${BUILDDIR}/${VERSION_H}"


More information about the dovecot-cvs mailing list