mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
ExternalProject: Remote checkout needs to include the remote name
Commit 0aea435aa1
(ExternalProject: Provide choice of
git update strategies, 2020-02-12) added the git update
strategies, but the CHECKOUT strategy was not handling
remote refs correctly. The local ref would be checked out
instead and no warning or error would have been emitted.
The test that should have caught this was also malformed
and did not actually move the local master branch as intended.
This commit is contained in:
@@ -59,7 +59,7 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}"))
|
||||
message(FATAL_ERROR "Failed to fetch repository '@git_repository@'")
|
||||
endif()
|
||||
|
||||
if(is_remote_ref AND NOT "@git_update_strategy@" STREQUAL "CHECKOUT")
|
||||
if(is_remote_ref)
|
||||
# Check if stash is needed
|
||||
execute_process(
|
||||
COMMAND "@git_EXECUTABLE@" status --porcelain
|
||||
@@ -72,8 +72,8 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}"))
|
||||
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 not in clean state, stash changes in order to be able to perform a
|
||||
# rebase or checkout without losing those changes permanently
|
||||
if(need_stash)
|
||||
execute_process(
|
||||
COMMAND "@git_EXECUTABLE@" stash save @git_stash_save_options@
|
||||
@@ -85,6 +85,16 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}"))
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if("@git_update_strategy@" STREQUAL "CHECKOUT")
|
||||
execute_process(
|
||||
COMMAND "@git_EXECUTABLE@" checkout "${git_remote}/${git_tag}"
|
||||
WORKING_DIRECTORY "@work_dir@"
|
||||
RESULT_VARIABLE error_code
|
||||
)
|
||||
if(error_code)
|
||||
message(FATAL_ERROR "Failed to checkout tag: '${git_remote}/${git_tag}'")
|
||||
endif()
|
||||
else()
|
||||
# Pull changes from the remote branch
|
||||
execute_process(
|
||||
COMMAND "@git_EXECUTABLE@" rebase "${git_remote}/${git_tag}"
|
||||
@@ -137,7 +147,7 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}"))
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND "@git_EXECUTABLE@" checkout ${git_remote}/${git_tag}
|
||||
COMMAND "@git_EXECUTABLE@" checkout "${git_remote}/${git_tag}"
|
||||
WORKING_DIRECTORY "@work_dir@"
|
||||
RESULT_VARIABLE error_code
|
||||
)
|
||||
@@ -146,6 +156,7 @@ if(error_code OR is_remote_ref OR NOT ("${tag_sha}" STREQUAL "${head_sha}"))
|
||||
endif()
|
||||
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(need_stash)
|
||||
execute_process(
|
||||
|
@@ -199,8 +199,14 @@ if(do_git_tests)
|
||||
|
||||
foreach(strategy IN ITEMS CHECKOUT REBASE_CHECKOUT)
|
||||
# Move local master back, then apply a change that will cause a conflict
|
||||
# during rebase. We want to test the fallback to checkout.
|
||||
check_a_tag(master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1 REBASE)
|
||||
# during rebase
|
||||
execute_process(COMMAND ${GIT_EXECUTABLE} checkout master
|
||||
WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT
|
||||
RESULT_VARIABLE error_code
|
||||
)
|
||||
if(error_code)
|
||||
message(FATAL_ERROR "Could not reset local master back to tag1.")
|
||||
endif()
|
||||
execute_process(COMMAND ${GIT_EXECUTABLE} reset --hard tag1
|
||||
WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT
|
||||
RESULT_VARIABLE error_code
|
||||
@@ -208,6 +214,7 @@ if(do_git_tests)
|
||||
if(error_code)
|
||||
message(FATAL_ERROR "Could not reset local master back to tag1.")
|
||||
endif()
|
||||
|
||||
set(cmlFile ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT/CMakeLists.txt)
|
||||
file(READ ${cmlFile} contents)
|
||||
string(REPLACE "find TutorialConfig.h" "find TutorialConfig.h (conflict here)"
|
||||
@@ -222,7 +229,7 @@ if(do_git_tests)
|
||||
message(FATAL_ERROR "Could not commit conflicting change.")
|
||||
endif()
|
||||
# This should discard our commit but leave behind an annotated tag
|
||||
check_a_tag(master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1 ${strategy})
|
||||
check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1 ${strategy})
|
||||
endforeach()
|
||||
|
||||
endif()
|
||||
|
Reference in New Issue
Block a user