sparse-checkout: use in-process update for disable subcommand

The 'git sparse-checkout disable' subcommand returns a user to a
full working directory. The old process for doing this required
updating the sparse-checkout file with the "/*" pattern and then
updating the working directory with core.sparseCheckout enabled.
Finally, the sparse-checkout file could be removed and the config
setting disabled.

However, it is valuable to keep a user's sparse-checkout file
intact so they can re-enable the sparse-checkout they previously
used with 'git sparse-checkout init'. This is now possible with
the in-process mechanism for updating the working directory.

Reported-by: Szeder Gábor <szeder.dev@gmail.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Derrick Stolee 2019-11-21 22:04:47 +00:00 committed by Junio C Hamano
parent e091228e17
commit 99dfa6f970
3 changed files with 19 additions and 17 deletions

View File

@ -52,8 +52,10 @@ When the `--stdin` option is provided, the patterns are read from
standard in as a newline-delimited list instead of from the arguments. standard in as a newline-delimited list instead of from the arguments.


'disable':: 'disable'::
Remove the sparse-checkout file, set `core.sparseCheckout` to Disable the `core.sparseCheckout` config setting, and restore the
`false`, and restore the working directory to include all files. working directory to include all files. Leaves the sparse-checkout
file intact so a later 'git sparse-checkout init' command may
return the working directory to the same state.


SPARSE CHECKOUT SPARSE CHECKOUT
--------------- ---------------

View File

@ -412,24 +412,23 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)


static int sparse_checkout_disable(int argc, const char **argv) static int sparse_checkout_disable(int argc, const char **argv)
{ {
char *sparse_filename; static const char *empty_base = "";
FILE *fp; struct pattern_list pl;

struct strbuf match_all = STRBUF_INIT;
if (set_config(MODE_ALL_PATTERNS))
die(_("failed to change config"));

sparse_filename = get_sparse_checkout_filename();
fp = xfopen(sparse_filename, "w");
fprintf(fp, "/*\n");
fclose(fp);


memset(&pl, 0, sizeof(pl));
hashmap_init(&pl.recursive_hashmap, pl_hashmap_cmp, NULL, 0);
hashmap_init(&pl.parent_hashmap, pl_hashmap_cmp, NULL, 0);
pl.use_cone_patterns = 0;
core_apply_sparse_checkout = 1; core_apply_sparse_checkout = 1;
if (update_working_directory(NULL))
strbuf_addstr(&match_all, "/*");
add_pattern(strbuf_detach(&match_all, NULL), empty_base, 0, &pl, 0);

if (update_working_directory(&pl))
die(_("error while refreshing working directory")); die(_("error while refreshing working directory"));


unlink(sparse_filename); clear_pattern_list(&pl);
free(sparse_filename);

return set_config(MODE_NO_PATTERNS); return set_config(MODE_NO_PATTERNS);
} }



View File

@ -172,8 +172,9 @@ test_expect_success 'cone mode: warn on bad pattern' '
' '


test_expect_success 'sparse-checkout disable' ' test_expect_success 'sparse-checkout disable' '
test_when_finished rm -rf repo/.git/info/sparse-checkout &&
git -C repo sparse-checkout disable && git -C repo sparse-checkout disable &&
test_path_is_missing repo/.git/info/sparse-checkout && test_path_is_file repo/.git/info/sparse-checkout &&
git -C repo config --list >config && git -C repo config --list >config &&
test_must_fail git config core.sparseCheckout && test_must_fail git config core.sparseCheckout &&
ls repo >dir && ls repo >dir &&