1*1c60b9acSAndroid Build Coastguard Worker################################################################################ 2*1c60b9acSAndroid Build Coastguard Worker# 3*1c60b9acSAndroid Build Coastguard Worker# Program: 3D Slicer 4*1c60b9acSAndroid Build Coastguard Worker# 5*1c60b9acSAndroid Build Coastguard Worker# Copyright (c) Kitware Inc. 6*1c60b9acSAndroid Build Coastguard Worker# 7*1c60b9acSAndroid Build Coastguard Worker# See COPYRIGHT.txt 8*1c60b9acSAndroid Build Coastguard Worker# or http://www.slicer.org/copyright/copyright.txt for details. 9*1c60b9acSAndroid Build Coastguard Worker# 10*1c60b9acSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*1c60b9acSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 12*1c60b9acSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*1c60b9acSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*1c60b9acSAndroid Build Coastguard Worker# limitations under the License. 15*1c60b9acSAndroid Build Coastguard Worker# 16*1c60b9acSAndroid Build Coastguard Worker# This file was originally developed by Jean-Christophe Fillion-Robin, Kitware Inc. 17*1c60b9acSAndroid Build Coastguard Worker# and was partially funded by NIH grant 3P41RR013218-12S1 18*1c60b9acSAndroid Build Coastguard Worker# 19*1c60b9acSAndroid Build Coastguard Worker# AG 2013-02-18: I got it from here 20*1c60b9acSAndroid Build Coastguard Worker# https://github.com/Slicer/Slicer/blob/master/CMake/FindGit.cmake 21*1c60b9acSAndroid Build Coastguard Worker# license is BSD 22*1c60b9acSAndroid Build Coastguard Worker# 23*1c60b9acSAndroid Build Coastguard Worker################################################################################ 24*1c60b9acSAndroid Build Coastguard Worker 25*1c60b9acSAndroid Build Coastguard Worker# 26*1c60b9acSAndroid Build Coastguard Worker# The module defines the following variables: 27*1c60b9acSAndroid Build Coastguard Worker# GIT_EXECUTABLE - path to git command line client 28*1c60b9acSAndroid Build Coastguard Worker# GIT_FOUND - true if the command line client was found 29*1c60b9acSAndroid Build Coastguard Worker# 30*1c60b9acSAndroid Build Coastguard Worker# If the command line client executable is found the macro 31*1c60b9acSAndroid Build Coastguard Worker# GIT_WC_INFO(<dir> <var-prefix>) 32*1c60b9acSAndroid Build Coastguard Worker# is defined to extract information of a git working copy at 33*1c60b9acSAndroid Build Coastguard Worker# a given location. 34*1c60b9acSAndroid Build Coastguard Worker# 35*1c60b9acSAndroid Build Coastguard Worker# The macro defines the following variables: 36*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_REVISION_HASH - Current SHA1 hash 37*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_REVISION - Current SHA1 hash 38*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_REVISION_NAME - Name associated with <var-prefix>_WC_REVISION_HASH 39*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_URL - output of command `git config --get remote.origin.url' 40*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_ROOT - Same value as working copy URL 41*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_GITSVN - Set to false 42*1c60b9acSAndroid Build Coastguard Worker# 43*1c60b9acSAndroid Build Coastguard Worker# ... and also the following ones if it's a git-svn repository: 44*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_GITSVN - Set to True if it is a 45*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_INFO - output of command `git svn info' 46*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_URL - url of the associated SVN repository 47*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_ROOT - root url of the associated SVN repository 48*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_REVISION - current SVN revision number 49*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_LAST_CHANGED_AUTHOR - author of last commit 50*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit 51*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit 52*1c60b9acSAndroid Build Coastguard Worker# <var-prefix>_WC_LAST_CHANGED_LOG - last log of base revision 53*1c60b9acSAndroid Build Coastguard Worker# 54*1c60b9acSAndroid Build Coastguard Worker# Example usage: 55*1c60b9acSAndroid Build Coastguard Worker# find_package(Git) 56*1c60b9acSAndroid Build Coastguard Worker# if(GIT_FOUND) 57*1c60b9acSAndroid Build Coastguard Worker# GIT_WC_INFO(${PROJECT_SOURCE_DIR} Project) 58*1c60b9acSAndroid Build Coastguard Worker# message("Current revision is ${Project_WC_REVISION_HASH}") 59*1c60b9acSAndroid Build Coastguard Worker# message("git found: ${GIT_EXECUTABLE}") 60*1c60b9acSAndroid Build Coastguard Worker# endif() 61*1c60b9acSAndroid Build Coastguard Worker# 62*1c60b9acSAndroid Build Coastguard Worker 63*1c60b9acSAndroid Build Coastguard Worker# Look for 'git' or 'eg' (easy git) 64*1c60b9acSAndroid Build Coastguard Worker# 65*1c60b9acSAndroid Build Coastguard Workerset(git_names git eg) 66*1c60b9acSAndroid Build Coastguard Worker 67*1c60b9acSAndroid Build Coastguard Worker# Prefer .cmd variants on Windows unless running in a Makefile 68*1c60b9acSAndroid Build Coastguard Worker# in the MSYS shell. 69*1c60b9acSAndroid Build Coastguard Worker# 70*1c60b9acSAndroid Build Coastguard Workerif(WIN32) 71*1c60b9acSAndroid Build Coastguard Worker if(NOT CMAKE_GENERATOR MATCHES "MSYS") 72*1c60b9acSAndroid Build Coastguard Worker # Note: Due to a bug in 'git.cmd' preventing it from returning the exit code of 'git', 73*1c60b9acSAndroid Build Coastguard Worker # we excluded it from the list of executables to search. 74*1c60b9acSAndroid Build Coastguard Worker # See http://code.google.com/p/msysgit/issues/detail?id=428 75*1c60b9acSAndroid Build Coastguard Worker # TODO Check if 'git' exists, get the associated version, if the corresponding version 76*1c60b9acSAndroid Build Coastguard Worker # is known to have a working version of 'git.cmd', use it. 77*1c60b9acSAndroid Build Coastguard Worker set(git_names git eg.cmd eg) 78*1c60b9acSAndroid Build Coastguard Worker endif() 79*1c60b9acSAndroid Build Coastguard Workerendif() 80*1c60b9acSAndroid Build Coastguard Worker 81*1c60b9acSAndroid Build Coastguard Workerfind_program(GIT_EXECUTABLE ${git_names} 82*1c60b9acSAndroid Build Coastguard Worker PATHS 83*1c60b9acSAndroid Build Coastguard Worker "C:/Program Files/Git/bin" 84*1c60b9acSAndroid Build Coastguard Worker "C:/Program Files (x86)/Git/bin" 85*1c60b9acSAndroid Build Coastguard Worker DOC "git command line client") 86*1c60b9acSAndroid Build Coastguard Workermark_as_advanced(GIT_EXECUTABLE) 87*1c60b9acSAndroid Build Coastguard Worker 88*1c60b9acSAndroid Build Coastguard Workerif(GIT_EXECUTABLE) 89*1c60b9acSAndroid Build Coastguard Worker macro(GIT_WC_INFO dir prefix) 90*1c60b9acSAndroid Build Coastguard Worker execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify -q --short=7 HEAD 91*1c60b9acSAndroid Build Coastguard Worker WORKING_DIRECTORY ${dir} 92*1c60b9acSAndroid Build Coastguard Worker ERROR_VARIABLE GIT_error 93*1c60b9acSAndroid Build Coastguard Worker OUTPUT_VARIABLE ${prefix}_WC_REVISION_HASH 94*1c60b9acSAndroid Build Coastguard Worker OUTPUT_STRIP_TRAILING_WHITESPACE) 95*1c60b9acSAndroid Build Coastguard Worker set(${prefix}_WC_REVISION ${${prefix}_WC_REVISION_HASH}) 96*1c60b9acSAndroid Build Coastguard Worker if(NOT ${GIT_error} EQUAL 0) 97*1c60b9acSAndroid Build Coastguard Worker message(SEND_ERROR "Command \"${GIT_EXECUTBALE} rev-parse --verify -q --short=7 HEAD\" in directory ${dir} failed with output:\n${GIT_error}") 98*1c60b9acSAndroid Build Coastguard Worker else(NOT ${GIT_error} EQUAL 0) 99*1c60b9acSAndroid Build Coastguard Worker execute_process(COMMAND ${GIT_EXECUTABLE} name-rev ${${prefix}_WC_REVISION_HASH} 100*1c60b9acSAndroid Build Coastguard Worker WORKING_DIRECTORY ${dir} 101*1c60b9acSAndroid Build Coastguard Worker OUTPUT_VARIABLE ${prefix}_WC_REVISION_NAME 102*1c60b9acSAndroid Build Coastguard Worker OUTPUT_STRIP_TRAILING_WHITESPACE) 103*1c60b9acSAndroid Build Coastguard Worker endif(NOT ${GIT_error} EQUAL 0) 104*1c60b9acSAndroid Build Coastguard Worker 105*1c60b9acSAndroid Build Coastguard Worker execute_process(COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url 106*1c60b9acSAndroid Build Coastguard Worker WORKING_DIRECTORY ${dir} 107*1c60b9acSAndroid Build Coastguard Worker OUTPUT_VARIABLE ${prefix}_WC_URL 108*1c60b9acSAndroid Build Coastguard Worker OUTPUT_STRIP_TRAILING_WHITESPACE) 109*1c60b9acSAndroid Build Coastguard Worker 110*1c60b9acSAndroid Build Coastguard Worker set(${prefix}_WC_GITSVN False) 111*1c60b9acSAndroid Build Coastguard Worker 112*1c60b9acSAndroid Build Coastguard Worker # Check if this git is likely to be a git-svn repository 113*1c60b9acSAndroid Build Coastguard Worker execute_process(COMMAND ${GIT_EXECUTABLE} config --get-regexp "^svn-remote" 114*1c60b9acSAndroid Build Coastguard Worker WORKING_DIRECTORY ${dir} 115*1c60b9acSAndroid Build Coastguard Worker OUTPUT_VARIABLE git_config_output 116*1c60b9acSAndroid Build Coastguard Worker OUTPUT_STRIP_TRAILING_WHITESPACE 117*1c60b9acSAndroid Build Coastguard Worker ) 118*1c60b9acSAndroid Build Coastguard Worker 119*1c60b9acSAndroid Build Coastguard Worker if(NOT "${git_config_output}" STREQUAL "") 120*1c60b9acSAndroid Build Coastguard Worker # In case git-svn is used, attempt to extract svn info 121*1c60b9acSAndroid Build Coastguard Worker execute_process(COMMAND ${GIT_EXECUTABLE} svn info 122*1c60b9acSAndroid Build Coastguard Worker WORKING_DIRECTORY ${dir} 123*1c60b9acSAndroid Build Coastguard Worker TIMEOUT 3 124*1c60b9acSAndroid Build Coastguard Worker ERROR_VARIABLE git_svn_info_error 125*1c60b9acSAndroid Build Coastguard Worker OUTPUT_VARIABLE ${prefix}_WC_INFO 126*1c60b9acSAndroid Build Coastguard Worker RESULT_VARIABLE git_svn_info_result 127*1c60b9acSAndroid Build Coastguard Worker OUTPUT_STRIP_TRAILING_WHITESPACE) 128*1c60b9acSAndroid Build Coastguard Worker 129*1c60b9acSAndroid Build Coastguard Worker if(${git_svn_info_result} EQUAL 0) 130*1c60b9acSAndroid Build Coastguard Worker set(${prefix}_WC_GITSVN True) 131*1c60b9acSAndroid Build Coastguard Worker string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*" 132*1c60b9acSAndroid Build Coastguard Worker "\\2" ${prefix}_WC_URL "${${prefix}_WC_INFO}") 133*1c60b9acSAndroid Build Coastguard Worker string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*" 134*1c60b9acSAndroid Build Coastguard Worker "\\2" ${prefix}_WC_REVISION "${${prefix}_WC_INFO}") 135*1c60b9acSAndroid Build Coastguard Worker string(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*" 136*1c60b9acSAndroid Build Coastguard Worker "\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}") 137*1c60b9acSAndroid Build Coastguard Worker string(REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*" 138*1c60b9acSAndroid Build Coastguard Worker "\\2" ${prefix}_WC_LAST_CHANGED_AUTHOR "${${prefix}_WC_INFO}") 139*1c60b9acSAndroid Build Coastguard Worker string(REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*" 140*1c60b9acSAndroid Build Coastguard Worker "\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}") 141*1c60b9acSAndroid Build Coastguard Worker string(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*" 142*1c60b9acSAndroid Build Coastguard Worker "\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}") 143*1c60b9acSAndroid Build Coastguard Worker endif(${git_svn_info_result} EQUAL 0) 144*1c60b9acSAndroid Build Coastguard Worker endif(NOT "${git_config_output}" STREQUAL "") 145*1c60b9acSAndroid Build Coastguard Worker 146*1c60b9acSAndroid Build Coastguard Worker # If there is no 'remote.origin', default to "NA" value and print a warning message. 147*1c60b9acSAndroid Build Coastguard Worker if(NOT ${prefix}_WC_URL) 148*1c60b9acSAndroid Build Coastguard Worker message(WARNING "No remote origin set for git repository: ${dir}" ) 149*1c60b9acSAndroid Build Coastguard Worker set( ${prefix}_WC_URL "NA" ) 150*1c60b9acSAndroid Build Coastguard Worker else() 151*1c60b9acSAndroid Build Coastguard Worker set(${prefix}_WC_ROOT ${${prefix}_WC_URL}) 152*1c60b9acSAndroid Build Coastguard Worker endif() 153*1c60b9acSAndroid Build Coastguard Worker 154*1c60b9acSAndroid Build Coastguard Worker endmacro(GIT_WC_INFO) 155*1c60b9acSAndroid Build Coastguard Workerendif(GIT_EXECUTABLE) 156*1c60b9acSAndroid Build Coastguard Worker 157*1c60b9acSAndroid Build Coastguard Worker# Handle the QUIETLY and REQUIRED arguments and set GIT_FOUND to TRUE if 158*1c60b9acSAndroid Build Coastguard Worker# all listed variables are TRUE 159*1c60b9acSAndroid Build Coastguard Worker 160*1c60b9acSAndroid Build Coastguard Workerinclude(FindPackageHandleStandardArgs) 161*1c60b9acSAndroid Build Coastguard Workerfind_package_handle_standard_args(Git DEFAULT_MSG GIT_EXECUTABLE) 162*1c60b9acSAndroid Build Coastguard Worker 163*1c60b9acSAndroid Build Coastguard Worker 164