add FindGit.cmake 24/3124/1
authorAndy Green <andy.green@linaro.org>
Mon, 18 Feb 2013 10:34:10 +0000 (18:34 +0800)
committerKevron Rees <kevron_m_rees@linux.intel.com>
Thu, 7 Mar 2013 21:01:37 +0000 (13:01 -0800)
Signed-off-by: Andy Green <andy.green@linaro.org>
cmake/FindGit.cmake [new file with mode: 0755]

diff --git a/cmake/FindGit.cmake b/cmake/FindGit.cmake
new file mode 100755 (executable)
index 0000000..65b946c
--- /dev/null
@@ -0,0 +1,163 @@
+################################################################################
+#
+#  Program: 3D Slicer
+#
+#  Copyright (c) Kitware Inc.
+#
+#  See COPYRIGHT.txt
+#  or http://www.slicer.org/copyright/copyright.txt for details.
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+#  This file was originally developed by Jean-Christophe Fillion-Robin, Kitware Inc.
+#  and was partially funded by NIH grant 3P41RR013218-12S1
+#
+#  AG 2013-02-18: I got it from here
+#  https://github.com/Slicer/Slicer/blob/master/CMake/FindGit.cmake
+#  license is BSD
+#
+################################################################################
+
+#
+# The module defines the following variables:
+#   GIT_EXECUTABLE - path to git command line client
+#   GIT_FOUND - true if the command line client was found
+#
+# If the command line client executable is found the macro
+#  GIT_WC_INFO(<dir> <var-prefix>)
+# is defined to extract information of a git working copy at
+# a given location.
+#
+# The macro defines the following variables:
+#  <var-prefix>_WC_REVISION_HASH - Current SHA1 hash
+#  <var-prefix>_WC_REVISION - Current SHA1 hash
+#  <var-prefix>_WC_REVISION_NAME - Name associated with <var-prefix>_WC_REVISION_HASH
+#  <var-prefix>_WC_URL - output of command `git config --get remote.origin.url'
+#  <var-prefix>_WC_ROOT - Same value as working copy URL
+#  <var-prefix>_WC_GITSVN - Set to false
+#
+# ... and also the following ones if it's a git-svn repository:
+#  <var-prefix>_WC_GITSVN - Set to True if it is a
+#  <var-prefix>_WC_INFO - output of command `git svn info'
+#  <var-prefix>_WC_URL - url of the associated SVN repository
+#  <var-prefix>_WC_ROOT - root url of the associated SVN repository
+#  <var-prefix>_WC_REVISION - current SVN revision number
+#  <var-prefix>_WC_LAST_CHANGED_AUTHOR - author of last commit
+#  <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
+#  <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit
+#  <var-prefix>_WC_LAST_CHANGED_LOG - last log of base revision
+#
+# Example usage:
+#   find_package(Git)
+#   if(GIT_FOUND)
+#    GIT_WC_INFO(${PROJECT_SOURCE_DIR} Project)
+#    message("Current revision is ${Project_WC_REVISION_HASH}")
+#    message("git found: ${GIT_EXECUTABLE}")
+#   endif()
+#
+
+# Look for 'git' or 'eg' (easy git)
+#
+set(git_names git eg)
+
+# Prefer .cmd variants on Windows unless running in a Makefile
+# in the MSYS shell.
+#
+if(WIN32)
+  if(NOT CMAKE_GENERATOR MATCHES "MSYS")
+    # Note: Due to a bug in 'git.cmd' preventing it from returning the exit code of 'git',
+    #       we excluded it from the list of executables to search.
+    # See http://code.google.com/p/msysgit/issues/detail?id=428
+    # TODO Check if 'git' exists, get the associated version, if the corresponding version
+    #      is known to have a working version of 'git.cmd', use it.
+    set(git_names git eg.cmd eg)
+  endif()
+endif()
+
+find_program(GIT_EXECUTABLE ${git_names}
+  PATHS
+    "C:/Program Files/Git/bin"
+    "C:/Program Files (x86)/Git/bin"
+  DOC "git command line client")
+mark_as_advanced(GIT_EXECUTABLE)
+
+if(GIT_EXECUTABLE)
+  macro(GIT_WC_INFO dir prefix)
+    execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify -q --short=7 HEAD
+       WORKING_DIRECTORY ${dir}
+       ERROR_VARIABLE GIT_error
+       OUTPUT_VARIABLE ${prefix}_WC_REVISION_HASH
+       OUTPUT_STRIP_TRAILING_WHITESPACE)
+    set(${prefix}_WC_REVISION ${${prefix}_WC_REVISION_HASH})
+    if(NOT ${GIT_error} EQUAL 0)
+      message(SEND_ERROR "Command \"${GIT_EXECUTBALE} rev-parse --verify -q --short=7 HEAD\" in directory ${dir} failed with output:\n${GIT_error}")
+    else(NOT ${GIT_error} EQUAL 0)
+      execute_process(COMMAND ${GIT_EXECUTABLE} name-rev ${${prefix}_WC_REVISION_HASH}
+         WORKING_DIRECTORY ${dir}
+         OUTPUT_VARIABLE ${prefix}_WC_REVISION_NAME
+          OUTPUT_STRIP_TRAILING_WHITESPACE)
+    endif(NOT ${GIT_error} EQUAL 0)
+
+    execute_process(COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url
+       WORKING_DIRECTORY ${dir}
+       OUTPUT_VARIABLE ${prefix}_WC_URL
+       OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    set(${prefix}_WC_GITSVN False)
+
+    # Check if this git is likely to be a git-svn repository
+    execute_process(COMMAND ${GIT_EXECUTABLE} config --get-regexp "^svn-remote"
+      WORKING_DIRECTORY ${dir}
+      OUTPUT_VARIABLE git_config_output
+      OUTPUT_STRIP_TRAILING_WHITESPACE
+      )
+
+    if(NOT "${git_config_output}" STREQUAL "")
+      # In case git-svn is used, attempt to extract svn info
+      execute_process(COMMAND ${GIT_EXECUTABLE} svn info
+        WORKING_DIRECTORY ${dir}
+        TIMEOUT 3
+        ERROR_VARIABLE git_svn_info_error
+        OUTPUT_VARIABLE ${prefix}_WC_INFO
+        RESULT_VARIABLE git_svn_info_result
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+      if(${git_svn_info_result} EQUAL 0)
+        set(${prefix}_WC_GITSVN True)
+        string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*"
+          "\\2" ${prefix}_WC_URL "${${prefix}_WC_INFO}")
+        string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
+          "\\2" ${prefix}_WC_REVISION "${${prefix}_WC_INFO}")
+        string(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*"
+          "\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}")
+        string(REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*"
+          "\\2" ${prefix}_WC_LAST_CHANGED_AUTHOR "${${prefix}_WC_INFO}")
+        string(REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*"
+          "\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}")
+        string(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*"
+          "\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}")
+      endif(${git_svn_info_result} EQUAL 0)
+    endif(NOT "${git_config_output}" STREQUAL "")
+
+    # If there is no 'remote.origin', default to "NA" value and print a warning message.
+    if(NOT ${prefix}_WC_URL)
+      message(WARNING "No remote origin set for git repository: ${dir}" )
+      set( ${prefix}_WC_URL "NA" )
+    else()
+      set(${prefix}_WC_ROOT ${${prefix}_WC_URL})
+    endif()
+
+  endmacro(GIT_WC_INFO)
+endif(GIT_EXECUTABLE)
+
+# Handle the QUIETLY and REQUIRED arguments and set GIT_FOUND to TRUE if
+# all listed variables are TRUE
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Git DEFAULT_MSG GIT_EXECUTABLE)
+
+