mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-12-16 15:29:08 +08:00
347 lines
11 KiB
CMake
347 lines
11 KiB
CMake
set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
|
|
|
|
set(git_test_repo "${CURRENT_BUILDTREES_DIR}/test-git-repo")
|
|
file(REMOVE_RECURSE "${git_test_repo}")
|
|
|
|
# LFS expects a URL for a local repository
|
|
set(git_remote "file:///${git_test_repo}")
|
|
|
|
vcpkg_find_acquire_program(GIT)
|
|
vcpkg_list(SET git_config
|
|
-c core.autocrlf=false
|
|
-c user.email=vcpkg@example.com
|
|
-c user.name=vcpkg
|
|
)
|
|
|
|
vcpkg_list(SET git ${GIT} ${git_config})
|
|
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} init "test-git-repo"
|
|
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
|
|
LOGNAME "git-init"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} config uploadpack.allowReachableSHA1InWant true
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-config"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} checkout -b main
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-new-branch"
|
|
)
|
|
|
|
file(WRITE "${git_test_repo}/README.txt" "first commit")
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} add "README.txt"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-add.1"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} commit -m "first commit"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-commit.1"
|
|
)
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND ${git} rev-parse HEAD
|
|
OUTPUT_VARIABLE ref
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT "${error_code}" EQUAL "0")
|
|
message(FATAL_ERROR "Failed to rev-parse HEAD: ${error_code}")
|
|
endif()
|
|
string(STRIP "${ref}" ref)
|
|
|
|
file(WRITE "${git_test_repo}/README.txt" "second commit")
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} add "README.txt"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-add.2"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} commit -m "second commit"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-commit.2"
|
|
)
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND ${git} rev-parse HEAD
|
|
OUTPUT_VARIABLE head_ref
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT "${error_code}" EQUAL "0")
|
|
message(FATAL_ERROR "Failed to rev-parse HEAD: ${error_code}")
|
|
endif()
|
|
string(STRIP "${head_ref}" head_ref)
|
|
|
|
# test regular mode
|
|
set(VCPKG_USE_HEAD_VERSION OFF)
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH source_path
|
|
URL "${git_remote}"
|
|
REF "${ref}"
|
|
HEAD_REF main
|
|
)
|
|
file(READ "${source_path}/README.txt" contents)
|
|
if(NOT "${contents}" STREQUAL "first commit")
|
|
message(FATAL_ERROR "Failed to checkout the first commit. Contents were:
|
|
${contents}
|
|
")
|
|
endif()
|
|
|
|
# test regular mode with FETCH_REF
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} config uploadpack.allowReachableSHA1InWant false
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-config"
|
|
)
|
|
set(VCPKG_USE_HEAD_VERSION OFF)
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH source_path
|
|
URL "${git_remote}"
|
|
REF "${ref}"
|
|
FETCH_REF main
|
|
HEAD_REF main
|
|
)
|
|
file(READ "${source_path}/README.txt" contents)
|
|
if(NOT "${contents}" STREQUAL "first commit")
|
|
message(FATAL_ERROR "Failed to checkout the first commit. Contents were:
|
|
${contents}
|
|
")
|
|
endif()
|
|
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} config uploadpack.allowReachableSHA1InWant true
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-config"
|
|
)
|
|
|
|
# test head mode
|
|
set(VCPKG_USE_HEAD_VERSION ON)
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH source_path
|
|
URL "${git_remote}"
|
|
REF "${ref}"
|
|
HEAD_REF main
|
|
)
|
|
file(READ "${source_path}/README.txt" contents)
|
|
if(NOT "${contents}" STREQUAL "second commit")
|
|
message(FATAL_ERROR "Failed to checkout the HEAD commit. Contents were:
|
|
${contents}
|
|
")
|
|
endif()
|
|
if(NOT "${VCPKG_HEAD_VERSION}" STREQUAL "${head_ref}")
|
|
message(FATAL_ERROR "Failed to checkout the right HEAD commit.
|
|
Expected: ${head_ref}
|
|
Actual : ${VCPKG_HEAD_VERSION}
|
|
")
|
|
endif()
|
|
|
|
# test head mode + no HEAD_REF -> just uses REF
|
|
set(VCPKG_USE_HEAD_VERSION ON)
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH source_path
|
|
URL "${git_remote}"
|
|
REF "${ref}"
|
|
)
|
|
file(READ "${source_path}/README.txt" contents)
|
|
if(NOT "${contents}" STREQUAL "first commit")
|
|
message(FATAL_ERROR "Failed to checkout the regular commit. Contents were:
|
|
${contents}
|
|
")
|
|
endif()
|
|
|
|
# test new head ref
|
|
file(WRITE "${git_test_repo}/README.txt" "third commit")
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} add "README.txt"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git.7"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} commit -m "second commit"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git.8"
|
|
)
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND ${git} rev-parse HEAD
|
|
OUTPUT_VARIABLE new_head_ref
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT "${error_code}" EQUAL "0")
|
|
message(FATAL_ERROR "Failed to rev-parse HEAD: ${error_code}")
|
|
endif()
|
|
string(STRIP "${new_head_ref}" new_head_ref)
|
|
|
|
set(VCPKG_USE_HEAD_VERSION ON)
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH source_path
|
|
URL "${git_remote}"
|
|
REF "${ref}"
|
|
HEAD_REF main
|
|
)
|
|
file(READ "${source_path}/README.txt" contents)
|
|
if(NOT "${contents}" STREQUAL "third commit")
|
|
message(FATAL_ERROR "Failed to checkout the right HEAD commit. Contents were:
|
|
${contents}
|
|
")
|
|
endif()
|
|
if(NOT "${VCPKG_HEAD_VERSION}" STREQUAL "${new_head_ref}")
|
|
message(FATAL_ERROR "Failed to checkout the right HEAD commit.
|
|
Expected: ${new_head_ref}
|
|
Actual : ${VCPKG_HEAD_VERSION}
|
|
")
|
|
endif()
|
|
|
|
# test LFS support
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND "${GIT}" lfs --version
|
|
OUTPUT_VARIABLE lfs_version_output
|
|
ERROR_VARIABLE lfs_version_error
|
|
RESULT_VARIABLE lfs_version_result
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT lfs_version_result)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} lfs install --local
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-lfs-install"
|
|
)
|
|
file(WRITE "${git_test_repo}/.gitattributes" "* text=auto\n*.bin filter=lfs diff=lfs merge=lfs -text\n")
|
|
|
|
# test fetching with the same Git and LFS urls
|
|
file(WRITE "${git_test_repo}/lfs_file.bin" "fourth commit")
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} add ".gitattributes" "lfs_file.bin"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-lfs-add"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} commit -m "fourth commit"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-lfs-commit"
|
|
)
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND ${git} rev-parse HEAD
|
|
OUTPUT_VARIABLE ref
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT "${error_code}" EQUAL "0")
|
|
message(FATAL_ERROR "Failed to rev-parse HEAD: ${error_code}")
|
|
endif()
|
|
string(STRIP "${ref}" ref)
|
|
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND ${git} lfs ls-files --name-only
|
|
OUTPUT_VARIABLE lfs_files
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT "${error_code}" EQUAL "0")
|
|
message(FATAL_ERROR "Failed lfs ls-files: ${error_code}")
|
|
endif()
|
|
string(STRIP "${lfs_files}" lfs_files)
|
|
if(NOT "${lfs_files}" MATCHES [[lfs_file\.bin]])
|
|
message(FATAL_ERROR "File was not added to LFS")
|
|
endif()
|
|
|
|
set(VCPKG_USE_HEAD_VERSION OFF)
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH source_path
|
|
URL "${git_remote}"
|
|
REF "${ref}"
|
|
HEAD_REF main
|
|
LFS
|
|
)
|
|
file(READ "${source_path}/lfs_file.bin" contents)
|
|
if(NOT "${contents}" STREQUAL "fourth commit")
|
|
message(FATAL_ERROR "Failed to checkout the fourth commit. Contents were:
|
|
${contents}
|
|
")
|
|
endif()
|
|
|
|
# test fetching from different Git and LFS urls
|
|
# requires LFS 3.0.0 or later for "--force" on prune
|
|
string(REGEX MATCH "git-lfs/([0-9\\.]+) " lfs_version "${lfs_version_output}")
|
|
set(lfs_version "${CMAKE_MATCH_1}")
|
|
if(lfs_version VERSION_GREATER_EQUAL "3.0.0")
|
|
file(WRITE "${git_test_repo}/lfs_file2.bin" "fifth commit")
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} add "lfs_file2.bin"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-lfs-add.2"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} commit -m "fifth commit"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-lfs-commit.2"
|
|
)
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND ${git} rev-parse HEAD
|
|
OUTPUT_VARIABLE ref
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT "${error_code}" EQUAL "0")
|
|
message(FATAL_ERROR "Failed to rev-parse HEAD: ${error_code}")
|
|
endif()
|
|
string(STRIP "${ref}" ref)
|
|
|
|
set(git_test_repo_2 "${CURRENT_BUILDTREES_DIR}/test-git-repo-2")
|
|
file(REMOVE_RECURSE "${git_test_repo_2}")
|
|
set(git_remote_2 "file:///${git_test_repo_2}")
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} init --bare "test-git-repo-2"
|
|
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
|
|
LOGNAME "git-init.2"
|
|
)
|
|
# note: LFS won't prune "unpushed" files, which is checked using the "origin" remote by default.
|
|
# If there is no remote then files are never considered to be "pushed", and so are never pruned.
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} remote add origin "${git_remote_2}"
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-remote-add"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
COMMAND ${git} push --all origin
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
LOGNAME "git-push"
|
|
)
|
|
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND ${git} lfs prune --force --verbose
|
|
OUTPUT_VARIABLE lfs_prune
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${git_test_repo}"
|
|
)
|
|
if(NOT "${error_code}" EQUAL "0")
|
|
message(FATAL_ERROR "Failed to prune LFS files: ${error_code}")
|
|
endif()
|
|
if(NOT "${lfs_prune}" MATCHES "0 retained")
|
|
message(FATAL_ERROR "LFS prune did not delete all files:\n${lfs_prune}")
|
|
endif()
|
|
|
|
set(VCPKG_USE_HEAD_VERSION OFF)
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH source_path
|
|
URL "${git_remote}"
|
|
REF "${ref}"
|
|
HEAD_REF main
|
|
LFS "${git_remote_2}"
|
|
)
|
|
file(READ "${source_path}/lfs_file2.bin" contents)
|
|
if(NOT "${contents}" STREQUAL "fifth commit")
|
|
message(FATAL_ERROR "Failed to checkout the fifth commit. Contents were:
|
|
${contents}
|
|
")
|
|
endif()
|
|
else()
|
|
message(NOTICE "Git LFS version is older than 3.0.0: some tests were skipped")
|
|
endif()
|
|
else()
|
|
message(NOTICE "Git LFS is not available: some tests were skipped")
|
|
endif()
|