diff --git a/cmake/GetPastisGitRevision.cmake b/cmake/GetPastisGitRevision.cmake index 6fe87b3eb00692f97df344246eb2addae2886c87..39396dca1f1d30b99b2acc43826b75d0649d2c38 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 fd1bbc59f16e1bb78ddcaaa66cd8a1f73fad47d9..f508dec33c4894c682dc65a67059063a67b14620 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 b0d547bd6ace63bc0690e336ee0fb150de959660..bff12f2011eba0e15e49af89841c5ddd08b55c8f 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 fe0b3e6df860b7d8c28a0d52957f9fbc815c36df..89f7c62f0ec0212fa22ac25bd0b7747d5ba36492 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@"