ExternalData: Do not re-stage staged object files
The ExternalData_LINK_CONTENT option tells ExternalData to convert real data files it finds into content links and to "stage" the original content in a ".ExternalData_<algo>_<hash>" file. However, after a data object has been staged it is possible that a user-provided pattern in the "REGEX:" option will later match the staged object file. We must not process staged object files even when a user pattern matches them. Fix the implementation to not match a staged object file as a normal data file for conversion. Extend the RunCMake.ExternalData test to cover this case.
This commit is contained in:
parent
5dd8c01429
commit
c35961b010
|
@ -551,7 +551,10 @@ function(_ExternalData_arg_find_files pattern regex)
|
|||
set(relname "${entry}")
|
||||
set(alg "")
|
||||
endif()
|
||||
if("x${relname}" MATCHES "^x${regex}$" AND NOT IS_DIRECTORY "${top_src}/${entry}")
|
||||
if("x${relname}" MATCHES "^x${regex}$" # matches
|
||||
AND NOT IS_DIRECTORY "${top_src}/${entry}" # not a directory
|
||||
AND NOT "x${relname}" MATCHES "(^x|/)\\.ExternalData_" # not staged obj
|
||||
)
|
||||
set(name "${top_src}/${relname}")
|
||||
set(file "${top_bin}/${relname}")
|
||||
if(alg)
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
-- Linked Dir/ToLink.txt.md5 to ExternalData MD5/c18ff9804c8deec9eaeb17063cda8b7b
|
||||
-- Raw data correctly transformed to content link!
|
||||
-- Staged content exists!
|
||||
-- Staged content is correct!
|
||||
-- Staged content was correctly not re-staged!
|
|
@ -0,0 +1,37 @@
|
|||
include(ExternalData)
|
||||
set(ExternalData_LINK_CONTENT MD5)
|
||||
set(ExternalData_SOURCE_ROOT ${CMAKE_CURRENT_BINARY_DIR})
|
||||
set(ExternalData_BINARY_ROOT ${CMAKE_CURRENT_BINARY_DIR}/ExternalData)
|
||||
set(input ${CMAKE_CURRENT_BINARY_DIR}/Dir)
|
||||
set(output ${CMAKE_CURRENT_BINARY_DIR}/ExternalData/Dir)
|
||||
set(staged "${input}/.ExternalData_MD5_c18ff9804c8deec9eaeb17063cda8b7b")
|
||||
set(content "To be transformed into a content link.")
|
||||
file(REMOVE ${staged})
|
||||
file(REMOVE_RECURSE ${input})
|
||||
file(WRITE ${input}/ToLink.txt "${content}")
|
||||
ExternalData_Expand_Arguments(Data args "DATA{${input}/,REGEX:.*}")
|
||||
if("x${args}" STREQUAL "x${output}")
|
||||
message(STATUS "Raw data correctly transformed to content link!")
|
||||
else()
|
||||
message(FATAL_ERROR "Data reference transformed to:\n ${args}\n"
|
||||
"but we expected:\n ${output}")
|
||||
endif()
|
||||
if(EXISTS "${staged}")
|
||||
message(STATUS "Staged content exists!")
|
||||
else()
|
||||
message(FATAL_ERROR "Staged content missing!")
|
||||
endif()
|
||||
|
||||
# Expand again to check whether staged content is ignored.
|
||||
ExternalData_Expand_Arguments(Data args "DATA{${input}/,REGEX:.*}")
|
||||
file(STRINGS "${staged}" staged_content LIMIT_INPUT 1024)
|
||||
if("${content}" STREQUAL "${staged_content}")
|
||||
message(STATUS "Staged content is correct!")
|
||||
else()
|
||||
message(STATUS "Staged content is incorrect!")
|
||||
endif()
|
||||
if(EXISTS "${staged}.md5")
|
||||
message(FATAL_ERROR "Staged content was incorrectly re-staged!")
|
||||
else()
|
||||
message(STATUS "Staged content was correctly not re-staged!")
|
||||
endif()
|
|
@ -13,6 +13,7 @@ run_cmake(Directory4)
|
|||
run_cmake(Directory5)
|
||||
run_cmake(LinkContentMD5)
|
||||
run_cmake(LinkContentSHA1)
|
||||
run_cmake(LinkDirectory1)
|
||||
run_cmake(MissingData)
|
||||
run_cmake(NoLinkInSource)
|
||||
run_cmake(NoURLTemplates)
|
||||
|
|
Loading…
Reference in New Issue