[Cmake-commits] CMake branch, next, updated. v2.8.10.1-838-g3a17287

David Cole david.cole at kitware.com
Fri Nov 9 08:45:53 EST 2012


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  3a17287e833df035997ac46f9ff42b6b0247a997 (commit)
       via  a272326b6bfe4bdef086afd1fe039264407150dc (commit)
       via  97131c0e3558414c755053c65905cb0c4d9c74fc (commit)
       via  da155d0a114e9ae71ac5bf07833c7ab8188cd962 (commit)
       via  420db4fbeb8f26572cce55601358b139cdc136a3 (commit)
       via  378aa127b4f335af77ddfe132e03343d8709c148 (commit)
       via  d0758290e78046ac0d8cf91e3456369cc4c43999 (commit)
      from  c9bce4e3c898c0d69bc0b6d94bc74d20a7bc5f97 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3a17287e833df035997ac46f9ff42b6b0247a997
commit 3a17287e833df035997ac46f9ff42b6b0247a997
Merge: c9bce4e a272326
Author:     David Cole <david.cole at kitware.com>
AuthorDate: Fri Nov 9 08:45:22 2012 -0500
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Fri Nov 9 08:45:22 2012 -0500

    Merge topic 'only-git-fetch-when-necessary' into next
    
    a272326 ExternalProject: Verify when a fetch occurs during update test.
    97131c0 ExternalProject: Make sure the ExternalProjectUpdate setup is available.
    da155d0 ExternalProject: Always do a git fetch for a remote ref.
    420db4f ExternalProject: Add tests for UPDATE_COMMAND.
    378aa12 ExternalProject: Do smoke tests for Git Tutorial builds.
    d075829 ExternalProject: Only run 'git fetch' when required.


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a272326b6bfe4bdef086afd1fe039264407150dc
commit a272326b6bfe4bdef086afd1fe039264407150dc
Author:     Matt McCormick <matt.mccormick at kitware.com>
AuthorDate: Thu Nov 1 20:21:29 2012 +0000
Commit:     David Cole <david.cole at kitware.com>
CommitDate: Thu Nov 8 14:43:41 2012 -0500

    ExternalProject: Verify when a fetch occurs during update test.
    
    The performance feature of only performing a git fetch when needed
    during the ExternalProject update step is verified during the test.
    A fetch is identified by removing the FETCH_HEAD file and checking for
    its reincarnation.

diff --git a/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
index ebb10ad..bc5ea5e 100644
--- a/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
+++ b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
@@ -1,7 +1,15 @@
 # Set the ExternalProject GIT_TAG to desired_tag, and make sure the
-# resulting checked out version is resulting_sha and a rebuild.
-# This check's the viability of the ExternalProject UPDATE_COMMAND.
-macro(check_a_tag desired_tag resulting_sha)
+# 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_TEST_GENERATOR}
@@ -43,18 +51,26 @@ when
 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)
 if(GIT_EXECUTABLE)
-  check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
-  check_a_tag(tag1          d1970730310fe8bc07e73f15dc570071f9f9654a)
+  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)
-  check_a_tag(tag2          5842b503ba4113976d9bb28d57b5aee1ad2736b7)
-  check_a_tag(d19707303     d1970730310fe8bc07e73f15dc570071f9f9654a)
-  check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
+  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)
+  check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7 1)
 endif(GIT_EXECUTABLE)

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=97131c0e3558414c755053c65905cb0c4d9c74fc
commit 97131c0e3558414c755053c65905cb0c4d9c74fc
Author:     Matt McCormick <matt.mccormick at kitware.com>
AuthorDate: Thu Nov 1 15:50:58 2012 +0000
Commit:     David Cole <david.cole at kitware.com>
CommitDate: Thu Nov 8 14:43:37 2012 -0500

    ExternalProject: Make sure the ExternalProjectUpdate setup is available.
    
    This prepares the numberous tests that occur in the ExternalProjectUpdate
    test.  The tests were passing previously because a fresh build was not performed.

diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index c1007a4..9d13625 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -982,18 +982,35 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
   set_tests_properties(ExternalProject PROPERTIES
     TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT})
 
-  add_test(ExternalProjectUpdate ${CMAKE_CMAKE_COMMAND}
+  add_test(ExternalProjectUpdateSetup ${CMAKE_CTEST_COMMAND}
+    --build-and-test
+    "${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate"
+    "${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate"
+    --build-generator ${CMAKE_TEST_GENERATOR}
+    --build-project ExternalProjectUpdateTest
+    --build-makeprogram ${CMAKE_TEST_MAKEPROGRAM}
+    --build-exe-dir "${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate"
+    --force-new-ctest-process
+    --test-command ${CMAKE_CTEST_COMMAND} -V
+    )
+  list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate")
+  set_tests_properties(ExternalProjectUpdateSetup PROPERTIES
+    TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT})
+
+  add_test(NAME ExternalProjectUpdate
+    WORKING_DIRECTORY ${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate
+    COMMAND ${CMAKE_CMAKE_COMMAND}
     -DExternalProjectUpdate_SOURCE_DIR:PATH=${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate
     -DExternalProjectUpdate_BINARY_DIR:PATH=${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate
     -DCMAKE_TEST_GENERATOR=${CMAKE_TEST_GENERATOR}
     -DCMAKE_TEST_MAKEPROGRAM=${CMAKE_TEST_MAKEPROGRAM}
     -DCMAKE_CTEST_COMMAND=${CMAKE_CTEST_COMMAND}
     -P ${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
-    WORKING_DIRECTORY ${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate
     )
   list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate")
   set_tests_properties(ExternalProjectUpdate PROPERTIES
-    TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT})
+    TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT}
+    DEPENDS ExternalProjectUpdateSetup )
 
   # do each of the tutorial steps
   foreach(STP RANGE 1 7)
diff --git a/Tests/ExternalProjectUpdate/CMakeLists.txt b/Tests/ExternalProjectUpdate/CMakeLists.txt
index cb3a94e..c33e90b 100644
--- a/Tests/ExternalProjectUpdate/CMakeLists.txt
+++ b/Tests/ExternalProjectUpdate/CMakeLists.txt
@@ -41,7 +41,7 @@ endif()
 
 # This should be specified from the command line.
 if(NOT TEST_GIT_TAG)
-  message(FATAL_ERROR "TEST_GIT_TAG must be specified.")
+  set(TEST_GIT_TAG origin/master)
 endif()
 
 if(do_git_tests)

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=da155d0a114e9ae71ac5bf07833c7ab8188cd962
commit da155d0a114e9ae71ac5bf07833c7ab8188cd962
Author:     Matt McCormick <matt.mccormick at kitware.com>
AuthorDate: Fri Jul 27 17:38:01 2012 +0000
Commit:     David Cole <david.cole at kitware.com>
CommitDate: Thu Nov 8 14:42:27 2012 -0500

    ExternalProject: Always do a git fetch for a remote ref.
    
    Remote git refs always require a git fetch, because the remote may move around
    where the ref points.

diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index 7a8aa5f..2355dac 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -418,6 +418,19 @@ if(error_code)
   message(FATAL_ERROR \"Failed to get the hash for HEAD\")
 endif()
 
+execute_process(
+  COMMAND \"${git_EXECUTABLE}\" show-ref ${git_tag}
+  WORKING_DIRECTORY \"${work_dir}\"
+  OUTPUT_VARIABLE show_ref_output
+  )
+# If a remote ref is asked for, which can possibly move around,
+# we must always do a fetch and checkout.
+if(\"\${show_ref_output}\" MATCHES \"remotes\")
+  set(is_remote_ref 1)
+else()
+  set(is_remote_ref 0)
+endif()
+
 # This will fail if the tag does not exist (it probably has not been fetched
 # yet).
 execute_process(
@@ -428,7 +441,7 @@ execute_process(
   )
 
 # Is the hash checkout out that we want?
-if(error_code OR NOT (\"\${tag_sha}\" STREQUAL \"\${head_sha}\"))
+if(error_code OR is_remote_ref OR NOT (\"\${tag_sha}\" STREQUAL \"\${head_sha}\"))
   execute_process(
     COMMAND \"${git_EXECUTABLE}\" fetch
     WORKING_DIRECTORY \"${work_dir}\"
diff --git a/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
index 08e7be0..ebb10ad 100644
--- a/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
+++ b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
@@ -29,12 +29,12 @@ macro(check_a_tag desired_tag resulting_sha)
     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()
 
-  string(STRIP "${tag_sha}" tag_sha)
   if(NOT (${tag_sha} STREQUAL ${resulting_sha}))
     message(FATAL_ERROR "UPDATE_COMMAND produced
   ${tag_sha}
@@ -55,4 +55,6 @@ if(GIT_EXECUTABLE)
   check_a_tag(tag2          5842b503ba4113976d9bb28d57b5aee1ad2736b7)
   check_a_tag(d19707303     d1970730310fe8bc07e73f15dc570071f9f9654a)
   check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
+  # This is a remote symbolic ref, so it will always trigger a 'git fetch'
+  check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
 endif(GIT_EXECUTABLE)

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=420db4fbeb8f26572cce55601358b139cdc136a3
commit 420db4fbeb8f26572cce55601358b139cdc136a3
Author:     Matt McCormick <matt.mccormick at kitware.com>
AuthorDate: Fri Jul 27 16:26:28 2012 +0000
Commit:     David Cole <david.cole at kitware.com>
CommitDate: Thu Nov 8 14:42:20 2012 -0500

    ExternalProject: Add tests for UPDATE_COMMAND.
    
    Tests are added for UPDATE_COMMAND to ensure it is working properly.  Testing
    infrastructure is added along with tests for Git, but tests for other version
    control systems could easily be added in the future.

diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index b404333..c1007a4 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -982,6 +982,19 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
   set_tests_properties(ExternalProject PROPERTIES
     TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT})
 
+  add_test(ExternalProjectUpdate ${CMAKE_CMAKE_COMMAND}
+    -DExternalProjectUpdate_SOURCE_DIR:PATH=${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate
+    -DExternalProjectUpdate_BINARY_DIR:PATH=${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate
+    -DCMAKE_TEST_GENERATOR=${CMAKE_TEST_GENERATOR}
+    -DCMAKE_TEST_MAKEPROGRAM=${CMAKE_TEST_MAKEPROGRAM}
+    -DCMAKE_CTEST_COMMAND=${CMAKE_CTEST_COMMAND}
+    -P ${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
+    WORKING_DIRECTORY ${CMake_SOURCE_DIR}/Tests/ExternalProjectUpdate
+    )
+  list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/ExternalProjectUpdate")
+  set_tests_properties(ExternalProjectUpdate PROPERTIES
+    TIMEOUT ${CMAKE_LONG_TEST_TIMEOUT})
+
   # do each of the tutorial steps
   foreach(STP RANGE 1 7)
     add_test(TutorialStep${STP} ${CMAKE_CTEST_COMMAND}
diff --git a/Tests/ExternalProjectUpdate/CMakeLists.txt b/Tests/ExternalProjectUpdate/CMakeLists.txt
new file mode 100644
index 0000000..cb3a94e
--- /dev/null
+++ b/Tests/ExternalProjectUpdate/CMakeLists.txt
@@ -0,0 +1,94 @@
+cmake_minimum_required(VERSION 2.8)
+project(ExternalProjectUpdateTest NONE)
+
+include(ExternalProject)
+
+find_package(Git)
+
+option(ExternalProjectUpdateTest_USE_FOLDERS "Enable folder grouping in IDEs." ON)
+if(ExternalProjectUpdateTest_USE_FOLDERS)
+  set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+else()
+  set_property(GLOBAL PROPERTY USE_FOLDERS OFF)
+endif()
+
+set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER
+  "CMakePredefinedTargets-in-ExternalProjectUpdateTest")
+
+set(base "${CMAKE_BINARY_DIR}/CMakeExternals")
+set(binary_base "${base}/Build")
+set_property(DIRECTORY PROPERTY EP_BASE ${base})
+set_property(DIRECTORY PROPERTY EP_STEP_TARGETS configure build test)
+
+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()
+
+# This should be specified from the command line.
+if(NOT TEST_GIT_TAG)
+  message(FATAL_ERROR "TEST_GIT_TAG must be specified.")
+endif()
+
+if(do_git_tests)
+  set(local_git_repo "../../LocalRepositories/GIT")
+
+  # Unzip/untar the git repository in our source folder so that other
+  # projects below may use it to test git args of ExternalProject_Add
+  #
+  set(proj SetupLocalGITRepository)
+  ExternalProject_Add(${proj}
+    SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/LocalRepositories/GIT
+    URL ${CMAKE_CURRENT_SOURCE_DIR}/gitrepo.tgz
+    BUILD_COMMAND ""
+    CONFIGURE_COMMAND "${GIT_EXECUTABLE}" --version
+    INSTALL_COMMAND ""
+  )
+  set_property(TARGET ${proj}
+    PROPERTY FOLDER "SetupRepos/Local/Deeply/Nested/For/Testing")
+
+  set(proj TutorialStep1-GIT)
+  ExternalProject_Add(${proj}
+    GIT_REPOSITORY "${local_git_repo}"
+    GIT_TAG ${TEST_GIT_TAG}
+    CMAKE_GENERATOR "${CMAKE_GENERATOR}"
+    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
+    INSTALL_COMMAND ""
+    DEPENDS "SetupLocalGITRepository"
+  )
+  set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
+endif()
+
+
+# Test the testable built/installed products:
+#
+enable_testing()
+
+
+# Do at least a smoke test of a built executable from each
+# project's build directory...
+#
+# BuildTree tests:
+#
+
+if(do_git_tests)
+  add_test(TutorialStep1-GIT
+    "${binary_base}/TutorialStep1-GIT/Tutorial" 81)
+endif()
+
+message(STATUS "do_git_tests='${do_git_tests}'")
+message(STATUS "GIT_EXECUTABLE='${GIT_EXECUTABLE}'")
diff --git a/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
new file mode 100644
index 0000000..08e7be0
--- /dev/null
+++ b/Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
@@ -0,0 +1,58 @@
+# Set the ExternalProject GIT_TAG to desired_tag, and make sure the
+# resulting checked out version is resulting_sha and a rebuild.
+# This check's the viability of the ExternalProject UPDATE_COMMAND.
+macro(check_a_tag desired_tag resulting_sha)
+  # Configure
+  execute_process(COMMAND ${CMAKE_COMMAND}
+    -G ${CMAKE_TEST_GENERATOR}
+    -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
+    )
+  if(error_code)
+    message(FATAL_ERROR "Could not check the sha.")
+  endif()
+
+  string(STRIP "${tag_sha}" tag_sha)
+  if(NOT (${tag_sha} STREQUAL ${resulting_sha}))
+    message(FATAL_ERROR "UPDATE_COMMAND produced
+  ${tag_sha}
+when
+  ${resulting_sha}
+was expected."
+    )
+  endif()
+endmacro()
+
+find_package(Git)
+if(GIT_EXECUTABLE)
+  check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
+  check_a_tag(tag1          d1970730310fe8bc07e73f15dc570071f9f9654a)
+  # With the Git UPDATE_COMMAND performance patch, this will not required a
+  # 'git fetch'
+  check_a_tag(tag1          d1970730310fe8bc07e73f15dc570071f9f9654a)
+  check_a_tag(tag2          5842b503ba4113976d9bb28d57b5aee1ad2736b7)
+  check_a_tag(d19707303     d1970730310fe8bc07e73f15dc570071f9f9654a)
+  check_a_tag(origin/master 5842b503ba4113976d9bb28d57b5aee1ad2736b7)
+endif(GIT_EXECUTABLE)
diff --git a/Tests/ExternalProjectUpdate/gitrepo.tgz b/Tests/ExternalProjectUpdate/gitrepo.tgz
new file mode 100644
index 0000000..87090ab
Binary files /dev/null and b/Tests/ExternalProjectUpdate/gitrepo.tgz differ

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=378aa127b4f335af77ddfe132e03343d8709c148
commit 378aa127b4f335af77ddfe132e03343d8709c148
Author:     Matt McCormick <matt.mccormick at kitware.com>
AuthorDate: Thu Jul 26 18:24:41 2012 +0000
Commit:     David Cole <david.cole at kitware.com>
CommitDate: Sat Nov 3 17:18:14 2012 -0400

    ExternalProject: Do smoke tests for Git Tutorial builds.

diff --git a/Tests/ExternalProject/CMakeLists.txt b/Tests/ExternalProject/CMakeLists.txt
index 3f8e827..e24a979 100644
--- a/Tests/ExternalProject/CMakeLists.txt
+++ b/Tests/ExternalProject/CMakeLists.txt
@@ -638,6 +638,17 @@ if(do_svn_tests)
     "${binary_base}/TutorialStep1-SVN-trunk/Tutorial" 98)
 endif()
 
+if(do_git_tests)
+  add_test(TutorialStep1-GIT-byhash
+    "${binary_base}/TutorialStep1-GIT-byhash/Tutorial" 100)
+
+  add_test(TutorialStep1-GIT-bytag
+    "${binary_base}/TutorialStep1-GIT-bytag/Tutorial" 99)
+
+  add_test(TutorialStep1-GIT-master
+    "${binary_base}/TutorialStep1-GIT-master/Tutorial" 98)
+endif()
+
 
 # InstallTree tests:
 #

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d0758290e78046ac0d8cf91e3456369cc4c43999
commit d0758290e78046ac0d8cf91e3456369cc4c43999
Author:     Matt McCormick <matt.mccormick at kitware.com>
AuthorDate: Fri Jun 8 18:29:34 2012 -0400
Commit:     David Cole <david.cole at kitware.com>
CommitDate: Sat Nov 3 17:18:14 2012 -0400

    ExternalProject: Only run 'git fetch' when required.
    
    In the current default update step for Git under the ExternalProject_Add
    command, a 'git fetch' is always performed, followed by a 'git checkout' and
    'git submodule update --recursive'.  However, a 'git fetch' can be time
    consuming and requires a network connection.
    
    To save time, we look at the current checked out hash, and only perform the
    fetch if required.  This is performed in a CMake script so we can handle
    the conditional logic in a cross platform manner.

diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index 8d57860..7a8aa5f 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -402,6 +402,66 @@ endif()
 endfunction()
 
 
+function(_ep_write_gitupdate_script script_filename git_EXECUTABLE git_tag git_repository work_dir)
+  file(WRITE ${script_filename}
+"if(\"${git_tag}\" STREQUAL \"\")
+  message(FATAL_ERROR \"Tag for git checkout should not be empty.\")
+endif()
+
+execute_process(
+  COMMAND \"${git_EXECUTABLE}\" rev-list --max-count=1 HEAD
+  WORKING_DIRECTORY \"${work_dir}\"
+  RESULT_VARIABLE error_code
+  OUTPUT_VARIABLE head_sha
+  )
+if(error_code)
+  message(FATAL_ERROR \"Failed to get the hash for HEAD\")
+endif()
+
+# This will fail if the tag does not exist (it probably has not been fetched
+# yet).
+execute_process(
+  COMMAND \"${git_EXECUTABLE}\" rev-list --max-count=1 ${git_tag}
+  WORKING_DIRECTORY \"${work_dir}\"
+  RESULT_VARIABLE error_code
+  OUTPUT_VARIABLE tag_sha
+  )
+
+# Is the hash checkout out that we want?
+if(error_code OR NOT (\"\${tag_sha}\" STREQUAL \"\${head_sha}\"))
+  execute_process(
+    COMMAND \"${git_EXECUTABLE}\" fetch
+    WORKING_DIRECTORY \"${work_dir}\"
+    RESULT_VARIABLE error_code
+    )
+  if(error_code)
+    message(FATAL_ERROR \"Failed to fetch repository '${git_repository}'\")
+  endif()
+
+  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()
+
+  execute_process(
+    COMMAND \"${git_EXECUTABLE}\" submodule update --recursive
+    WORKING_DIRECTORY \"${work_dir}/${src_name}\"
+    RESULT_VARIABLE error_code
+    )
+  if(error_code)
+    message(FATAL_ERROR \"Failed to update submodules in: '${work_dir}/${src_name}'\")
+  endif()
+endif()
+
+"
+)
+
+endfunction(_ep_write_gitupdate_script)
+
 function(_ep_write_downloadfile_script script_filename remote local timeout hash tls_verify tls_cainfo)
   if(timeout)
     set(timeout_args TIMEOUT ${timeout})
@@ -1354,7 +1414,7 @@ endfunction()
 
 
 function(_ep_add_update_command name)
-  ExternalProject_Get_Property(${name} source_dir)
+  ExternalProject_Get_Property(${name} source_dir tmp_dir)
 
   get_property(cmd_set TARGET ${name} PROPERTY _EP_UPDATE_COMMAND SET)
   get_property(cmd TARGET ${name} PROPERTY _EP_UPDATE_COMMAND)
@@ -1406,15 +1466,15 @@ function(_ep_add_update_command name)
       message(FATAL_ERROR "error: could not find git for fetch of ${name}")
     endif()
     set(work_dir ${source_dir})
-    set(comment "Performing update step (git fetch) for '${name}'")
+    set(comment "Performing update step for '${name}'")
     get_property(git_tag TARGET ${name} PROPERTY _EP_GIT_TAG)
     if(NOT git_tag)
       set(git_tag "master")
     endif()
-    set(cmd ${GIT_EXECUTABLE} fetch
-      COMMAND ${GIT_EXECUTABLE} checkout ${git_tag}
-      COMMAND ${GIT_EXECUTABLE} submodule update --recursive
+    _ep_write_gitupdate_script(${tmp_dir}/${name}-gitupdate.cmake
+      ${GIT_EXECUTABLE} ${git_tag} ${git_repository} ${work_dir}
       )
+    set(cmd ${CMAKE_COMMAND} -P ${tmp_dir}/${name}-gitupdate.cmake)
     set(always 1)
   elseif(hg_repository)
     if(NOT HG_EXECUTABLE)

-----------------------------------------------------------------------

Summary of changes:
 Modules/ExternalProject.cmake                      |   83 ++++++++++++++++-
 Tests/CMakeLists.txt                               |   30 ++++++
 Tests/ExternalProject/CMakeLists.txt               |   11 +++
 Tests/ExternalProjectUpdate/CMakeLists.txt         |   94 ++++++++++++++++++++
 .../ExternalProjectUpdateTest.cmake                |   76 ++++++++++++++++
 Tests/ExternalProjectUpdate/gitrepo.tgz            |  Bin 0 -> 3057 bytes
 6 files changed, 289 insertions(+), 5 deletions(-)
 create mode 100644 Tests/ExternalProjectUpdate/CMakeLists.txt
 create mode 100644 Tests/ExternalProjectUpdate/ExternalProjectUpdateTest.cmake
 create mode 100644 Tests/ExternalProjectUpdate/gitrepo.tgz


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list