| # Set the ExternalProject GIT_TAG to desired_tag, and make sure the |
| # resulting checked out version is resulting_sha and rebuild. |
| # This check's the correct behavior of the ExternalProject UPDATE_COMMAND. |
| # Also verify that a fetch only occurs when fetch_expected is 1. |
| macro(check_a_tag desired_tag resulting_sha fetch_expected) |
| message( STATUS "Checking ExternalProjectUpdate to tag: ${desired_tag}" ) |
| |
| # Remove the FETCH_HEAD file, so we can check if it gets replaced with a 'git |
| # fetch'. |
| set( FETCH_HEAD_file ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT/.git/FETCH_HEAD ) |
| file( REMOVE ${FETCH_HEAD_file} ) |
| |
| # Configure |
| execute_process(COMMAND ${CMAKE_COMMAND} |
| -G ${CMAKE_GENERATOR} -T "${CMAKE_GENERATOR_TOOLSET}" |
| -A "${CMAKE_GENERATOR_PLATFORM}" |
| -DTEST_GIT_TAG:STRING=${desired_tag} |
| ${ExternalProjectUpdate_SOURCE_DIR} |
| WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR} |
| RESULT_VARIABLE error_code |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not configure the project.") |
| endif() |
| |
| # Build |
| execute_process(COMMAND ${CMAKE_COMMAND} |
| --build ${ExternalProjectUpdate_BINARY_DIR} |
| RESULT_VARIABLE error_code |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not build the project.") |
| endif() |
| |
| # Check the resulting SHA |
| execute_process(COMMAND ${GIT_EXECUTABLE} |
| rev-list --max-count=1 HEAD |
| WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep1-GIT |
| RESULT_VARIABLE error_code |
| OUTPUT_VARIABLE tag_sha |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not check the sha.") |
| endif() |
| |
| if(NOT (${tag_sha} STREQUAL ${resulting_sha})) |
| message(FATAL_ERROR "UPDATE_COMMAND produced |
| ${tag_sha} |
| when |
| ${resulting_sha} |
| was expected." |
| ) |
| endif() |
| |
| if( NOT EXISTS ${FETCH_HEAD_file} AND ${fetch_expected}) |
| message( FATAL_ERROR "Fetch did NOT occur when it was expected.") |
| endif() |
| if( EXISTS ${FETCH_HEAD_file} AND NOT ${fetch_expected}) |
| message( FATAL_ERROR "Fetch DID occur when it was not expected.") |
| endif() |
| |
| message( STATUS "Checking ExternalProjectUpdate to tag: ${desired_tag} (disconnected)" ) |
| |
| # Remove the FETCH_HEAD file, so we can check if it gets replaced with a 'git |
| # fetch'. |
| set( FETCH_HEAD_file ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep2-GIT/.git/FETCH_HEAD ) |
| file( REMOVE ${FETCH_HEAD_file} ) |
| |
| # Check initial SHA |
| execute_process(COMMAND ${GIT_EXECUTABLE} |
| rev-list --max-count=1 HEAD |
| WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep2-GIT |
| RESULT_VARIABLE error_code |
| OUTPUT_VARIABLE initial_sha |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| |
| # Configure |
| execute_process(COMMAND ${CMAKE_COMMAND} |
| -G ${CMAKE_GENERATOR} -T "${CMAKE_GENERATOR_TOOLSET}" |
| -A "${CMAKE_GENERATOR_PLATFORM}" |
| -DTEST_GIT_TAG:STRING=${desired_tag} |
| ${ExternalProjectUpdate_SOURCE_DIR} |
| WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR} |
| RESULT_VARIABLE error_code |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not configure the project.") |
| endif() |
| |
| # Build |
| execute_process(COMMAND ${CMAKE_COMMAND} |
| --build ${ExternalProjectUpdate_BINARY_DIR} |
| RESULT_VARIABLE error_code |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not build the project.") |
| endif() |
| |
| if( EXISTS ${FETCH_HEAD_file} ) |
| message( FATAL_ERROR "Fetch occurred when it was not expected.") |
| endif() |
| |
| # Check the resulting SHA |
| execute_process(COMMAND ${GIT_EXECUTABLE} |
| rev-list --max-count=1 HEAD |
| WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep2-GIT |
| RESULT_VARIABLE error_code |
| OUTPUT_VARIABLE tag_sha |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not check the sha.") |
| endif() |
| |
| if(NOT (${tag_sha} STREQUAL ${initial_sha})) |
| message(FATAL_ERROR "Update occurred when it was not expected.") |
| endif() |
| |
| # Update |
| execute_process(COMMAND ${CMAKE_COMMAND} |
| --build ${ExternalProjectUpdate_BINARY_DIR} |
| --target TutorialStep2-GIT-update |
| RESULT_VARIABLE error_code |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not build the project.") |
| endif() |
| |
| # Check the resulting SHA |
| execute_process(COMMAND ${GIT_EXECUTABLE} |
| rev-list --max-count=1 HEAD |
| WORKING_DIRECTORY ${ExternalProjectUpdate_BINARY_DIR}/CMakeExternals/Source/TutorialStep2-GIT |
| RESULT_VARIABLE error_code |
| OUTPUT_VARIABLE tag_sha |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| if(error_code) |
| message(FATAL_ERROR "Could not check the sha.") |
| endif() |
| |
| if(NOT (${tag_sha} STREQUAL ${resulting_sha})) |
| message(FATAL_ERROR "UPDATE_COMMAND produced |
| ${tag_sha} |
| when |
| ${resulting_sha} |
| was expected." |
| ) |
| endif() |
| |
| if( NOT EXISTS ${FETCH_HEAD_file} AND ${fetch_expected}) |
| message( FATAL_ERROR "Fetch did NOT occur when it was expected.") |
| endif() |
| if( EXISTS ${FETCH_HEAD_file} AND NOT ${fetch_expected}) |
| message( FATAL_ERROR "Fetch DID occur when it was not expected.") |
| endif() |
| endmacro() |
| |
| find_package(Git) |
| set(do_git_tests 0) |
| if(GIT_EXECUTABLE) |
| set(do_git_tests 1) |
| |
| execute_process( |
| COMMAND "${GIT_EXECUTABLE}" --version |
| OUTPUT_VARIABLE ov |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| string(REGEX REPLACE "^git version (.+)$" "\\1" git_version "${ov}") |
| message(STATUS "git_version='${git_version}'") |
| |
| if(git_version VERSION_LESS 1.6.5) |
| message(STATUS "No ExternalProject git tests with git client less than version 1.6.5") |
| set(do_git_tests 0) |
| endif() |
| endif() |
| |
| if(do_git_tests) |
| check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1) |
| check_a_tag(tag1 d1970730310fe8bc07e73f15dc570071f9f9654a 1) |
| # With the Git UPDATE_COMMAND performance patch, this will not required a |
| # 'git fetch' |
| check_a_tag(tag1 d1970730310fe8bc07e73f15dc570071f9f9654a 0) |
| check_a_tag(tag2 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1) |
| check_a_tag(d19707303 d1970730310fe8bc07e73f15dc570071f9f9654a 1) |
| check_a_tag(d19707303 d1970730310fe8bc07e73f15dc570071f9f9654a 0) |
| check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1) |
| # This is a remote symbolic ref, so it will always trigger a 'git fetch' |
| check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1) |
| endif() |