From 5bebf939e76c0a680e76ba5ca0257d1348e8ac46 Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Fri, 28 Sep 2018 14:59:04 +0200
Subject: [PATCH] started versioning for c++ code

---
 .gitignore                                    |  4 ++++
 CMakeLists.txt                                |  2 ++
 CMakeModules/prepare_version.cmake            |  7 ++++++
 common/cpp/CMakeLists.txt                     |  3 ++-
 common/cpp/include/common/version.h.in        | 17 ++++++++++++++
 common/go/src/asapo_common/version/version.go | 23 +++++++++++++++++++
 .../asapo_common/version/version_lib.go.in    |  7 ++++++
 .../dummy_data_producer.cpp                   |  1 +
 .../worker/getnext_broker/getnext_broker.cpp  |  1 +
 .../worker/process_folder/process_folder.cpp  |  3 +++
 producer/api/include/asapo_producer.h         |  2 ++
 .../src/main_eventmon.cpp                     |  3 +++
 receiver/src/main.cpp                         |  2 ++
 worker/api/cpp/include/asapo_worker.h         |  1 +
 14 files changed, 75 insertions(+), 1 deletion(-)
 create mode 100644 CMakeModules/prepare_version.cmake
 create mode 100644 common/cpp/include/common/version.h.in
 create mode 100644 common/go/src/asapo_common/version/version.go
 create mode 100644 common/go/src/asapo_common/version/version_lib.go.in

diff --git a/.gitignore b/.gitignore
index 1e7857733..005f5fbce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -132,3 +132,7 @@ asapo_tools/pkg
 #
 *.rpm
 
+#version files
+
+common/cpp/include/common/version.h
+common/go/src/asapo_common/version/version_lib.go
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 65114f8c5..b1159c604 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,6 +10,7 @@ ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "GNU")
     SET(BUILD_SHARED_LIBS OFF)
 ENDIF(WIN32)
 
+
 #TODO: Better way then GLOBAL PROPERTY
 IF(WIN32)
     find_package(Threads REQUIRED)
@@ -88,3 +89,4 @@ if(BUILD_DOCS)
     include(doxygen)
 endif()
 
+include(prepare_version)
\ No newline at end of file
diff --git a/CMakeModules/prepare_version.cmake b/CMakeModules/prepare_version.cmake
new file mode 100644
index 000000000..f0704fcad
--- /dev/null
+++ b/CMakeModules/prepare_version.cmake
@@ -0,0 +1,7 @@
+execute_process(COMMAND git describe --tags --dirty OUTPUT_VARIABLE VERSION)
+string(STRIP ${VERSION} VERSION)
+
+string(TIMESTAMP TIMESTAMP "%H:%M:%S %d.%m.%Y UTC" UTC)
+
+configure_file(${PROJECT_SOURCE_DIR}/common/cpp/include/common/version.h.in ${PROJECT_SOURCE_DIR}/common/cpp/include/common/version.h @ONLY)
+configure_file(${PROJECT_SOURCE_DIR}/common/go/src/asapo_common/version/version_lib.go.in ${PROJECT_SOURCE_DIR}/common/go/src/asapo_common/version/version_lib.go @ONLY)
diff --git a/common/cpp/CMakeLists.txt b/common/cpp/CMakeLists.txt
index 6f1350d10..05ba02232 100644
--- a/common/cpp/CMakeLists.txt
+++ b/common/cpp/CMakeLists.txt
@@ -16,7 +16,8 @@ if(BUILD_MONGODB_CLIENTLIB)
 endif()
 
 install(DIRECTORY ${ASAPO_CXX_COMMON_INCLUDE_DIR}/common
-        DESTINATION ${CMAKE_INSTALL_PREFIX}/include )
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/include
+        PATTERN "*.h.in" EXCLUDE)
 
 install(DIRECTORY ${ASAPO_CXX_COMMON_INCLUDE_DIR}/logger
         DESTINATION ${CMAKE_INSTALL_PREFIX}/include )
