forked from TriBITSPub/TriBITS
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Factor out functions into TribitsGitRepoVersionInfo.cmake (TriBITSPub…
…#483) We need to be breaking up TribitsGlobalMacros.cmake because it is too long. I also added a new function to get just the 40-char SHA1 and I added unit tests for it.
- Loading branch information
1 parent
b383ed2
commit 11c8d2d
Showing
4 changed files
with
241 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
187 changes: 187 additions & 0 deletions
187
tribits/core/package_arch/TribitsGitRepoVersionInfo.cmake
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,187 @@ | ||
# @HEADER | ||
# ************************************************************************ | ||
# | ||
# TriBITS: Tribal Build, Integrate, and Test System | ||
# Copyright 2013 Sandia Corporation | ||
# | ||
# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, | ||
# the U.S. Government retains certain rights in this software. | ||
# | ||
# Redistribution and use in source and binary forms, with or without | ||
# modification, are permitted provided that the following conditions are | ||
# met: | ||
# | ||
# 1. Redistributions of source code must retain the above copyright | ||
# notice, this list of conditions and the following disclaimer. | ||
# | ||
# 2. 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. | ||
# | ||
# 3. Neither the name of the Corporation nor the names of the | ||
# contributors may be used to endorse or promote products derived from | ||
# this software without specific prior written permission. | ||
# | ||
# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE | ||
# 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. | ||
# | ||
# ************************************************************************ | ||
# @HEADER | ||
|
||
################################################################################ | ||
# | ||
# Module containing functions for getting Git repo information | ||
# | ||
################################################################################ | ||
|
||
|
||
# @FUNCTION: tribits_git_repo_sha1() | ||
# | ||
# Get the Git repo version SHA1. | ||
# | ||
# Usage:: | ||
# | ||
# tribits_git_repo_sha1(<gitRepoDir> <gitRepoSha1Out> | ||
# FAILURE_MESSAGE_OUT <failureMsgOut>) | ||
# | ||
# If ``<failureMsgOut>`` is non-empty on input, then the variable | ||
# ``<failureMsgOut>`` will be set to a non-empty value on output with the | ||
# error message if an error occurs and the SHA1 for ``<gitRepoDir>`` can not | ||
# be computed. If ``<failureMsgOut>`` is empty in input, and there is an | ||
# error, a ``FATAL_ERROR`` will be raised. | ||
# | ||
# NOTE: To get the SHA1 for the Git repo ``<gitRepoDir>``, it must contain the | ||
# ``.git/`` directory and the ``git`` executable var ``GIT_EXECUTABLE`` must | ||
# be set. Otherwise, it is an error. | ||
# | ||
function(tribits_git_repo_sha1 gitRepoDir gitRepoSha1Out) | ||
|
||
cmake_parse_arguments( PARSE_ARGV 2 | ||
PARSE "" "" # prefix, options, one_value_keywords | ||
"FAILURE_MESSAGE_OUT" # multi_value_keywords | ||
) | ||
tribits_check_for_unparsed_arguments() | ||
tribits_assert_parse_arg_zero_or_one_value(PARSE FAILURE_MESSAGE_OUT) | ||
|
||
set(failureMsg "") | ||
|
||
if (NOT GIT_EXECUTABLE) | ||
set(failureMsg "ERROR: The program '${GIT_NAME}' could not be found!") | ||
elseif (NOT IS_DIRECTORY "${gitRepoDir}/.git") | ||
set(failureMsg "ERROR: The directory ${gitRepoDir}/.git does not exist!") | ||
endif() | ||
|
||
set(gitRepoSha1 "") | ||
if (failureMsg STREQUAL "") | ||
execute_process( | ||
COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:"%H" | ||
WORKING_DIRECTORY ${gitRepoDir} | ||
RESULT_VARIABLE gitCmndRtn OUTPUT_VARIABLE gitCmndOutput | ||
) | ||
# NOTE: Above we have to add quotes '"' or CMake will not accept the | ||
# command. However, git will put those quotes in the output so we have to | ||
# strip them out below! | ||
|
||
if (NOT gitCmndRtn STREQUAL 0) | ||
set(failureMsg "ERROR: ${GIT_EXECUTABLE} command returned ${gitCmndRtn}!=0 for repo ${gitRepoDir}!") | ||
else() | ||
# Strip the quotes off :-( | ||
string(LENGTH "${gitCmndOutput}" gitCmndOutputLen) | ||
math(EXPR outputNumCharsToKeep "${gitCmndOutputLen}-2") | ||
string(SUBSTRING "${gitCmndOutput}" 1 ${outputNumCharsToKeep} gitRepoSha1) | ||
endif() | ||
endif() | ||
# ToDo: Factor above out into its own function! | ||
|
||
if (NOT failureMsg STREQUAL "" AND PARSE_FAILURE_MESSAGE_OUT STREQUAL "") | ||
message(FATAL_ERROR "${failureMsg}") | ||
elseif (PARSE_FAILURE_MESSAGE_OUT) | ||
set(${PARSE_FAILURE_MESSAGE_OUT} "${failureMsg}" PARENT_SCOPE) | ||
endif() | ||
set(${gitRepoSha1Out} "${gitRepoSha1}" PARENT_SCOPE) | ||
|
||
endfunction() | ||
|
||
|
||
# Run the git log command to get the version info for a git repo | ||
# | ||
function(tribits_generate_single_repo_version_string gitRepoDir | ||
repoVersionStringOut | ||
) | ||
|
||
tribits_assert_git_executable() | ||
|
||
# A) Get the basic version info. | ||
|
||
execute_process( | ||
COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:"%h [%ad] <%ae>" | ||
WORKING_DIRECTORY ${gitRepoDir} | ||
RESULT_VARIABLE gitCmndRtn | ||
OUTPUT_VARIABLE gitCmndOutput | ||
) | ||
# NOTE: Above we have to add quotes '"' or CMake will not accept the | ||
# command. However, git will put those quotes in the output so we have to | ||
# strip them out later :-( | ||
|
||
if (NOT gitCmndRtn STREQUAL 0) | ||
message(FATAL_ERROR "ERROR, ${GIT_EXECUTABLE} command returned ${gitCmndRtn}!=0" | ||
" for repo ${gitRepoDir}!") | ||
set(gitVersionLine "Error, could not get version info!") | ||
else() | ||
# Strip the quotes off :-( | ||
string(LENGTH "${gitCmndOutput}" gitCmndOutputLen) | ||
math(EXPR outputNumCharsToKeep "${gitCmndOutputLen}-2") | ||
string(SUBSTRING "${gitCmndOutput}" 1 ${outputNumCharsToKeep} | ||
gitVersionLine) | ||
endif() | ||
|
||
# B) Get the first 80 chars of the summary message for more info | ||
|
||
execute_process( | ||
COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:"%s" | ||
WORKING_DIRECTORY ${gitRepoDir} | ||
RESULT_VARIABLE gitCmndRtn | ||
OUTPUT_VARIABLE gitCmndOutput | ||
) | ||
|
||
if (NOT gitCmndRtn STREQUAL 0) | ||
message(FATAL_ERROR "ERROR, ${GIT_EXECUTABLE} command returned ${gitCmndRtn}!=0" | ||
" for extra repo ${gitRepoDir}!") | ||
set(gitSummaryStr "Error, could not get version summary!") | ||
else() | ||
# Strip off quotes and quote the 80 char string | ||
set(maxSummaryLen 80) | ||
math(EXPR maxSummaryLen_PLUS_2 "${maxSummaryLen}+2") | ||
string(LENGTH "${gitCmndOutput}" gitCmndOutputLen) | ||
math(EXPR outputNumCharsToKeep "${gitCmndOutputLen}-2") | ||
string(SUBSTRING "${gitCmndOutput}" 1 ${outputNumCharsToKeep} | ||
gitCmndOutputStripped) | ||
if (gitCmndOutputLen GREATER ${maxSummaryLen_PLUS_2}) | ||
string(SUBSTRING "${gitCmndOutputStripped}" 0 ${maxSummaryLen} | ||
gitSummaryStr) | ||
else() | ||
set(gitSummaryStr "${gitCmndOutputStripped}") | ||
endif() | ||
endif() | ||
|
||
set(${repoVersionStringOut} | ||
"${gitVersionLine}\n${gitSummaryStr}" PARENT_SCOPE) | ||
|
||
endfunction() | ||
|
||
|
||
function(tribits_assert_git_executable) | ||
if (NOT GIT_EXECUTABLE) | ||
message(SEND_ERROR "ERROR, the program '${GIT_NAME}' could not be found!" | ||
" We can not generate the repo version file!") | ||
endif() | ||
endfunction() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters