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