From 84a12e4041f5c7a2e95248a371fb282a7c78f0c9 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Fri, 16 Jul 2010 10:18:24 +0200
Subject: [PATCH] Introduce git reference/tag tracking for debugging

This patch adds a new vcs-version file that is generated via git (and
can be adapted if VCS is changed) and then embebbded as VCS_VERSION in
the constants module.

This means two things:
- local modifications without committing to git (or when using a tar.gz
  archive + mods) will not be reflected
- version is fixed at the time of the last make regen-vcs-version (dist time,
  or devel/upload which calls this)

Thus this is more geared at developers rather than end users.

The patch:

- adds rules for generating the vcs-version file
- adds a dist-hook for re-generating the file (if possible) and copying
  the updated version to the distdir
- modifies devel/upload to re-generate the file before upload

The output of --version will look like:
gnt-cluster (ganeti v2.2.0beta0-184-gebca7e6) 2.2.0~beta0

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 Makefile.am      | 32 +++++++++++++++++++++++++++++---
 devel/upload.in  |  6 ++++--
 lib/cli.py       |  3 ++-
 lib/constants.py |  3 ++-
 4 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 615ed85c1..c4d350bea 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -66,7 +66,8 @@ MAINTAINERCLEANFILES = \
 	$(docpng) \
 	$(maninput) \
 	doc/install-quick.rst \
-	doc/news.rst
+	doc/news.rst \
+	vcs-version
 
 maintainer-clean-local:
 	rm -rf $(BUILDTIME_DIRS)
@@ -501,8 +502,25 @@ man/%.8: man/%.8.in $(REPLACE_VARS_SED)
 man/%.html: man/%.html.in $(REPLACE_VARS_SED)
 	sed -f $(REPLACE_VARS_SED) < $< > $@
 
-lib/_autoconf.py: Makefile stamp-directories
+vcs-version:
+	if test -d .git; then \
+	  git describe > $@; \
+	elif test ! -f $@ ; then \
+	  echo "Cannot auto-generate $@ file"; exit 1; \
+	fi
+
+.PHONY: regen-vcs-version
+regen-vcs-version:
 	set -e; \
+	cd $(srcdir); \
+	if test -d .git; then \
+	  rm -f vcs-version; \
+	  $(MAKE) vcs-version; \
+	fi
+
+lib/_autoconf.py: Makefile stamp-directories vcs-version
+	set -e; \
+	VCSVER=`cat $(abs_top_srcdir)/vcs-version`; \
 	{ echo '# This file is automatically generated, do not edit!'; \
 	  echo '#'; \
 	  echo ''; \
@@ -547,6 +565,7 @@ lib/_autoconf.py: Makefile stamp-directories
 	  echo "DAEMONS_GROUP = '$(DAEMONS_GROUP)'"; \
 	  echo "MASTERD_USER = '$(MASTERD_USER)'"; \
 	  echo "RAPI_USER = '$(RAPI_USER)'"; \
+	  echo "VCS_VERSION = '$$VCSVER'"; \
 	} > $@
 
 $(REPLACE_VARS_SED): Makefile
@@ -620,7 +639,14 @@ lint: ganeti $(BUILT_SOURCES)
 	@test -n "$(PYLINT)" || { echo 'pylint' not found during configure; exit 1; }
 	$(PYLINT) $(LINT_OPTS) $(lint_python_code)
 
-# a dist hook rule for catching revision control directories
+# a dist hook rule for updating the vcs-version file; this is
+# hardcoded due to where it needs to build the file...
+dist-hook:
+	$(MAKE) regen-vcs-version && \
+	rm -f $(top_distdir)/vcs-version && \
+	cp -p $(srcdir)/vcs-version $(top_distdir)
+
+# a distcheck hook rule for catching revision control directories
 distcheck-hook:
 	if find $(top_distdir) -name .svn -or -name .git | grep .; then \
 		echo "Found revision control files in final archive." 1>&2; \
diff --git a/devel/upload.in b/devel/upload.in
index f690453e1..885a51d22 100644
--- a/devel/upload.in
+++ b/devel/upload.in
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (C) 2006, 2007 Google Inc.
+# Copyright (C) 2006, 2007, 2008, 2009, 2010 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 # This is a test script to ease development and testing on test clusters.
 # It should not be used to update production environments.
 
-# Usage: upload.sh node-{1,2,3}
+# Usage: upload node-{1,2,3}
 # it will upload the python libraries to
 # $prefix/lib/python2.4/site-packages/ganeti and the command line utils to
 # $prefix/sbin. It needs passwordless root login to the nodes.
@@ -64,6 +64,8 @@ done
 
 set ${hosts}
 
+make regen-vcs-version
+
 TXD=`mktemp -d`
 trap 'rm -rf $TXD' EXIT
 
diff --git a/lib/cli.py b/lib/cli.py
index 92877e2fd..8c17e4ba9 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -1033,7 +1033,8 @@ def _ParseArgs(argv, commands, aliases):
     binary = argv[0].split("/")[-1]
 
   if len(argv) > 1 and argv[1] == "--version":
-    ToStdout("%s (ganeti) %s", binary, constants.RELEASE_VERSION)
+    ToStdout("%s (ganeti %s) %s", binary, constants.VCS_VERSION,
+             constants.RELEASE_VERSION)
     # Quit right away. That way we don't have to care about this special
     # argument. optparse.py does it the same.
     sys.exit(0)
diff --git a/lib/constants.py b/lib/constants.py
index eb38fb3f2..da52f1357 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -1,7 +1,7 @@
 #
 #
 
-# Copyright (C) 2006, 2007 Google Inc.
+# Copyright (C) 2006, 2007, 2008, 2009, 2010 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -32,6 +32,7 @@ OS_API_V10 = 10
 OS_API_V15 = 15
 OS_API_V20 = 20
 OS_API_VERSIONS = frozenset([OS_API_V10, OS_API_V15, OS_API_V20])
+VCS_VERSION = _autoconf.VCS_VERSION
 EXPORT_VERSION = 0
 RAPI_VERSION = 2
 
-- 
GitLab