const char *initial_branch,
int init_shared_repository, unsigned int flags)
{
- int reinit;
+ int reinit, auto_setup_submodule_path_config = 0;
int exist_ok = flags & INIT_DB_EXIST_OK;
char *original_git_dir = real_pathdup(git_dir, 1);
struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
initial_branch, flags & INIT_DB_QUIET);
create_object_directory();
+ repo_config_get_bool(the_repository, "init.autoSetupSubmodulePathConfig",
+ &auto_setup_submodule_path_config);
+ if (auto_setup_submodule_path_config) {
+ int version = 0;
+ repo_config_get_int(the_repository, "core.repositoryformatversion", &version);
+ if (version < 1)
+ repo_config_set(the_repository, "core.repositoryformatversion", "1");
+ repo_config_set(the_repository, "extensions.submodulepathconfig", "true");
+ }
+
if (repo_settings_get_shared_repository(the_repository)) {
char buf[10];
/* We do not spell "group" and such, so that
)
'
+test_expect_success '`git init` respects init.autoSetupSubmodulePathConfig' '
+ git config --global init.autoSetupSubmodulePathConfig true &&
+ git init repo-init &&
+ git -C repo-init config extensions.submodulePathConfig > actual &&
+ echo true > expect &&
+ test_cmp expect actual &&
+ # create a submodule and check gitdir
+ (
+ cd repo-init &&
+ git init -b main sub &&
+ test_commit -C sub sub-initial &&
+ git submodule add ./sub sub &&
+ git config submodule.sub.gitdir > actual &&
+ echo ".git/modules/sub" > expect &&
+ test_cmp expect actual
+ ) &&
+ git config --global --unset init.autoSetupSubmodulePathConfig
+'
+
+test_expect_success '`git init` does not set extension by default' '
+ git init upstream &&
+ test_commit -C upstream initial &&
+ test_must_fail git -C upstream config extensions.submodulePathConfig &&
+ # create a pair of submodules and check gitdir is not created
+ git init -b main sub &&
+ test_commit -C sub sub-initial &&
+ (
+ cd upstream &&
+ git submodule add ../sub sub1 &&
+ test_path_is_dir .git/modules/sub1 &&
+ test_must_fail git config submodule.sub1.gitdir &&
+ git submodule add ../sub sub2 &&
+ test_path_is_dir .git/modules/sub2 &&
+ test_must_fail git config submodule.sub2.gitdir &&
+ git commit -m "Add submodules"
+ )
+'
+
+test_expect_success '`git clone` does not set extension by default' '
+ test_when_finished "rm -rf repo-clone-no-ext" &&
+ git clone upstream repo-clone-no-ext &&
+ (
+ cd repo-clone-no-ext &&
+
+ test_must_fail git config extensions.submodulePathConfig &&
+ test_path_is_missing .git/modules/sub1 &&
+ test_path_is_missing .git/modules/sub2 &&
+
+ # create a submodule and check gitdir is not created
+ git submodule add ../sub sub3 &&
+ test_must_fail git config submodule.sub3.gitdir
+ )
+'
+
+test_expect_success '`git clone --recurse-submodules` does not set extension by default' '
+ test_when_finished "rm -rf repo-clone-no-ext" &&
+ git clone --recurse-submodules upstream repo-clone-no-ext &&
+ (
+ cd repo-clone-no-ext &&
+
+ # verify that that submodules do not have gitdir set
+ test_must_fail git config extensions.submodulePathConfig &&
+ test_path_is_dir .git/modules/sub1 &&
+ test_must_fail git config submodule.sub1.gitdir &&
+ test_path_is_dir .git/modules/sub2 &&
+ test_must_fail git config submodule.sub2.gitdir &&
+
+ # create another submodule and check that gitdir is not created
+ git submodule add ../sub sub3 &&
+ test_path_is_dir .git/modules/sub3 &&
+ test_must_fail git config submodule.sub3.gitdir
+ )
+
+'
+
+test_expect_success '`git clone` respects init.autoSetupSubmodulePathConfig' '
+ test_when_finished "rm -rf repo-clone" &&
+ git config --global init.autoSetupSubmodulePathConfig true &&
+ git clone upstream repo-clone &&
+ (
+ cd repo-clone &&
+
+ # verify new repo extension is inherited from global config
+ git config extensions.submodulePathConfig > actual &&
+ echo true > expect &&
+ test_cmp expect actual &&
+
+ # new submodule has a gitdir config
+ git submodule add ../sub sub &&
+ test_path_is_dir .git/modules/sub &&
+ git config submodule.sub.gitdir > actual &&
+ echo ".git/modules/sub" > expect &&
+ test_cmp expect actual
+ ) &&
+ git config --global --unset init.autoSetupSubmodulePathConfig
+'
+
+test_expect_success '`git clone --recurse-submodules` respects init.autoSetupSubmodulePathConfig' '
+ test_when_finished "rm -rf repo-clone-recursive" &&
+ git config --global init.autoSetupSubmodulePathConfig true &&
+ git clone --recurse-submodules upstream repo-clone-recursive &&
+ (
+ cd repo-clone-recursive &&
+
+ # verify new repo extension is inherited from global config
+ git config extensions.submodulePathConfig > actual &&
+ echo true > expect &&
+ test_cmp expect actual &&
+
+ # previous submodules should exist
+ git config submodule.sub1.gitdir &&
+ git config submodule.sub2.gitdir &&
+ test_path_is_dir .git/modules/sub1 &&
+ test_path_is_dir .git/modules/sub2 &&
+
+ # create another submodule and check that gitdir is created
+ git submodule add ../sub new-sub &&
+ test_path_is_dir .git/modules/new-sub &&
+ git config submodule.new-sub.gitdir > actual &&
+ echo ".git/modules/new-sub" > expect &&
+ test_cmp expect actual
+ ) &&
+ git config --global --unset init.autoSetupSubmodulePathConfig
+'
+
test_done