diff --git a/common/cpp/include/common/version.h.in b/common/cpp/include/common/version.h.in
new file mode 100644
index 000000000..15ecfac7b
--- /dev/null
+++ b/common/cpp/include/common/version.h.in
@@ -0,0 +1,17 @@
+#ifndef ASAPO_VERSION_H
+#define ASAPO_VERSION_H
+
+#include <iostream>
+
+namespace asapo {
+
+const char kVersion[] = "@VERSION@";
+
+inline void PrintVersion(std::string prefix) {
+ std::cout << prefix << ", version " << kVersion << std::endl;
+}
+
+}
+
+
+#endif //ASAPO_VERSION_H
diff --git a/common/go/src/asapo_common/version/version.go b/common/go/src/asapo_common/version/version.go
new file mode 100644
index 000000000..25a3835dc
--- /dev/null
+++ b/common/go/src/asapo_common/version/version.go
@@ -0,0 +1,23 @@
+package version
+
+import (
+	"flag"
+	"fmt"
+	"io"
+	"os"
+)
+
+var version
+
+func ShowVersion(w io.Writer, name string) bool {
+	flags := flag.NewFlagSet("version", flag.ExitOnError)
+	flag.Bool("version", false, "Print version information") // to have it in main help
+	flVersion := flags.Bool("version", false, "Print version information")
+	flags.Bool("help", false, "Print usage") // define help flag but ignore it
+	flags.Parse(os.Args[1:])
+	if *flVersion {
+		fmt.Fprintf(w, "%s version %s\n", name, version)
+		return true
+	}
+	return false
+}
diff --git a/common/go/src/asapo_common/version/version_lib.go.in b/common/go/src/asapo_common/version/version_lib.go.in
new file mode 100644
index 000000000..2dcfeaeee
--- /dev/null
+++ b/common/go/src/asapo_common/version/version_lib.go.in
@@ -0,0 +1,7 @@
+package version
+
+// Default build-time variable for library-import.
+// This file is overridden on build with build-time informations.
+func init(){
+	version   = "@VERSION@"
+}
diff --git a/examples/producer/dummy-data-producer/dummy_data_producer.cpp b/examples/producer/dummy-data-producer/dummy_data_producer.cpp
index aec527a91..c2936de2f 100644
--- a/examples/producer/dummy-data-producer/dummy_data_producer.cpp
+++ b/examples/producer/dummy-data-producer/dummy_data_producer.cpp
@@ -35,6 +35,7 @@ void PrintCommandArguments(const Args& args) {
 
 
 void ProcessCommandArguments(int argc, char* argv[], Args* args) {
+    asapo::PrintVersion("Dummy Data Producer");
     if (argc != 8) {
         std::cout <<
                   "Usage: " << argv[0] <<
diff --git a/examples/worker/getnext_broker/getnext_broker.cpp b/examples/worker/getnext_broker/getnext_broker.cpp
index 51484cf7f..0a08959dc 100644
--- a/examples/worker/getnext_broker/getnext_broker.cpp
+++ b/examples/worker/getnext_broker/getnext_broker.cpp
@@ -79,6 +79,7 @@ int ReadAllData(const Params& params, uint64_t* duration_ms) {
 }
 
 int main(int argc, char* argv[]) {
+    asapo::PrintVersion("GetNext Broker Example");
     if (argc != 6) {
         std::cout << "Usage: " + std::string{argv[0]} +" <server> <run_name> <nthreads> <token> <timeout ms>" << std::endl;
         exit(EXIT_FAILURE);
diff --git a/examples/worker/process_folder/process_folder.cpp b/examples/worker/process_folder/process_folder.cpp
index 2e8f7da92..5adb1bc1f 100644
--- a/examples/worker/process_folder/process_folder.cpp
+++ b/examples/worker/process_folder/process_folder.cpp
@@ -8,6 +8,7 @@
 
 #include "asapo_worker.h"
 
+
 using std::chrono::high_resolution_clock;
 using asapo::Error;
 
@@ -83,6 +84,8 @@ void PrintStatistics(const Statistics& statistics) {
 
 
 int main(int argc, char* argv[]) {
+    asapo::PrintVersion("Process Folder Broker Example");
+
     std::string folder = ProcessCommandArguments(argc, argv);
     auto broker = CreateBroker(folder);
 
diff --git a/producer/api/include/asapo_producer.h b/producer/api/include/asapo_producer.h
index 84309f32b..1d9ea25d7 100644
--- a/producer/api/include/asapo_producer.h
+++ b/producer/api/include/asapo_producer.h
@@ -2,6 +2,8 @@
 #define ASAPO_ASAPO_PRODUCER_H
 
 #include "common/io_error.h"
+#include "common/version.h"
+
 #include "producer/producer.h"
 
 
diff --git a/producer/event_monitor_producer/src/main_eventmon.cpp b/producer/event_monitor_producer/src/main_eventmon.cpp
index 18d23aa95..3e4d677f7 100644
--- a/producer/event_monitor_producer/src/main_eventmon.cpp
+++ b/producer/event_monitor_producer/src/main_eventmon.cpp
@@ -15,6 +15,7 @@
 #include "preprocessor/definitions.h"
 
 #include "io/io_factory.h"
+#include "common/version.h"
 
 using asapo::Producer;
 using asapo::EventMonConfigFactory;
@@ -73,6 +74,8 @@ void SignalHandler(int signal) {
 
 
 int main (int argc, char* argv[]) {
+    asapo::PrintVersion("ASAPO Event Monitor");
+
     auto err = ReadConfigFile(argc, argv);
     if (err) {
         std::cerr << "cannot read config file: " << err->Explain() << std::endl;
diff --git a/receiver/src/main.cpp b/receiver/src/main.cpp
index f40dc1e2f..c0e6af486 100644
--- a/receiver/src/main.cpp
+++ b/receiver/src/main.cpp
@@ -5,6 +5,7 @@
 #include "receiver_config.h"
 
 #include "receiver_logger.h"
+#include "common/version.h"
 
 asapo::Error ReadConfigFile(int argc, char* argv[]) {
     if (argc != 2) {
@@ -16,6 +17,7 @@ asapo::Error ReadConfigFile(int argc, char* argv[]) {
 }
 
 int main (int argc, char* argv[]) {
+    asapo::PrintVersion("ASAPO Receiver");
 
     auto err = ReadConfigFile(argc, argv);
     const auto& logger = asapo::GetDefaultReceiverLogger();
diff --git a/worker/api/cpp/include/asapo_worker.h b/worker/api/cpp/include/asapo_worker.h
index d07b021b3..f00cdaeaf 100644
--- a/worker/api/cpp/include/asapo_worker.h
+++ b/worker/api/cpp/include/asapo_worker.h
@@ -2,5 +2,6 @@
 #define ASAPO_ASAPO_WORKER_H
 
 #include "worker/data_broker.h"
+#include "common/version.h"
 
 #endif //ASAPO_ASAPO_WORKER_H
-- 
GitLab