mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-17 07:11:52 +08:00

Git config options can be passed to git clone before or after the "clone" keyword. If specified before, the config setting is only applied to that command invocation. It acts to override the value in the global or project defaults (the latter doesn't exist for clone). When the config setting is passed after the "clone" keyword, it is saved into the cloned repository's config and will persist for later git operations. The existing implementation expected the latter behavior, but put the config setting before the "clone" keyword and therefore the setting was not persisting to the git update step. Move it to after the "clone" keyword so that it will persist. The submodule handling is different. There is no support for doing a "git submodule update" with a "sticky" config setting. Instead, you have to pass the setting with all such calls. The existing implementation was doing this for the clone step, but not the git update step. Add the config setting there as well so that submodules also effectively have the sslVerify setting persist to the update step too. Fixes: #18948
74 lines
2.2 KiB
CMake
74 lines
2.2 KiB
CMake
# 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)
|
|
|
|
if(EXISTS "@gitclone_stampfile@" AND EXISTS "@gitclone_infofile@" AND
|
|
"@gitclone_stampfile@" IS_NEWER_THAN "@gitclone_infofile@")
|
|
message(STATUS
|
|
"Avoiding repeated git clone, stamp file is up to date: "
|
|
"'@gitclone_stampfile@'"
|
|
)
|
|
return()
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} -E rm -rf "@source_dir@"
|
|
RESULT_VARIABLE error_code
|
|
)
|
|
if(error_code)
|
|
message(FATAL_ERROR "Failed to remove directory: '@source_dir@'")
|
|
endif()
|
|
|
|
# try the clone 3 times in case there is an odd git clone issue
|
|
set(error_code 1)
|
|
set(number_of_tries 0)
|
|
while(error_code AND number_of_tries LESS 3)
|
|
execute_process(
|
|
COMMAND "@git_EXECUTABLE@"
|
|
clone @git_clone_options@ "@git_repository@" "@src_name@"
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
RESULT_VARIABLE error_code
|
|
)
|
|
math(EXPR number_of_tries "${number_of_tries} + 1")
|
|
endwhile()
|
|
if(number_of_tries GREATER 1)
|
|
message(STATUS "Had to git clone more than once: ${number_of_tries} times.")
|
|
endif()
|
|
if(error_code)
|
|
message(FATAL_ERROR "Failed to clone repository: '@git_repository@'")
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND "@git_EXECUTABLE@"
|
|
checkout "@git_tag@" @git_checkout_explicit--@
|
|
WORKING_DIRECTORY "@work_dir@/@src_name@"
|
|
RESULT_VARIABLE error_code
|
|
)
|
|
if(error_code)
|
|
message(FATAL_ERROR "Failed to checkout tag: '@git_tag@'")
|
|
endif()
|
|
|
|
set(init_submodules @init_submodules@)
|
|
if(init_submodules)
|
|
execute_process(
|
|
COMMAND "@git_EXECUTABLE@" @git_submodules_config_options@
|
|
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()
|
|
|
|
# Complete success, update the script-last-run stamp file:
|
|
#
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} -E copy "@gitclone_infofile@" "@gitclone_stampfile@"
|
|
RESULT_VARIABLE error_code
|
|
)
|
|
if(error_code)
|
|
message(FATAL_ERROR "Failed to copy script-last-run stamp file: '@gitclone_stampfile@'")
|
|
endif()
|