mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-18 07:07:47 -05:00
Detecting when the cache is dirty (#284)
* Check that the cache working directory is clean * cpm_check_working_dir_is_clean for non git repo will not terminate cmake * sileneced check for git repo, in case of error * style(CPM.cmake): fixed indentation for ERROR_QUIET * refactor(CPM.cmake): added logic to handle a cache folder inside a (not correlated) git repo this is accomplished by checking if we are in the directory where .git lives * style(CPM.cmake): stray tab to spaces * test(dirty-cache-check): added unit test to check cpm_check_working_dir_is_clean the test creates a file in a folder and then uses git to create a repo in that folder, to check various conditions * Update test/unit/dirty-cache-check.cmake added user.name and user.email to comply with test machine where git is not completely configured Co-authored-by: Lars Melchior <TheLartians@users.noreply.github.com> * feat(cpm_check_working_dir_is_clean): now it takes a git tag (works with hashes too) to check for uncommitted and commited changes * refactor(cpm_check_working_dir_is_clean): early return for the most common case of uncommited changes in a repo * refactor(cpm_check_git_working_dir_is_clean): removed edgecase detection (a non-git folder in an unrelated git repo) now the contract is that com_check_git_working_dir_is_clean is given the base folder of a git repo Co-authored-by: Andrew Gribble <ag131012@renishaw.com> Co-authored-by: Lars Melchior <TheLartians@users.noreply.github.com>
This commit is contained in:
@@ -354,6 +354,68 @@ function(cpm_parse_add_package_single_arg arg outArgs)
|
||||
)
|
||||
endfunction()
|
||||
|
||||
# Check that the working directory for a git repo is clean
|
||||
function(cpm_check_git_working_dir_is_clean repoPath gitTag isClean)
|
||||
|
||||
find_package(Git REQUIRED)
|
||||
|
||||
if(NOT GIT_EXECUTABLE)
|
||||
# No git executable, assume directory is clean
|
||||
set(${isClean}
|
||||
TRUE
|
||||
PARENT_SCOPE
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
|
||||
# check for uncommited changes
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} status --porcelain
|
||||
RESULT_VARIABLE resultGitStatus
|
||||
OUTPUT_VARIABLE repoStatus
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET
|
||||
WORKING_DIRECTORY ${repoPath}
|
||||
)
|
||||
if(resultGitStatus)
|
||||
# not supposed to happen, assume clean anyway
|
||||
message(WARNING "Calling git status on folder ${repoPath} failed")
|
||||
set(${isClean}
|
||||
TRUE
|
||||
PARENT_SCOPE
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(NOT "${repoStatus}" STREQUAL "")
|
||||
set(${isClean}
|
||||
FALSE
|
||||
PARENT_SCOPE
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
|
||||
# check for commited changes
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} diff -s --exit-code ${gitTag}
|
||||
RESULT_VARIABLE resultGitDiff
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_QUIET
|
||||
WORKING_DIRECTORY ${repoPath}
|
||||
)
|
||||
|
||||
if(${resultGitDiff} EQUAL 0)
|
||||
set(${isClean}
|
||||
TRUE
|
||||
PARENT_SCOPE
|
||||
)
|
||||
else()
|
||||
set(${isClean}
|
||||
FALSE
|
||||
PARENT_SCOPE
|
||||
)
|
||||
endif()
|
||||
|
||||
endfunction()
|
||||
|
||||
# Download and add a package from source
|
||||
function(CPMAddPackage)
|
||||
list(LENGTH ARGN argnLength)
|
||||
@@ -544,6 +606,15 @@ function(CPMAddPackage)
|
||||
set(${CPM_ARGS_NAME}_BINARY_DIR ${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-build)
|
||||
set(${CPM_ARGS_NAME}_ADDED YES)
|
||||
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
||||
|
||||
if(DEFINED CPM_ARGS_GIT_TAG)
|
||||
# warn if cache has been changed since checkout
|
||||
cpm_check_git_working_dir_is_clean(${download_directory} ${CPM_ARGS_GIT_TAG} IS_CLEAN)
|
||||
if(NOT ${IS_CLEAN})
|
||||
message(WARNING "Cache for ${CPM_ARGS_NAME} (${download_directory}) is dirty")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
cpm_add_subdirectory(
|
||||
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
||||
"${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}"
|
||||
|
||||
Reference in New Issue
Block a user