|
|
@@ -3,6 +3,10 @@
|
|
|
|
|
|
cmake_minimum_required(VERSION 3.5)
|
|
|
|
|
|
+set(quiet "@quiet@")
|
|
|
+set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject")
|
|
|
+include(${script_dir}/captured_process_setup.cmake)
|
|
|
+
|
|
|
function(get_hash_for_ref ref out_var err_var)
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" rev-parse "${ref}"
|
|
|
@@ -49,7 +53,7 @@ elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/tags/")
|
|
|
# FIXME: We should provide an option to always fetch for this case
|
|
|
get_hash_for_ref("@git_tag@" tag_sha error_msg)
|
|
|
if(tag_sha STREQUAL head_sha)
|
|
|
- message(VERBOSE "Already at requested tag: ${tag_sha}")
|
|
|
+ _ep_message_quiet_capture(VERBOSE "Already at requested tag: ${tag_sha}")
|
|
|
return()
|
|
|
endif()
|
|
|
|
|
|
@@ -65,7 +69,7 @@ else()
|
|
|
get_hash_for_ref("@git_tag@" tag_sha error_msg)
|
|
|
if(tag_sha STREQUAL head_sha)
|
|
|
# Have the right commit checked out already
|
|
|
- message(VERBOSE "Already at requested ref: ${tag_sha}")
|
|
|
+ _ep_message_quiet_capture(VERBOSE "Already at requested ref: ${tag_sha}")
|
|
|
return()
|
|
|
|
|
|
elseif(tag_sha STREQUAL "")
|
|
|
@@ -76,7 +80,7 @@ else()
|
|
|
set(fetch_required YES)
|
|
|
set(checkout_name "@git_tag@")
|
|
|
if(NOT error_msg STREQUAL "")
|
|
|
- message(VERBOSE "${error_msg}")
|
|
|
+ _ep_message_quiet_capture(VERBOSE "${error_msg}")
|
|
|
endif()
|
|
|
|
|
|
else()
|
|
|
@@ -86,18 +90,22 @@ else()
|
|
|
set(fetch_required NO)
|
|
|
set(checkout_name "@git_tag@")
|
|
|
if(NOT error_msg STREQUAL "")
|
|
|
- message(WARNING "${error_msg}")
|
|
|
+ _ep_message_quiet_capture(WARNING "${error_msg}")
|
|
|
endif()
|
|
|
|
|
|
endif()
|
|
|
endif()
|
|
|
|
|
|
if(fetch_required)
|
|
|
- message(VERBOSE "Fetching latest from the remote @git_remote_name@")
|
|
|
+ _ep_message_quiet_capture(VERBOSE "Fetching latest from the remote @git_remote_name@")
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" fetch --tags --force "@git_remote_name@"
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
- COMMAND_ERROR_IS_FATAL ANY
|
|
|
+ RESULT_VARIABLE error_code
|
|
|
+ ${capture_output}
|
|
|
+ )
|
|
|
+ _ep_command_check_result(
|
|
|
+ error_code "Failed to fetch from the remote @git_remote_name@'"
|
|
|
)
|
|
|
endif()
|
|
|
|
|
|
@@ -128,12 +136,15 @@ if(git_update_strategy MATCHES "^REBASE(_CHECKOUT)?$")
|
|
|
|
|
|
else()
|
|
|
execute_process(
|
|
|
- COMMAND "@git_EXECUTABLE@" for-each-ref "--format='%(upstream:short)'" "${current_branch}"
|
|
|
+ COMMAND "@git_EXECUTABLE@" for-each-ref
|
|
|
+ "--format='%(upstream:short)'" "${current_branch}"
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
+ RESULT_VARIABLE error_code # There is no error if no upstream is set
|
|
|
OUTPUT_VARIABLE upstream_branch
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
- COMMAND_ERROR_IS_FATAL ANY # There is no error if no upstream is set
|
|
|
+ ${capture_error_only}
|
|
|
)
|
|
|
+ _ep_command_check_result(error_code)
|
|
|
if(NOT upstream_branch STREQUAL checkout_name)
|
|
|
# Not safe to rebase when asked to checkout a different branch to the one
|
|
|
# we are tracking. If we did rebase, we could end up with arbitrary
|
|
|
@@ -145,7 +156,9 @@ if(git_update_strategy MATCHES "^REBASE(_CHECKOUT)?$")
|
|
|
|
|
|
endif()
|
|
|
elseif(NOT git_update_strategy STREQUAL "CHECKOUT")
|
|
|
- message(FATAL_ERROR "Unsupported git update strategy: ${git_update_strategy}")
|
|
|
+ _ep_message_quiet_capture(FATAL_ERROR
|
|
|
+ "Unsupported git update strategy: ${git_update_strategy}"
|
|
|
+ )
|
|
|
endif()
|
|
|
|
|
|
|
|
|
@@ -155,10 +168,9 @@ execute_process(
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
RESULT_VARIABLE error_code
|
|
|
OUTPUT_VARIABLE repo_status
|
|
|
+ ${capture_error_only}
|
|
|
)
|
|
|
-if(error_code)
|
|
|
- message(FATAL_ERROR "Failed to get the status")
|
|
|
-endif()
|
|
|
+_ep_command_check_result(error_code "Failed to get the status")
|
|
|
string(LENGTH "${repo_status}" need_stash)
|
|
|
|
|
|
# If not in clean state, stash changes in order to be able to perform a
|
|
|
@@ -167,16 +179,20 @@ if(need_stash)
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" stash save @git_stash_save_options@
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
- COMMAND_ERROR_IS_FATAL ANY
|
|
|
+ RESULT_VARIABLE error_code
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_command_check_result(error_code)
|
|
|
endif()
|
|
|
|
|
|
if(git_update_strategy STREQUAL "CHECKOUT")
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" checkout "${checkout_name}"
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
- COMMAND_ERROR_IS_FATAL ANY
|
|
|
+ RESULT_VARIABLE error_code
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_command_check_result(error_code)
|
|
|
else()
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" rebase "${checkout_name}"
|
|
|
@@ -198,12 +214,14 @@ else()
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" stash pop --index --quiet
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
- )
|
|
|
+ )
|
|
|
endif()
|
|
|
- message(FATAL_ERROR "\nFailed to rebase in: '@work_dir@'."
|
|
|
- "\nOutput from the attempted rebase follows:"
|
|
|
- "\n${rebase_output}"
|
|
|
- "\n\nYou will have to resolve the conflicts manually")
|
|
|
+ _ep_message_quiet_capture(FATAL_ERROR
|
|
|
+ "\nFailed to rebase in: '@work_dir@'."
|
|
|
+ "\nOutput from the attempted rebase follows:"
|
|
|
+ "\n${rebase_output}"
|
|
|
+ "\n\nYou will have to resolve the conflicts manually"
|
|
|
+ )
|
|
|
endif()
|
|
|
|
|
|
# Fall back to checkout. We create an annotated tag so that the user
|
|
|
@@ -215,21 +233,27 @@ else()
|
|
|
set(tag_name _cmake_ExternalProject_moved_from_here_${tag_timestamp}Z)
|
|
|
set(error_log_file ${CMAKE_CURRENT_LIST_DIR}/rebase_error_${tag_timestamp}Z.log)
|
|
|
file(WRITE ${error_log_file} "${rebase_output}")
|
|
|
- message(WARNING "Rebase failed, output has been saved to ${error_log_file}"
|
|
|
- "\nFalling back to checkout, previous commit tagged as ${tag_name}")
|
|
|
+ _ep_message_quiet_capture(WARNING
|
|
|
+ "Rebase failed, output has been saved to ${error_log_file}"
|
|
|
+ "\nFalling back to checkout, previous commit tagged as ${tag_name}"
|
|
|
+ )
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" tag -a
|
|
|
-m "ExternalProject attempting to move from here to ${checkout_name}"
|
|
|
${tag_name}
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
- COMMAND_ERROR_IS_FATAL ANY
|
|
|
+ RESULT_VARIABLE error_code
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_command_check_result(error_code)
|
|
|
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" checkout "${checkout_name}"
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
- COMMAND_ERROR_IS_FATAL ANY
|
|
|
+ RESULT_VARIABLE error_code
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_command_check_result(error_code)
|
|
|
endif()
|
|
|
endif()
|
|
|
|
|
|
@@ -239,30 +263,42 @@ if(need_stash)
|
|
|
COMMAND "@git_EXECUTABLE@" stash pop --index --quiet
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
RESULT_VARIABLE error_code
|
|
|
- )
|
|
|
+ ${capture_output}
|
|
|
+ )
|
|
|
+ _ep_accumulate_captured_output()
|
|
|
if(error_code)
|
|
|
# Stash pop --index failed: Try again dropping the index
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" reset --hard --quiet
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_accumulate_captured_output()
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" stash pop --quiet
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
RESULT_VARIABLE error_code
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_accumulate_captured_output()
|
|
|
if(error_code)
|
|
|
# Stash pop failed: Restore previous state.
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" reset --hard --quiet ${head_sha}
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_accumulate_captured_output()
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" stash pop --index --quiet
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
+ ${capture_output}
|
|
|
+ )
|
|
|
+ _ep_accumulate_captured_output()
|
|
|
+ _ep_message_quiet_capture(FATAL_ERROR
|
|
|
+ "Failed to unstash changes in: '@work_dir@'.\n"
|
|
|
+ "You will have to resolve the conflicts manually"
|
|
|
)
|
|
|
- message(FATAL_ERROR "\nFailed to unstash changes in: '@work_dir@'."
|
|
|
- "\nYou will have to resolve the conflicts manually")
|
|
|
endif()
|
|
|
endif()
|
|
|
endif()
|
|
|
@@ -272,6 +308,8 @@ if(init_submodules)
|
|
|
execute_process(
|
|
|
COMMAND "@git_EXECUTABLE@" submodule update @git_submodules_recurse@ --init @git_submodules@
|
|
|
WORKING_DIRECTORY "@work_dir@"
|
|
|
- COMMAND_ERROR_IS_FATAL ANY
|
|
|
+ RESULT_VARIABLE error_code
|
|
|
+ ${capture_output}
|
|
|
)
|
|
|
+ _ep_command_check_result(error_code)
|
|
|
endif()
|