diff --git a/cmake/FindGit.cmake b/cmake/FindGit.cmake new file mode 100755 index 000000000..65b946ce1 --- /dev/null +++ b/cmake/FindGit.cmake @@ -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( ) +# is defined to extract information of a git working copy at +# a given location. +# +# The macro defines the following variables: +# _WC_REVISION_HASH - Current SHA1 hash +# _WC_REVISION - Current SHA1 hash +# _WC_REVISION_NAME - Name associated with _WC_REVISION_HASH +# _WC_URL - output of command `git config --get remote.origin.url' +# _WC_ROOT - Same value as working copy URL +# _WC_GITSVN - Set to false +# +# ... and also the following ones if it's a git-svn repository: +# _WC_GITSVN - Set to True if it is a +# _WC_INFO - output of command `git svn info' +# _WC_URL - url of the associated SVN repository +# _WC_ROOT - root url of the associated SVN repository +# _WC_REVISION - current SVN revision number +# _WC_LAST_CHANGED_AUTHOR - author of last commit +# _WC_LAST_CHANGED_DATE - date of last commit +# _WC_LAST_CHANGED_REV - revision of last commit +# _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) + +