(THRIFT-40) Add -version switch to the compiler to show the Thrift version
authorDavid Reiss <dreiss@apache.org>
Mon, 30 Jun 2008 20:24:24 +0000 (20:24 +0000)
committerDavid Reiss <dreiss@apache.org>
Mon, 30 Jun 2008 20:24:24 +0000 (20:24 +0000)
The version is determined by configure.ac. After this version is shown the
revision. For subversion, it is simply the current revision as given by
`svnversion`. For git, the latest svn revision that HEAD includes is shown,
followed by the offset of HEAD from that commit, followed by a truncated sha1
for HEAD. If the offset is 0, the offset and sha1 are omitted.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@672900 13f79535-47bb-0310-9956-ffa450edef68

compiler/cpp/Makefile.am
compiler/cpp/src/main.cc
print_version.sh [new file with mode: 0755]

index d7c7085..2dcdb5e 100644 (file)
@@ -1,4 +1,5 @@
 AM_YFLAGS = -d
+BUILT_SOURCES =
 
 bin_PROGRAMS = thrift
 
@@ -80,3 +81,31 @@ EXTRA_DIST = README
 
 clean-local:
        $(RM) thriftl.cc thrifty.cc thrifty.h
+
+src/main.cc: version.h
+
+# Adding this to BUILT_SOURCES will cause version.h to be
+# regenerated on every "make all" or "make check", which is
+# necessary because it changes whenever we "svn up" or similar.
+# Ideally, we would like this to be regenerated whenever the
+# compiler is rebuilt, but every way we could think of to do
+# that caused unnecessary rebuilds of the compiler.
+BUILT_SOURCES += regen_version_h
+
+THRIFT_VERSION=$(shell /bin/sh $(top_srcdir)/print_version.sh -v)
+THRIFT_REVISION=$(shell /bin/sh $(top_srcdir)/print_version.sh -r)
+
+regen_version_h:
+       @echo -n "Regenerating version.h... "
+       @TMPFILE=`mktemp ./version_h.tmp_XXXXXX` ; \
+               echo "// AUTOGENERATED, DO NOT EDIT" > $$TMPFILE ; \
+               echo '#define THRIFT_VERSION "$(THRIFT_VERSION)"\n' >> $$TMPFILE ; \
+               echo '#define THRIFT_REVISION "$(THRIFT_REVISION)"\n' >> $$TMPFILE ; \
+               if cmp $$TMPFILE version.h >/dev/null ; \
+               then \
+                       rm -f $$TMPFILE ; \
+                       echo "No changes." ; \
+               else \
+                       mv $$TMPFILE version.h ; \
+                       echo "Updated." ; \
+               fi
index c6a848b..8c3903a 100644 (file)
@@ -40,6 +40,8 @@
 #include "generate/t_xsd_generator.h"
 #include "generate/t_erl_generator.h"
 
+#include "version.h"
+
 using namespace std;
 
 /**
@@ -588,12 +590,20 @@ void generate_all_fingerprints(t_program* program) {
   */
 }
 
+/**
+ * Prints the version number
+ */
+void version() {
+  printf("Thrift version %s-%s\n", THRIFT_VERSION, THRIFT_REVISION);
+}
+
 /**
  * Diplays the usage message and then exits with an error code.
  */
 void usage() {
   fprintf(stderr, "Usage: thrift [options] file\n");
   fprintf(stderr, "Options:\n");
+  fprintf(stderr, "  -version    Print the compiler version\n");
   fprintf(stderr, "  -php        Generate PHP output files\n");
   fprintf(stderr, "  -phpi       Generate PHP inlined files\n");
   fprintf(stderr, "  -phps       Generate PHP server stubs (with -php)\n");
@@ -937,7 +947,10 @@ int main(int argc, char** argv) {
         ++arg;
       }
 
-      if (strcmp(arg, "-debug") == 0) {
+      if (strcmp(arg, "-version") == 0) {
+        version();
+        exit(1);
+      } else if (strcmp(arg, "-debug") == 0) {
         g_debug = 1;
       } else if (strcmp(arg, "-nowarn") == 0) {
         g_warn = 0;
@@ -1051,6 +1064,12 @@ int main(int argc, char** argv) {
     }
   }
 
+  // if you're asking for version, you have a right not to pass a file
+  if (strcmp(argv[argc-1], "-version") == 0) {
+    version();
+    exit(1);
+  }
+
   // TODO(dreiss): Delete these when everyone is using the new hotness.
   if (gen_cpp) {
     pwarning(1, "-cpp is deprecated.  Use --gen cpp");
diff --git a/print_version.sh b/print_version.sh
new file mode 100755 (executable)
index 0000000..92d1a2d
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+cd "`dirname "$0"`"
+
+# Computing both the version and the revision on every invocation is wasteful,
+# but it is cheap and avoids the use of nonportable shell functions.
+
+VERSION=`sed -ne 's/^AC_INIT(\[thrift\], \[\(.*\)\])$/\1/p' configure.ac`
+
+if test -d .svn ; then
+  REVISION="r`svnversion`"
+elif test -d .git ; then
+  SHA1=`git rev-list --max-count=1 --grep='^git-svn-id:' HEAD`
+  REVISION=`git cat-file commit $SHA1 | sed -ne 's/^git-svn-id:[^@]*@\([0-9][0-9]*\).*/r\1/p'`
+  OFFSET=`git rev-list ^$SHA1 HEAD | wc -l`
+  if test $OFFSET != 0 ; then
+    REVISION="$REVISION-$OFFSET-`git rev-parse --verify HEAD | cut -c 1-7`"
+  fi
+else
+  REVISION="exported"
+fi
+
+case "$1" in
+  -v) echo $VERSION ;;
+  -r) echo $REVISION ;;
+  -a) echo "$VERSION-$REVISION" ;;
+  *) echo "Usage: $0 -v|-r|-a"; exit 1;;
+esac