From 165f09d7e7e70ed044c2503027ca2694ccded82a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 7 Oct 2019 14:20:45 -0500 Subject: [PATCH] cmake/modules/GetGitRevisionDescription: update to work with git-worktree Found this here: https://phabricator.kde.org/D9172 Signed-off-by: Sage Weil --- cmake/modules/GetGitRevisionDescription.cmake | 14 ++++++---- .../GetGitRevisionDescription.cmake.in | 27 ++++++++++++------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/cmake/modules/GetGitRevisionDescription.cmake b/cmake/modules/GetGitRevisionDescription.cmake index 85eae1562fe..40a42015a7d 100644 --- a/cmake/modules/GetGitRevisionDescription.cmake +++ b/cmake/modules/GetGitRevisionDescription.cmake @@ -53,12 +53,16 @@ function(get_git_head_revision _refspecvar _hashvar) endif() set(GIT_DIR "${GIT_PARENT_DIR}/.git") endwhile() - # check if this is a submodule + # check if this is a submodule or git-worktree if(NOT IS_DIRECTORY ${GIT_DIR}) - file(READ ${GIT_DIR} submodule) - string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) - get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) - get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + file(READ ${GIT_DIR} gitdirfile) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_PATH ${gitdirfile}) + if(IS_ABSOLUTE ${GIT_DIR_PATH}) + get_filename_component(GIT_DIR ${GIT_DIR_PATH} ABSOLUTE) + else() + get_filename_component(LINKED_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${LINKED_DIR}/${GIT_DIR_PATH} ABSOLUTE) + endif() endif() set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") if(NOT EXISTS "${GIT_DATA}") diff --git a/cmake/modules/GetGitRevisionDescription.cmake.in b/cmake/modules/GetGitRevisionDescription.cmake.in index 6d8b708efe5..41cf7ed5fa9 100644 --- a/cmake/modules/GetGitRevisionDescription.cmake.in +++ b/cmake/modules/GetGitRevisionDescription.cmake.in @@ -18,21 +18,30 @@ set(HEAD_HASH) file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +set(GIT_DIR "@GIT_DIR@") +# handle git-worktree +if(EXISTS "${GIT_DIR}/commondir") + file(READ "${GIT_DIR}/commondir" GIT_DIR_NEW LIMIT 1024) + string(STRIP "${GIT_DIR_NEW}" GIT_DIR_NEW) + if(NOT IS_ABSOLUTE "${GIT_DIR_NEW}") + get_filename_component(GIT_DIR_NEW ${GIT_DIR}/${GIT_DIR_NEW} ABSOLUTE) + endif() + if(EXISTS "${GIT_DIR_NEW}") + set(GIT_DIR "${GIT_DIR_NEW}") + endif() +endif() if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") - if(EXISTS "@GIT_DIR@/${HEAD_REF}") - configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) - else() - configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) - file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) - if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") - set(HEAD_HASH "${CMAKE_MATCH_1}") - endif() + if(EXISTS "${GIT_DIR}/${HEAD_REF}") + configure_file("${GIT_DIR}/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + elseif(EXISTS "${GIT_DIR}/logs/${HEAD_REF}") + configure_file("${GIT_DIR}/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + set(HEAD_HASH "${HEAD_REF}") endif() else() # detached HEAD - configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) + configure_file("${GIT_DIR}/HEAD" "@GIT_DATA@/head-ref" COPYONLY) endif() if(NOT HEAD_HASH) -- 2.39.5