Fix addition of Gerrit commit hook when Ceres is a git submodule.
- Also split out addition of Gerrit commit hook into its own function.
Change-Id: I28ed048c5a094c5c9c0246cdabf67833583d66fb
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1196521..e3d3cc7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,31 +39,15 @@
PROJECT(CERES C CXX)
+# Make CMake aware of the cmake folder for local FindXXX scripts,
+# append rather than set in case the user has passed their own
+# additional paths via -D.
+LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
+INCLUDE(UpdateCacheVariable)
+
# Set up the git hook to make Gerrit Change-Id: lines in commit messages.
-SET (LOCAL_GIT_DIRECTORY)
-IF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
- # .git directory can be found on Unix based system, or on Windows with
- # Git Bash (shipped with msysgit)
- SET (LOCAL_GIT_DIRECTORY ${CMAKE_SOURCE_DIR}/.git)
-ELSE (EXISTS ${CMAKE_SOURCE_DIR}/.git)
- # TODO(keir) Add proper Windows support
-ENDIF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
-
-IF (EXISTS ${LOCAL_GIT_DIRECTORY})
- IF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
- # Download the hook only if it is not already present
- FILE(DOWNLOAD https://ceres-solver-review.googlesource.com/tools/hooks/commit-msg
- ${CMAKE_BINARY_DIR}/commit-msg)
-
- # Make the downloaded file executable, since it is not by default.
- FILE(COPY ${CMAKE_BINARY_DIR}/commit-msg
- DESTINATION ${LOCAL_GIT_DIRECTORY}/hooks/
- FILE_PERMISSIONS
- OWNER_READ OWNER_WRITE OWNER_EXECUTE
- GROUP_READ GROUP_WRITE GROUP_EXECUTE
- WORLD_READ WORLD_EXECUTE)
- ENDIF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
-ENDIF (EXISTS ${LOCAL_GIT_DIRECTORY})
+INCLUDE(AddGerritCommitHook)
+ADD_GERRIT_COMMIT_HOOK()
# On OS X, add the Homebrew prefix to the set of prefixes searched by
# CMake in find_path & find_library. This should ensure that we can
@@ -83,12 +67,6 @@
ENDIF()
ENDIF()
-# Make CMake aware of the cmake folder for local FindXXX scripts,
-# append rather than set in case the user has passed their own
-# additional paths via -D.
-LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
-INCLUDE(UpdateCacheVariable)
-
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
diff --git a/cmake/AddGerritCommitHook.cmake b/cmake/AddGerritCommitHook.cmake
new file mode 100644
index 0000000..36da67a
--- /dev/null
+++ b/cmake/AddGerritCommitHook.cmake
@@ -0,0 +1,76 @@
+# Ceres Solver - A fast non-linear least squares minimizer
+# Copyright 2015 Google Inc. All rights reserved.
+# http://ceres-solver.org/
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+# * Neither the name of Google Inc. nor the names of its contributors may be
+# used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: keir@google.com (Keir Mierle)
+# alexs.mac@gmail.com (Alex Stewart)
+
+# Set up the git hook to make Gerrit Change-Id: lines in commit messages.
+FUNCTION(ADD_GERRIT_COMMIT_HOOK)
+ UNSET (LOCAL_GIT_DIRECTORY)
+ IF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
+ IF (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.git)
+ # .git directory can be found on Unix based system, or on Windows with
+ # Git Bash (shipped with msysgit).
+ SET (LOCAL_GIT_DIRECTORY ${CMAKE_SOURCE_DIR}/.git)
+ ELSE(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.git)
+ # .git is a file, this means Ceres is a git submodule of another project
+ # and our .git file contains the path to the git directory which manages
+ # Ceres, so we should add the gerrit hook there.
+ FILE(READ ${CMAKE_SOURCE_DIR}/.git GIT_SUBMODULE_FILE_CONTENTS)
+ # Strip any trailing newline characters, s/t we get a valid path.
+ STRING(REGEX REPLACE "gitdir:[ ]*([^$].*)[\n].*" "${CMAKE_SOURCE_DIR}/\\1"
+ GIT_SUBMODULE_GIT_DIRECTORY_PATH "${GIT_SUBMODULE_FILE_CONTENTS}")
+ GET_FILENAME_COMPONENT(GIT_SUBMODULE_GIT_DIRECTORY_PATH
+ "${GIT_SUBMODULE_GIT_DIRECTORY_PATH}" ABSOLUTE)
+ IF (EXISTS ${GIT_SUBMODULE_GIT_DIRECTORY_PATH}
+ AND IS_DIRECTORY ${GIT_SUBMODULE_GIT_DIRECTORY_PATH})
+ SET(LOCAL_GIT_DIRECTORY "${GIT_SUBMODULE_GIT_DIRECTORY_PATH}")
+ ENDIF()
+ ENDIF()
+ ELSE (EXISTS ${CMAKE_SOURCE_DIR}/.git)
+ # TODO(keir) Add proper Windows support.
+ ENDIF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
+
+ IF (EXISTS ${LOCAL_GIT_DIRECTORY})
+ IF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
+ MESSAGE(STATUS "Detected Ceres being used as a git submodule, adding "
+ "commit hook for Gerrit to: ${LOCAL_GIT_DIRECTORY}")
+ # Download the hook only if it is not already present.
+ FILE(DOWNLOAD https://ceres-solver-review.googlesource.com/tools/hooks/commit-msg
+ ${CMAKE_BINARY_DIR}/commit-msg)
+
+ # Make the downloaded file executable, since it is not by default.
+ FILE(COPY ${CMAKE_BINARY_DIR}/commit-msg
+ DESTINATION ${LOCAL_GIT_DIRECTORY}/hooks/
+ FILE_PERMISSIONS
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_WRITE GROUP_EXECUTE
+ WORLD_READ WORLD_EXECUTE)
+ ENDIF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
+ ENDIF (EXISTS ${LOCAL_GIT_DIRECTORY})
+ENDFUNCTION()