Skip to content

Commit

Permalink
sparse-checkout: use repo_config_set_worktree_gently()
Browse files Browse the repository at this point in the history
The previous change added repo_config_set_worktree_gently() to assist
writing config values into the worktree.config file, especially when
that may not have been initialized.

When the base repo is bare, running 'git sparse-checkout init' in a
worktree will create the config.worktree file for the worktree, but that
will start causing the worktree to parse the bare repo's core.bare=true
value and start treating the worktree as bare. This causes more problems
as other commands are run in that worktree.

The fix is to have this assignment into config.worktree be handled by
the repo_config_set_worktree_gently() helper.

Reported-by: Sean Allred <allred.sean@gmail.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
  • Loading branch information
derrickstolee committed Dec 21, 2021
1 parent 22896e9 commit 06457fa
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 25 deletions.
25 changes: 8 additions & 17 deletions builtin/sparse-checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,26 +356,17 @@ enum sparse_checkout_mode {

static int set_config(enum sparse_checkout_mode mode)
{
const char *config_path;

if (upgrade_repository_format(the_repository, 1) < 0)
die(_("unable to upgrade repository format to enable worktreeConfig"));
if (git_config_set_gently("extensions.worktreeConfig", "true")) {
error(_("failed to set extensions.worktreeConfig setting"));
if (repo_config_set_worktree_gently(the_repository,
"core.sparseCheckout",
mode ? "true" : "false") ||
repo_config_set_worktree_gently(the_repository,
"core.sparseCheckoutCone",
mode == MODE_CONE_PATTERNS ?
"true" : "false"))
return 1;
}

config_path = git_path("config.worktree");
git_config_set_in_file_gently(config_path,
"core.sparseCheckout",
mode ? "true" : NULL);

git_config_set_in_file_gently(config_path,
"core.sparseCheckoutCone",
mode == MODE_CONE_PATTERNS ? "true" : NULL);

if (mode == MODE_NO_PATTERNS)
set_sparse_index_config(the_repository, 0);
return set_sparse_index_config(the_repository, 0);

return 0;
}
Expand Down
10 changes: 3 additions & 7 deletions sparse-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,9 @@ static int convert_to_sparse_rec(struct index_state *istate,

int set_sparse_index_config(struct repository *repo, int enable)
{
int res;
char *config_path = repo_git_path(repo, "config.worktree");
res = git_config_set_in_file_gently(config_path,
"index.sparse",
enable ? "true" : NULL);
free(config_path);

int res = repo_config_set_worktree_gently(repo,
"index.sparse",
enable ? "true" : "false");
prepare_repo_settings(repo);
repo->settings.sparse_index = enable;
return res;
Expand Down
16 changes: 15 additions & 1 deletion t/t1091-sparse-checkout-builtin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,20 @@ test_expect_success 'git sparse-checkout init' '
check_files repo a
'

test_expect_success 'init in a worktree of a bare repo' '
test_when_finished rm -rf bare worktree &&
git clone --bare repo bare &&
git -C bare worktree add ../worktree &&
(
cd worktree &&
git sparse-checkout init &&
test_must_fail git config core.bare &&
git sparse-checkout set /*
) &&
git -C bare config --list --show-origin >actual &&
grep "file:config.worktree core.bare=true" actual
'

test_expect_success 'git sparse-checkout list after init' '
git -C repo sparse-checkout list >actual &&
cat >expect <<-\EOF &&
Expand Down Expand Up @@ -219,7 +233,7 @@ test_expect_success 'sparse-index enabled and disabled' '
test-tool -C repo read-cache --table >cache &&
! grep " tree " cache &&
git -C repo config --list >config &&
! grep index.sparse config
test_cmp_config -C repo false index.sparse
)
'

Expand Down

0 comments on commit 06457fa

Please sign in to comment.