diff options
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/ExternalProject-gitupdate.cmake.in | 165 | ||||
-rw-r--r-- | Modules/ExternalProject.cmake | 168 |
2 files changed, 170 insertions, 163 deletions
diff --git a/Modules/ExternalProject-gitupdate.cmake.in b/Modules/ExternalProject-gitupdate.cmake.in new file mode 100644 index 0000000..b7d484b --- /dev/null +++ b/Modules/ExternalProject-gitupdate.cmake.in @@ -0,0 +1,165 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +cmake_minimum_required(VERSION 3.5) + +execute_process( + COMMAND "@git_EXECUTABLE@" rev-list --max-count=1 HEAD + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + OUTPUT_VARIABLE head_sha + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +if(error_code) + message(FATAL_ERROR "Failed to get the hash for HEAD") +endif() + +execute_process( + COMMAND "@git_EXECUTABLE@" show-ref "@git_tag@" + WORKING_DIRECTORY "@work_dir@" + OUTPUT_VARIABLE show_ref_output + ) +# If a remote ref is asked for, which can possibly move around, +# we must always do a fetch and checkout. +if("${show_ref_output}" MATCHES "remotes") + set(is_remote_ref 1) +else() + set(is_remote_ref 0) +endif() + +# Tag is in the form <remote>/<tag> (i.e. origin/master) we must strip +# the remote from the tag. +if("${show_ref_output}" MATCHES "refs/remotes/@git_tag@") + string(REGEX MATCH "^([^/]+)/(.+)$" _unused "@git_tag@") + set(git_remote "${CMAKE_MATCH_1}") + set(git_tag "${CMAKE_MATCH_2}") +else() + set(git_remote "@git_remote_name@") + set(git_tag "@git_tag@") +endif() + +# This will fail if the tag does not exist (it probably has not been fetched +# yet). +execute_process( + COMMAND "@git_EXECUTABLE@" rev-list --max-count=1 "${git_tag}" + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + OUTPUT_VARIABLE tag_sha + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + +# Is the hash checkout out that we want? +if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}")) + execute_process( + COMMAND "@git_EXECUTABLE@" fetch + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + message(FATAL_ERROR "Failed to fetch repository '@git_repository@'") + endif() + + if(is_remote_ref) + # Check if stash is needed + execute_process( + COMMAND "@git_EXECUTABLE@" status --porcelain + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + OUTPUT_VARIABLE repo_status + ) + if(error_code) + message(FATAL_ERROR "Failed to get the status") + endif() + string(LENGTH "${repo_status}" need_stash) + + # If not in clean state, stash changes in order to be able to be able to + # perform git pull --rebase + if(need_stash) + execute_process( + COMMAND "@git_EXECUTABLE@" stash save @git_stash_save_options@ + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + message(FATAL_ERROR "Failed to stash changes") + endif() + endif() + + # Pull changes from the remote branch + execute_process( + COMMAND "@git_EXECUTABLE@" rebase "${git_remote}/${git_tag}" + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + # Rebase failed: Restore previous state. + execute_process( + COMMAND "@git_EXECUTABLE@" rebase --abort + WORKING_DIRECTORY "@work_dir@" + ) + if(need_stash) + execute_process( + COMMAND "@git_EXECUTABLE@" stash pop --index --quiet + WORKING_DIRECTORY "@work_dir@" + ) + endif() + message(FATAL_ERROR "\nFailed to rebase in: '@work_dir@'." + "\nYou will have to resolve the conflicts manually") + endif() + + if(need_stash) + execute_process( + COMMAND "@git_EXECUTABLE@" stash pop --index --quiet + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + # Stash pop --index failed: Try again dropping the index + execute_process( + COMMAND "@git_EXECUTABLE@" reset --hard --quiet + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + execute_process( + COMMAND "@git_EXECUTABLE@" stash pop --quiet + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + # Stash pop failed: Restore previous state. + execute_process( + COMMAND "@git_EXECUTABLE@" reset --hard --quiet ${head_sha} + WORKING_DIRECTORY "@work_dir@" + ) + execute_process( + COMMAND "@git_EXECUTABLE@" stash pop --index --quiet + WORKING_DIRECTORY "@work_dir@" + ) + message(FATAL_ERROR "\nFailed to unstash changes in: '@work_dir@'." + "\nYou will have to resolve the conflicts manually") + endif() + endif() + endif() + else() + execute_process( + COMMAND "@git_EXECUTABLE@" checkout "${git_tag}" + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + if(error_code) + message(FATAL_ERROR "Failed to checkout tag: '${git_tag}'") + endif() + endif() + + set(init_submodules "@init_submodules@") + if(init_submodules) + execute_process( + COMMAND "@git_EXECUTABLE@" submodule update @git_submodules_recurse@ --init @git_submodules@ + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ) + endif() + if(error_code) + message(FATAL_ERROR "Failed to update submodules in: '@work_dir@'") + endif() +endif() diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index f9f7a4f..9074b18 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -1251,171 +1251,13 @@ function(_ep_write_gitupdate_script script_filename git_EXECUTABLE git_tag git_r else() set(git_stash_save_options --quiet) endif() - file(WRITE ${script_filename} -" -execute_process( - COMMAND \"${git_EXECUTABLE}\" rev-list --max-count=1 HEAD - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - OUTPUT_VARIABLE head_sha - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -if(error_code) - message(FATAL_ERROR \"Failed to get the hash for HEAD\") -endif() -execute_process( - COMMAND \"${git_EXECUTABLE}\" show-ref ${git_tag} - WORKING_DIRECTORY \"${work_dir}\" - OUTPUT_VARIABLE show_ref_output - ) -# If a remote ref is asked for, which can possibly move around, -# we must always do a fetch and checkout. -if(\"\${show_ref_output}\" MATCHES \"remotes\") - set(is_remote_ref 1) -else() - set(is_remote_ref 0) -endif() - -# Tag is in the form <remote>/<tag> (i.e. origin/master) we must strip -# the remote from the tag. -if(\"\${show_ref_output}\" MATCHES \"refs/remotes/${git_tag}\") - string(REGEX MATCH \"^([^/]+)/(.+)$\" _unused \"${git_tag}\") - set(git_remote \"\${CMAKE_MATCH_1}\") - set(git_tag \"\${CMAKE_MATCH_2}\") -else() - set(git_remote \"${git_remote_name}\") - set(git_tag \"${git_tag}\") -endif() - -# This will fail if the tag does not exist (it probably has not been fetched -# yet). -execute_process( - COMMAND \"${git_EXECUTABLE}\" rev-list --max-count=1 ${git_tag} - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - OUTPUT_VARIABLE tag_sha - OUTPUT_STRIP_TRAILING_WHITESPACE + configure_file( + "${_ExternalProject_SELF_DIR}/ExternalProject-gitupdate.cmake.in" + "${script_filename}" + @ONLY ) - -# Is the hash checkout out that we want? -if(error_code OR is_remote_ref OR NOT (\"\${tag_sha}\" STREQUAL \"\${head_sha}\")) - execute_process( - COMMAND \"${git_EXECUTABLE}\" fetch - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - ) - if(error_code) - message(FATAL_ERROR \"Failed to fetch repository '${git_repository}'\") - endif() - - if(is_remote_ref) - # Check if stash is needed - execute_process( - COMMAND \"${git_EXECUTABLE}\" status --porcelain - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - OUTPUT_VARIABLE repo_status - ) - if(error_code) - message(FATAL_ERROR \"Failed to get the status\") - endif() - string(LENGTH \"\${repo_status}\" need_stash) - - # If not in clean state, stash changes in order to be able to be able to - # perform git pull --rebase - if(need_stash) - execute_process( - COMMAND \"${git_EXECUTABLE}\" stash save ${git_stash_save_options} - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - ) - if(error_code) - message(FATAL_ERROR \"Failed to stash changes\") - endif() - endif() - - # Pull changes from the remote branch - execute_process( - COMMAND \"${git_EXECUTABLE}\" rebase \${git_remote}/\${git_tag} - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - ) - if(error_code) - # Rebase failed: Restore previous state. - execute_process( - COMMAND \"${git_EXECUTABLE}\" rebase --abort - WORKING_DIRECTORY \"${work_dir}\" - ) - if(need_stash) - execute_process( - COMMAND \"${git_EXECUTABLE}\" stash pop --index --quiet - WORKING_DIRECTORY \"${work_dir}\" - ) - endif() - message(FATAL_ERROR \"\\nFailed to rebase in: '${work_dir}/${src_name}'.\\nYou will have to resolve the conflicts manually\") - endif() - - if(need_stash) - execute_process( - COMMAND \"${git_EXECUTABLE}\" stash pop --index --quiet - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - ) - if(error_code) - # Stash pop --index failed: Try again dropping the index - execute_process( - COMMAND \"${git_EXECUTABLE}\" reset --hard --quiet - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - ) - execute_process( - COMMAND \"${git_EXECUTABLE}\" stash pop --quiet - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - ) - if(error_code) - # Stash pop failed: Restore previous state. - execute_process( - COMMAND \"${git_EXECUTABLE}\" reset --hard --quiet \${head_sha} - WORKING_DIRECTORY \"${work_dir}\" - ) - execute_process( - COMMAND \"${git_EXECUTABLE}\" stash pop --index --quiet - WORKING_DIRECTORY \"${work_dir}\" - ) - message(FATAL_ERROR \"\\nFailed to unstash changes in: '${work_dir}/${src_name}'.\\nYou will have to resolve the conflicts manually\") - endif() - endif() - endif() - else() - execute_process( - COMMAND \"${git_EXECUTABLE}\" checkout ${git_tag} - WORKING_DIRECTORY \"${work_dir}\" - RESULT_VARIABLE error_code - ) - if(error_code) - message(FATAL_ERROR \"Failed to checkout tag: '${git_tag}'\") - endif() - endif() - - set(init_submodules ${init_submodules}) - if(init_submodules) - execute_process( - COMMAND \"${git_EXECUTABLE}\" submodule update ${git_submodules_recurse} --init ${git_submodules} - WORKING_DIRECTORY \"${work_dir}/${src_name}\" - RESULT_VARIABLE error_code - ) - endif() - if(error_code) - message(FATAL_ERROR \"Failed to update submodules in: '${work_dir}/${src_name}'\") - endif() -endif() - -" -) - -endfunction(_ep_write_gitupdate_script) +endfunction() function(_ep_write_downloadfile_script script_filename REMOTE LOCAL timeout no_progress hash tls_verify tls_cainfo userpwd http_headers netrc netrc_file) if(timeout) |