[Cmake-commits] CMake branch, next, updated. v3.0.0-rc3-1493-gcbd2444

Daniele E. Domenichelli daniele.domenichelli at gmail.com
Thu Mar 27 11:48:48 EDT 2014


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  cbd2444b399f30af625b57ca3c1b1a26ac5ec020 (commit)
       via  64d78bd6ac14c6067dfc2a9a8d572b662364d55f (commit)
       via  49bed21adc6c78067af3768fb18a2e04e9ce12bf (commit)
      from  f376a82b9fc79ff961b35c753c2b2beef546be7e (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=cbd2444b399f30af625b57ca3c1b1a26ac5ec020
commit cbd2444b399f30af625b57ca3c1b1a26ac5ec020
Merge: f376a82 64d78bd
Author:     Daniele E. Domenichelli <daniele.domenichelli at gmail.com>
AuthorDate: Thu Mar 27 11:48:47 2014 -0400
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Thu Mar 27 11:48:47 2014 -0400

    Merge topic 'ExternalProject_GitUpdate' into next
    
    64d78bd6 ExternalProject: Better handling of git remote branches
    49bed21a ExternalProject: Strip trailing space from git hash


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=64d78bd6ac14c6067dfc2a9a8d572b662364d55f
commit 64d78bd6ac14c6067dfc2a9a8d572b662364d55f
Author:     Daniele E. Domenichelli <daniele.domenichelli at iit.it>
AuthorDate: Mon Nov 18 11:36:18 2013 +0100
Commit:     Daniele E. Domenichelli <daniele.domenichelli at iit.it>
CommitDate: Thu Mar 27 15:59:22 2014 +0100

    ExternalProject: Better handling of git remote branches
    
    ExternalProject handles git remote branches by commit hash. Due to
    this, the git repository ends in detached states, and local commits
    are discarded.
    
    This patch uses "git pull --rebase" for remote branches instead of
    git checkout. If there are local changes, "git stash" is used to save
    the changes and restore them after the pull. If any of these operation
    fails, it tries to restore the original status and exits with a fatal
    error, asking the user to resolve the conflicts manually.
    
    This also makes the behaviour of ExternalProject using git more similar
    to the svn version, and probably more likely to what the user expects
    by setting GIT_TAG to a branch.

diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index e56cc37..bbf2193 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -494,13 +494,94 @@ if(error_code OR is_remote_ref OR NOT (\"\${tag_sha}\" STREQUAL \"\${head_sha}\"
     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}'\")
+  if(is_remote_ref)
+    # Check if stash is needed
+    execute_process(
+      COMMAND \"${git_EXECUTABLE}\" status --porcelain
+      WORKING_DIRECTORY \"${work_dir}\"
+      RESULT_VARIABLE error_code
+      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 --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}\" pull --rebase origin ${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()
 
   execute_process(

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=49bed21adc6c78067af3768fb18a2e04e9ce12bf
commit 49bed21adc6c78067af3768fb18a2e04e9ce12bf
Author:     Daniele E. Domenichelli <daniele.domenichelli at iit.it>
AuthorDate: Mon Nov 18 12:03:58 2013 +0100
Commit:     Daniele E. Domenichelli <daniele.domenichelli at iit.it>
CommitDate: Thu Mar 27 15:59:22 2014 +0100

    ExternalProject: Strip trailing space from git hash

diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index 8235dda..e56cc37 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -454,6 +454,7 @@ execute_process(
   WORKING_DIRECTORY \"${work_dir}\"
   RESULT_VARIABLE error_code
   OUTPUT_VARIABLE head_sha
+  OUTPUT_STRIP_TRAILING_WHITESPACE
   )
 if(error_code)
   message(FATAL_ERROR \"Failed to get the hash for HEAD\")
@@ -479,6 +480,7 @@ execute_process(
   WORKING_DIRECTORY \"${work_dir}\"
   RESULT_VARIABLE error_code
   OUTPUT_VARIABLE tag_sha
+  OUTPUT_STRIP_TRAILING_WHITESPACE
   )
 
 # Is the hash checkout out that we want?

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

Summary of changes:
 Modules/ExternalProject.cmake |   97 ++++++++++++++++++++++++++++++++++++++---
 1 file changed, 90 insertions(+), 7 deletions(-)


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list