From fe17f276dd52838cc6a283dc2b06f57c1fd5076f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 27 Mar 2018 01:35:53 +0200
Subject: [PATCH] Seems finally to have fixed git info

---
 cmake/GetPastisGitRevision.cmake | 47 ++++++++++++++++++++++++++++----
 utils/RevisionInfo.cpp           | 26 ++++++++++++++++++
 utils/RevisionInfo.hpp           |  2 ++
 utils/pastis_git_revision.hpp.in |  2 ++
 4 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/cmake/GetPastisGitRevision.cmake b/cmake/GetPastisGitRevision.cmake
index 6fe87b3eb..39396dca1 100644
--- a/cmake/GetPastisGitRevision.cmake
+++ b/cmake/GetPastisGitRevision.cmake
@@ -3,14 +3,49 @@
 list(APPEND CMAKE_MODULE_PATH "${PASTIS_SOURCE_DIR}/cmake/cmake-modules")
 include(GetGitRevisionDescription)
 
-git_describe(PASTIS_GIT_TAG "--abbrev=0")
-get_git_head_revision(PASTIS_GIT_HEAD PASTIS_GIT_HASH)
-git_local_changes(PASTIS_GIT_HAS_LOCAL_CHANGES)
+set(HAS_PASTIS_GIT_INFO "TRUE")
 
-if(${PASTIS_GIT_HAS_LOCAL_CHANGES} STREQUAL "CLEAN")
-  set(PASTIS_GIT_IS_CLEAN true)
+find_package(Git QUIET)
+
+if(GIT_FOUND)
+  execute_process(
+    COMMAND "${GIT_EXECUTABLE}" describe "--abbrev=0"
+    WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+    OUTPUT_VARIABLE PASTIS_GIT_TAG
+    RESULT_VARIABLE FOUND_PASTIS_GIT_INFO
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+  if(FOUND_PASTIS_GIT_INFO EQUAL 0)
+    execute_process(
+      COMMAND "${GIT_EXECUTABLE}" reflog -1 "--format=%H"
+      WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+      OUTPUT_VARIABLE PASTIS_GIT_HASH
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    execute_process(
+      COMMAND "${GIT_EXECUTABLE}" symbolic-ref HEAD
+      WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+      OUTPUT_VARIABLE PASTIS_GIT_HEAD
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    execute_process(
+      COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD
+      WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+      RESULT_VARIABLE STATE
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    if(STATE EQUAL 0)
+      set(PASTIS_GIT_HAS_LOCAL_CHANGES "CLEAN")
+      set(PASTIS_GIT_IS_CLEAN true)
+    else()
+      set(PASTIS_GIT_IS_CLEAN false)
+      set(PASTIS_GIT_HAS_LOCAL_CHANGES "DIRTY")
+    endif()
+  else()
+    unset(HAS_PASTIS_GIT_INFO)
+  endif()
 else()
-  set(PASTIS_GIT_IS_CLEAN false)
+  unset(HAS_PASTIS_GIT_INFO)
 endif()
 
 string(FIND "${PASTIS_GIT_TAG}" "${CMAKE_PASTIS_VERSION}" FOUND_VERSION_SUBSTR)
diff --git a/utils/RevisionInfo.cpp b/utils/RevisionInfo.cpp
index fd1bbc59f..f508dec33 100644
--- a/utils/RevisionInfo.cpp
+++ b/utils/RevisionInfo.cpp
@@ -7,22 +7,48 @@ std::string RevisionInfo::version()
   return PASTIS_VERSION;
 }
 
+bool RevisionInfo::hasGitInfo()
+{
+#ifdef HAS_PASTIS_GIT_INFO
+  return true;
+#else
+  return false;
+#endif
+}
+
 std::string RevisionInfo::gitTag()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_TAG;
+#else
+  return "unknown tag";
+#endif
 }
 
 std::string RevisionInfo::gitHead()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_HEAD;
+#else
+  return "unknown head";
+#endif
 }
 
 std::string RevisionInfo::gitHash()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_HASH;
+#else
+  return "unknown hash";
+#endif
 }
 
 bool RevisionInfo::gitIsClean()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_IS_CLEAN;
+#else
+  return false;
+#endif
 }
+
diff --git a/utils/RevisionInfo.hpp b/utils/RevisionInfo.hpp
index b0d547bd6..bff12f201 100644
--- a/utils/RevisionInfo.hpp
+++ b/utils/RevisionInfo.hpp
@@ -6,6 +6,8 @@
 struct RevisionInfo
 {
   static std::string version();
+
+  static bool hasGitInfo();
   static std::string gitTag();
   static std::string gitHead();
   static std::string gitHash();
diff --git a/utils/pastis_git_revision.hpp.in b/utils/pastis_git_revision.hpp.in
index fe0b3e6df..89f7c62f0 100644
--- a/utils/pastis_git_revision.hpp.in
+++ b/utils/pastis_git_revision.hpp.in
@@ -1,6 +1,8 @@
 #ifndef PASTIS_GIT_REVISION_HPP
 #define PASTIS_GIT_REVISION_HPP
 
+#cmakedefine HAS_PASTIS_GIT_INFO
+
 #define PASTIS_GIT_TAG  "@PASTIS_GIT_TAG@"
 #define PASTIS_GIT_HEAD "@PASTIS_GIT_HEAD@"
 #define PASTIS_GIT_HASH "@PASTIS_GIT_HASH@"
-- 
GitLab