mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-20 13:17:53 -05:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f552da96bd |
@@ -354,6 +354,68 @@ function(cpm_parse_add_package_single_arg arg outArgs)
|
|||||||
)
|
)
|
||||||
endfunction()
|
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
|
# Download and add a package from source
|
||||||
function(CPMAddPackage)
|
function(CPMAddPackage)
|
||||||
list(LENGTH ARGN argnLength)
|
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}_BINARY_DIR ${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-build)
|
||||||
set(${CPM_ARGS_NAME}_ADDED YES)
|
set(${CPM_ARGS_NAME}_ADDED YES)
|
||||||
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
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_add_subdirectory(
|
||||||
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
||||||
"${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}"
|
"${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}"
|
||||||
|
|||||||
49
test/unit/dirty-cache-check.cmake
Normal file
49
test/unit/dirty-cache-check.cmake
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
set(baseDir "${CMAKE_CURRENT_BINARY_DIR}/test_dirty_cache")
|
||||||
|
|
||||||
|
find_package(Git REQUIRED)
|
||||||
|
|
||||||
|
function(git_do dir)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} -c user.name='User' -c user.email='user@email.org' ${ARGN}
|
||||||
|
RESULT_VARIABLE result
|
||||||
|
OUTPUT_VARIABLE status
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY "${dir}"
|
||||||
|
)
|
||||||
|
if(result)
|
||||||
|
message(FATAL_ERROR "git ${ARGN} fail: ${result} ${status}")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
file(MAKE_DIRECTORY "${baseDir}")
|
||||||
|
|
||||||
|
file(WRITE "${baseDir}/draft.txt" "this is a test")
|
||||||
|
|
||||||
|
git_do("${baseDir}" init -b main)
|
||||||
|
git_do("${baseDir}" commit --allow-empty -m "empty repo")
|
||||||
|
message(STATUS "empty repo with file")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} HEAD emptygit_test)
|
||||||
|
assert_falsy(emptygit_test)
|
||||||
|
|
||||||
|
git_do("${baseDir}" add draft.txt)
|
||||||
|
git_do("${baseDir}" commit -m "test change")
|
||||||
|
git_do("${baseDir}" tag v0.0.0)
|
||||||
|
message(STATUS "commit a change")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} v0.0.0 onecommit_test)
|
||||||
|
assert_truthy(onecommit_test)
|
||||||
|
|
||||||
|
file(WRITE "${baseDir}/draft.txt" "a modification")
|
||||||
|
message(STATUS "dirty repo")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} v0.0.0 nonemptygit_test)
|
||||||
|
assert_falsy(nonemptygit_test)
|
||||||
|
|
||||||
|
git_do("${baseDir}" add draft.txt)
|
||||||
|
git_do("${baseDir}" commit -m "another change")
|
||||||
|
message(STATUS "repo clean")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} v0.0.0 twocommit_test)
|
||||||
|
assert_falsy(twocommit_test)
|
||||||
|
|
||||||
|
file(REMOVE_RECURSE "${baseDir}")
|
||||||
Reference in New Issue
Block a user