Re: [PATCH 2/2] repository: move 'repository_format_worktree_config' to repo scope
From: Derrick Stolee <hidden>
Date: 2023-05-25 20:13:52
On 5/23/2023 7:17 PM, Victoria Dye via GitGitGadget wrote:
From: Victoria Dye <redacted> Move 'repository_format_worktree_config' out of the global scope and into the 'repository' struct. This change is similar to how 'repository_format_partial_clone' was moved in ebaf3bcf1ae (repository: move global r_f_p_c to repo struct, 2021-06-17), adding to the 'repository' struct and updating 'setup.c' & 'repository.c' functions to assign the value appropriately. In addition, update usage of the setting to reference the relevant context's repo or, as a fallback, 'the_repository'. The primary goal of this change is to be able to load worktree config for a submodule depending on whether that submodule - not the super project - has 'extensions.worktreeConfig' enabled. To ensure 'do_git_config_sequence()' has access to the newly repo-scoped configuration: - update 'repo_read_config()' to create a 'config_source' to hold the repo instance - add a 'repo' argument to 'do_git_config_sequence()' - update 'config_with_options' to call 'do_git_config_sequence()' with 'config_source.repo', or 'the_repository' as a fallback Finally, add/update tests in 't3007-ls-files-recurse-submodules.sh' to verify 'extensions.worktreeConfig' is read an used independently by super projects and submodules.
quoted hunk ↗ jump to hunk
@@ -2277,7 +2278,7 @@ int config_with_options(config_fn_t fn, void *data, data = &inc; } - if (config_source) + if (config_source && config_source->scope != CONFIG_SCOPE_UNKNOWN) config_reader_set_scope(&the_reader, config_source->scope);
This extra condition on config_source->scope surprised me. Could you elaborate on the reason this is necessary?
quoted hunk ↗ jump to hunk
@@ -2667,11 +2670,14 @@ static void repo_read_config(struct repository *repo) { struct config_options opts = { 0 }; struct configset_add_data data = CONFIGSET_ADD_INIT; + struct git_config_source config_source = { 0 };
This could be...
struct git_config_source config_source = { .repo = repo };
opts.respect_includes = 1; opts.commondir = repo->commondir; opts.git_dir = repo->gitdir; + config_source.repo = repo; +
...avoiding these lines.
quoted hunk ↗ jump to hunk
diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh index e35c203241f..6d0bacef4de 100755 --- a/t/t3007-ls-files-recurse-submodules.sh +++ b/t/t3007-ls-files-recurse-submodules.sh@@ -309,19 +309,30 @@ test_expect_success '--recurse-submodules parses submodule repo config' ' test_expect_success '--recurse-submodules parses submodule worktree config' ' test_when_finished "git -C submodule config --unset extensions.worktreeConfig" && test_when_finished "git -C submodule config --worktree --unset feature.experimental" && - test_when_finished "git config --unset extensions.worktreeConfig" && git -C submodule config extensions.worktreeConfig true && git -C submodule config --worktree feature.experimental "invalid non-boolean value" && - # NEEDSWORK: the extensions.worktreeConfig is set globally based on super - # project, so we need to enable it in the super project. - git config extensions.worktreeConfig true && - test_must_fail git ls-files --recurse-submodules 2>err && grep "bad boolean config value" err '
These are my favorite kind of test updates: deleting extra setup that's no longer needed.
+test_expect_success '--recurse-submodules submodules ignore super project worktreeConfig extension' ' + test_when_finished "git config --unset extensions.worktreeConfig" && + + # Enable worktree config in both super project & submodule, set an + # invalid config in the submodule worktree config, then disable worktree + # config in the submodule. The invalid worktree config should not be + # picked up. + git config extensions.worktreeConfig true && + git -C submodule config extensions.worktreeConfig true && + git -C submodule config --worktree feature.experimental "invalid non-boolean value" && + git -C submodule config --unset extensions.worktreeConfig && + + git ls-files --recurse-submodules 2>err && + ! grep "bad boolean config value" err +'
We have the same ways to improve here using 'test_config' as recommended in patch 1. Thanks, -Stolee