ExternalProject: Add option to perform a shallow Git clone (#15291)
Inspired-by: Ilya Kulakov <kulakov.ilya@gmail.com>
This commit is contained in:
parent
b8a8dfec36
commit
7db9f3f294
|
@ -0,0 +1,5 @@
|
||||||
|
ExternalProject-git-clone-shallow
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
* The :module:`ExternalProject` module leared the ``GIT_SHALLOW 1``
|
||||||
|
option to perform a shallow clone of a Git repository.
|
|
@ -61,6 +61,10 @@ Create custom targets to build projects in external trees
|
||||||
The optional name of the remote, default to ``origin``
|
The optional name of the remote, default to ``origin``
|
||||||
``GIT_SUBMODULES <module>...``
|
``GIT_SUBMODULES <module>...``
|
||||||
Git submodules that shall be updated, all if empty
|
Git submodules that shall be updated, all if empty
|
||||||
|
``GIT_SHALLOW 1``
|
||||||
|
Tell Git to clone with ``--depth 1``. Use when ``GIT_TAG`` is not
|
||||||
|
specified or when it names a branch in order to download only the
|
||||||
|
tip of the branch without the rest of its history.
|
||||||
``HG_REPOSITORY <url>``
|
``HG_REPOSITORY <url>``
|
||||||
URL of mercurial repo
|
URL of mercurial repo
|
||||||
``HG_TAG <tag>``
|
``HG_TAG <tag>``
|
||||||
|
@ -499,7 +503,12 @@ define_property(DIRECTORY PROPERTY "EP_UPDATE_DISCONNECTED" INHERITED
|
||||||
"ExternalProject module."
|
"ExternalProject module."
|
||||||
)
|
)
|
||||||
|
|
||||||
function(_ep_write_gitclone_script script_filename source_dir git_EXECUTABLE git_repository git_tag git_remote_name git_submodules src_name work_dir gitclone_infofile gitclone_stampfile tls_verify)
|
function(_ep_write_gitclone_script script_filename source_dir git_EXECUTABLE git_repository git_tag git_remote_name git_submodules git_shallow src_name work_dir gitclone_infofile gitclone_stampfile tls_verify)
|
||||||
|
if(NOT GIT_VERSION_STRING VERSION_LESS 1.7.10)
|
||||||
|
set(git_clone_shallow_options "--depth 1 --no-single-branch")
|
||||||
|
else()
|
||||||
|
set(git_clone_shallow_options "--depth 1")
|
||||||
|
endif()
|
||||||
file(WRITE ${script_filename}
|
file(WRITE ${script_filename}
|
||||||
"if(\"${git_tag}\" STREQUAL \"\")
|
"if(\"${git_tag}\" STREQUAL \"\")
|
||||||
message(FATAL_ERROR \"Tag for git checkout should not be empty.\")
|
message(FATAL_ERROR \"Tag for git checkout should not be empty.\")
|
||||||
|
@ -533,12 +542,19 @@ if(NOT \"x${tls_verify}\" STREQUAL \"x\" AND NOT tls_verify)
|
||||||
-c http.sslVerify=false)
|
-c http.sslVerify=false)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(git_clone_options)
|
||||||
|
|
||||||
|
set(git_shallow \"${git_shallow}\")
|
||||||
|
if(git_shallow)
|
||||||
|
list(APPEND git_clone_options ${git_clone_shallow_options})
|
||||||
|
endif()
|
||||||
|
|
||||||
# try the clone 3 times incase there is an odd git clone issue
|
# try the clone 3 times incase there is an odd git clone issue
|
||||||
set(error_code 1)
|
set(error_code 1)
|
||||||
set(number_of_tries 0)
|
set(number_of_tries 0)
|
||||||
while(error_code AND number_of_tries LESS 3)
|
while(error_code AND number_of_tries LESS 3)
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND \"${git_EXECUTABLE}\" \${git_options} clone --origin \"${git_remote_name}\" \"${git_repository}\" \"${src_name}\"
|
COMMAND \"${git_EXECUTABLE}\" \${git_options} clone \${git_clone_options} --origin \"${git_remote_name}\" \"${git_repository}\" \"${src_name}\"
|
||||||
WORKING_DIRECTORY \"${work_dir}\"
|
WORKING_DIRECTORY \"${work_dir}\"
|
||||||
RESULT_VARIABLE error_code
|
RESULT_VARIABLE error_code
|
||||||
)
|
)
|
||||||
|
@ -1793,6 +1809,7 @@ function(_ep_add_download_command name)
|
||||||
if("x${tls_verify}" STREQUAL "x" AND DEFINED CMAKE_TLS_VERIFY)
|
if("x${tls_verify}" STREQUAL "x" AND DEFINED CMAKE_TLS_VERIFY)
|
||||||
set(tls_verify "${CMAKE_TLS_VERIFY}")
|
set(tls_verify "${CMAKE_TLS_VERIFY}")
|
||||||
endif()
|
endif()
|
||||||
|
get_property(git_shallow TARGET ${name} PROPERTY _EP_GIT_SHALLOW)
|
||||||
|
|
||||||
# For the download step, and the git clone operation, only the repository
|
# For the download step, and the git clone operation, only the repository
|
||||||
# should be recorded in a configured RepositoryInfo file. If the repo
|
# should be recorded in a configured RepositoryInfo file. If the repo
|
||||||
|
@ -1817,7 +1834,7 @@ function(_ep_add_download_command name)
|
||||||
# The script will delete the source directory and then call git clone.
|
# The script will delete the source directory and then call git clone.
|
||||||
#
|
#
|
||||||
_ep_write_gitclone_script(${tmp_dir}/${name}-gitclone.cmake ${source_dir}
|
_ep_write_gitclone_script(${tmp_dir}/${name}-gitclone.cmake ${source_dir}
|
||||||
${GIT_EXECUTABLE} ${git_repository} ${git_tag} ${git_remote_name} "${git_submodules}" ${src_name} ${work_dir}
|
${GIT_EXECUTABLE} ${git_repository} ${git_tag} ${git_remote_name} "${git_submodules}" "${git_shallow}" ${src_name} ${work_dir}
|
||||||
${stamp_dir}/${name}-gitinfo.txt ${stamp_dir}/${name}-gitclone-lastrun.txt "${tls_verify}"
|
${stamp_dir}/${name}-gitinfo.txt ${stamp_dir}/${name}-gitclone-lastrun.txt "${tls_verify}"
|
||||||
)
|
)
|
||||||
set(comment "Performing download step (git clone) for '${name}'")
|
set(comment "Performing download step (git clone) for '${name}'")
|
||||||
|
|
|
@ -349,6 +349,20 @@ if(do_git_tests)
|
||||||
)
|
)
|
||||||
set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
|
set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
|
||||||
|
|
||||||
|
# Live git / master (no GIT_TAG), but shallow
|
||||||
|
#
|
||||||
|
set(proj TutorialStep1-GIT-shallow-master)
|
||||||
|
ExternalProject_Add(${proj}
|
||||||
|
GIT_REPOSITORY "${local_git_repo}"
|
||||||
|
GIT_SHALLOW 1
|
||||||
|
CMAKE_GENERATOR "${CMAKE_GENERATOR}"
|
||||||
|
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
DEPENDS "SetupLocalGITRepository"
|
||||||
|
LOG_UPDATE 1
|
||||||
|
)
|
||||||
|
set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
|
||||||
|
|
||||||
# git by explicit branch/tag with empty submodule list
|
# git by explicit branch/tag with empty submodule list
|
||||||
#
|
#
|
||||||
set(proj TutorialStep1-GIT-bytag-withsubmodules)
|
set(proj TutorialStep1-GIT-bytag-withsubmodules)
|
||||||
|
@ -543,6 +557,9 @@ if(do_git_tests)
|
||||||
add_test(TutorialStep1-GIT-bytag
|
add_test(TutorialStep1-GIT-bytag
|
||||||
"${binary_base}/TutorialStep1-GIT-bytag/Tutorial" 99)
|
"${binary_base}/TutorialStep1-GIT-bytag/Tutorial" 99)
|
||||||
|
|
||||||
|
add_test(TutorialStep1-GIT-shallow-master
|
||||||
|
"${binary_base}/TutorialStep1-GIT-shallow-master/Tutorial" 98)
|
||||||
|
|
||||||
add_test(TutorialStep1-GIT-master
|
add_test(TutorialStep1-GIT-master
|
||||||
"${binary_base}/TutorialStep1-GIT-master/Tutorial" 98)
|
"${binary_base}/TutorialStep1-GIT-master/Tutorial" 98)
|
||||||
endif()
|
endif()
|
||||||
|
|
Loading…
Reference in New Issue