Mercurial > dovecot > core-2.2
changeset 10999:a2c6c91635b5 HEAD
{master,doveconf}: Show the version with hg's node id, if unreleased.
Affects output from `dovecot --version` and `doveconf`.
author | Pascal Volk <user@localhost.localdomain.org> |
---|---|
date | Sat, 27 Mar 2010 00:35:44 +0000 |
parents | be5b93c18203 |
children | 679e99e430d7 |
files | .hgignore Makefile.am is-tagged.py src/config/doveconf.c src/master/main.c update-version.sh |
diffstat | 6 files changed, 140 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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
--- /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())
--- 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);
--- 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();
--- /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}"