Merge topic 'ExternalProject_GitUpdate'
f2128d4c
ExternalProject: Improve handling of git remote branchesff2451dc
ExternalProject: Strip trailing space from git hash
This commit is contained in:
commit
05d3570cf5
|
@ -454,6 +454,7 @@ execute_process(
|
||||||
WORKING_DIRECTORY \"${work_dir}\"
|
WORKING_DIRECTORY \"${work_dir}\"
|
||||||
RESULT_VARIABLE error_code
|
RESULT_VARIABLE error_code
|
||||||
OUTPUT_VARIABLE head_sha
|
OUTPUT_VARIABLE head_sha
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
)
|
)
|
||||||
if(error_code)
|
if(error_code)
|
||||||
message(FATAL_ERROR \"Failed to get the hash for HEAD\")
|
message(FATAL_ERROR \"Failed to get the hash for HEAD\")
|
||||||
|
@ -472,6 +473,17 @@ else()
|
||||||
set(is_remote_ref 0)
|
set(is_remote_ref 0)
|
||||||
endif()
|
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 \"origin\")
|
||||||
|
set(git_tag \"${git_tag}\")
|
||||||
|
endif()
|
||||||
|
|
||||||
# This will fail if the tag does not exist (it probably has not been fetched
|
# This will fail if the tag does not exist (it probably has not been fetched
|
||||||
# yet).
|
# yet).
|
||||||
execute_process(
|
execute_process(
|
||||||
|
@ -479,6 +491,7 @@ execute_process(
|
||||||
WORKING_DIRECTORY \"${work_dir}\"
|
WORKING_DIRECTORY \"${work_dir}\"
|
||||||
RESULT_VARIABLE error_code
|
RESULT_VARIABLE error_code
|
||||||
OUTPUT_VARIABLE tag_sha
|
OUTPUT_VARIABLE tag_sha
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
)
|
)
|
||||||
|
|
||||||
# Is the hash checkout out that we want?
|
# Is the hash checkout out that we want?
|
||||||
|
@ -492,13 +505,94 @@ if(error_code OR is_remote_ref OR NOT (\"\${tag_sha}\" STREQUAL \"\${head_sha}\"
|
||||||
message(FATAL_ERROR \"Failed to fetch repository '${git_repository}'\")
|
message(FATAL_ERROR \"Failed to fetch repository '${git_repository}'\")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
execute_process(
|
if(is_remote_ref)
|
||||||
COMMAND \"${git_EXECUTABLE}\" checkout ${git_tag}
|
# Check if stash is needed
|
||||||
WORKING_DIRECTORY \"${work_dir}\"
|
execute_process(
|
||||||
RESULT_VARIABLE error_code
|
COMMAND \"${git_EXECUTABLE}\" status --porcelain
|
||||||
)
|
WORKING_DIRECTORY \"${work_dir}\"
|
||||||
if(error_code)
|
RESULT_VARIABLE error_code
|
||||||
message(FATAL_ERROR \"Failed to checkout tag: '${git_tag}'\")
|
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 --all --quiet
|
||||||
|
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()
|
endif()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
|
|
Loading…
Reference in New Issue