From: Pascal Volk Date: Sat, 27 Mar 2010 00:35:44 +0000 (+0000) Subject: {master,doveconf}: Show the version with hg's node id, if unreleased. X-Git-Tag: 2.0.beta5~275 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2152111779d69aefaf7cfe474d80356a5d059d54;p=thirdparty%2Fdovecot%2Fcore.git {master,doveconf}: Show the version with hg's node id, if unreleased. Affects output from `dovecot --version` and `doveconf`. --HG-- branch : HEAD --- diff --git a/.hgignore b/.hgignore index 934bc94fba..151c0bd4f2 100644 --- a/.hgignore +++ b/.hgignore @@ -13,6 +13,7 @@ config.sub config.rpath configure configure.scan +dovecot-version.h libtool libtool-shared ltconfig diff --git a/Makefile.am b/Makefile.am index e10eed37f1..07d046f58f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,13 +5,19 @@ DOCS = doc 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 @@ endif 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 @@ install-exec-hook: endif CLEANFILES = $(datafiles) + +DISTCLEANFILES = $(top_builddir)/dovecot-version.h diff --git a/is-tagged.py b/is-tagged.py new file mode 100644 index 0000000000..f48d001bb7 --- /dev/null +++ b/is-tagged.py @@ -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 --git a/src/config/doveconf.c b/src/config/doveconf.c index 49c7d2bbfa..0c3f938884 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -13,6 +13,7 @@ #include "config-connection.h" #include "config-parser.h" #include "config-request.h" +#include "dovecot-version.h" #include #include @@ -513,7 +514,7 @@ int main(int argc, char *argv[]) } 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 --git a/src/master/main.c b/src/master/main.c index d770e1afed..00ff7af897 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -21,6 +21,7 @@ #include "service-monitor.h" #include "service-process.h" #include "service-log.h" +#include "dovecot-version.h" #include #include @@ -694,7 +695,7 @@ int main(int argc, char *argv[]) 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 --git a/update-version.sh b/update-version.sh new file mode 100644 index 0000000000..c4d1fae5fa --- /dev/null +++ b/update-version.sh @@ -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}" < "${BUILDDIR}/${VERSION_HT}" <