On 5/23/2023 7:17 PM, Victoria Dye via GitGitGadget wrote: > From: Victoria Dye <vdye@xxxxxxxxxx> > > 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. > @@ -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? > @@ -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. > 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