#!/usr/bin/env bash set -e set -x readonly tmpdir="$(mktemp -d)" trap "rm -rf '$tmpdir'" EXIT readonly outdir="${BASH_SOURCE%/*}" readonly defaultBranch='master' export GIT_AUTHOR_NAME='testauthor' export GIT_AUTHOR_EMAIL='testauthor@cmake.org' export GIT_COMMITTER_NAME='testauthor' export GIT_COMMITTER_EMAIL='testauthor@cmake.org' ( cd "$tmpdir" git --bare init -b "$defaultBranch" gitrepo.git rm -f gitrepo.git/hooks/*.sample mkdir gitrepo cd gitrepo git init -b "$defaultBranch" echo 'cmake_minimum_required(VERSION 3.19) project(Example NONE) add_custom_target(example ALL COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/example.cmake.in example.cmake )' >CMakeLists.txt echo 'message(STATUS example)' >example.cmake.in git add CMakeLists.txt example.cmake.in git commit -m "Initial import into repo." git push ../gitrepo.git "$defaultBranch" cd ../gitrepo.git git gc --prune cd .. ln -s gitrepo.git GIT git --bare init -b "$defaultBranch" gitrepo-sub.git rm -f gitrepo-sub.git/hooks/*.sample mkdir gitrepo-sub cd gitrepo-sub git init -b "$defaultBranch" echo 'cmake_minimum_required(VERSION 3.19) project(ExampleWithSub NONE) file(STRINGS "${CMAKE_SOURCE_DIR}/.git/config" git_config_strings REGEX "^\\[submodule") foreach(submodule m1 m2) option(WITH_${submodule} "Enable ${submodule}" OFF) set(${submodule}_INITED FALSE) set(${submodule}_UPDATED FALSE) foreach(s ${git_config_strings}) if("${s}" MATCHES "${submodule}") set(${submodule}_INITED TRUE) endif() endforeach() if(EXISTS "${CMAKE_SOURCE_DIR}/m/${submodule}/CMakeLists.txt") set(${submodule}_UPDATED TRUE) endif() if(WITH_${submodule}) if(NOT ${submodule}_INITED) message(FATAL_ERROR "${submodule} not inited") elseif(NOT ${submodule}_UPDATED) message(FATAL_ERROR "${submodule} not updated") endif() else() if(${submodule}_INITED) message(FATAL_ERROR "${submodule} inited") elseif(${submodule}_UPDATED) message(FATAL_ERROR "${submodule} updated") endif() endif() endforeach()' >CMakeLists.txt git add CMakeLists.txt git submodule add -- ../GIT m/m1 git submodule add -- ../GIT m/m2 git submodule add -- ../GIT m/m3 git commit -m "Initial import into repo." git push ../gitrepo-sub.git "$defaultBranch" cd ../gitrepo-sub.git git gc --prune cd .. ln -s gitrepo-sub.git GIT-with-submodules git --bare init -b "$defaultBranch" gitrepo-sub-rec.git rm -f gitrepo-sub-rec.git/hooks/*.sample mkdir gitrepo-sub-rec cd gitrepo-sub-rec git init -b "$defaultBranch" echo 'cmake_minimum_required(VERSION 3.19) project(ExampleWithRecSub NONE) set(top_submodule_dir "${CMAKE_SOURCE_DIR}/submodule") if(NOT EXISTS "${top_submodule_dir}/CMakeLists.txt") message(FATAL_ERROR "Top submodule not updated") endif() option(WITH_RECURSIVE "Submodules are updated recursively" ON) foreach(submodule m1 m2 m3) set(${submodule}_UPDATED FALSE) if(EXISTS "${top_submodule_dir}/m/${submodule}/CMakeLists.txt") set(${submodule}_UPDATED TRUE) endif() if(WITH_RECURSIVE) if(NOT ${submodule}_UPDATED) message(FATAL_ERROR "${submodule} not updated") endif() else() if(${submodule}_UPDATED) message(FATAL_ERROR "${submodule} updated") endif() endif() endforeach()' >CMakeLists.txt git add CMakeLists.txt git submodule add -- ../GIT-with-submodules submodule git commit -m "Initial import into repo." git push ../gitrepo-sub-rec.git "$defaultBranch" cd ../gitrepo-sub-rec.git git gc --prune cd .. ) tar cvzf "$outdir/gitrepo.tgz" -C "$tmpdir" gitrepo.git tar cvzf "$outdir/gitrepo-sub.tgz" -C "$tmpdir" gitrepo-sub.git tar cvzf "$outdir/gitrepo-sub-rec.tgz" -C "$tmpdir" gitrepo-sub-rec.git git_tag=$(cd "$tmpdir/gitrepo.git" ; git rev-parse HEAD) sed -i "/generated by gitrepo.bash/ s/ [0-9a-f]\\+ / $git_tag /" "$outdir/CMakeLists.txt"