]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-checkout: disable sparse-index
authorDerrick Stolee <dstolee@microsoft.com>
Tue, 30 Mar 2021 13:11:01 +0000 (13:11 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 30 Mar 2021 19:57:48 +0000 (12:57 -0700)
We use 'git sparse-checkout init --cone --sparse-index' to toggle the
sparse-index feature. It makes sense to also disable it when running
'git sparse-checkout disable'. This is particularly important because it
removes the extensions.sparseIndex config option, allowing other tools
to use this Git repository again.

This does mean that 'git sparse-checkout init' will not re-enable the
sparse-index feature, even if it was previously enabled.

While testing this feature, I noticed that the sparse-index was not
being written on the first run, but by a second. This was caught by the
call to 'test-tool read-cache --table'. This requires adjusting some
assignments to core_apply_sparse_checkout and pl.use_cone_patterns in
the sparse_checkout_init() logic.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/sparse-checkout.c
t/t1091-sparse-checkout-builtin.sh

index ca63e2c64e9595df0b52850e368e703ae20a4acf..585343fa1972ca3e34ad7a03df03e5edba507c6d 100644 (file)
@@ -280,6 +280,9 @@ static int set_config(enum sparse_checkout_mode mode)
                                      "core.sparseCheckoutCone",
                                      mode == MODE_CONE_PATTERNS ? "true" : NULL);
 
+       if (mode == MODE_NO_PATTERNS)
+               set_sparse_index_config(the_repository, 0);
+
        return 0;
 }
 
@@ -341,10 +344,11 @@ static int sparse_checkout_init(int argc, const char **argv)
                the_repository->index->updated_workdir = 1;
        }
 
+       core_apply_sparse_checkout = 1;
+
        /* If we already have a sparse-checkout file, use it. */
        if (res >= 0) {
                free(sparse_filename);
-               core_apply_sparse_checkout = 1;
                return update_working_directory(NULL);
        }
 
@@ -366,6 +370,7 @@ static int sparse_checkout_init(int argc, const char **argv)
        add_pattern(strbuf_detach(&pattern, NULL), empty_base, 0, &pl, 0);
        strbuf_addstr(&pattern, "!/*/");
        add_pattern(strbuf_detach(&pattern, NULL), empty_base, 0, &pl, 0);
+       pl.use_cone_patterns = init_opts.cone_mode;
 
        return write_patterns_and_update(&pl);
 }
@@ -632,6 +637,9 @@ static int sparse_checkout_disable(int argc, const char **argv)
        strbuf_addstr(&match_all, "/*");
        add_pattern(strbuf_detach(&match_all, NULL), empty_base, 0, &pl, 0);
 
+       prepare_repo_settings(the_repository);
+       the_repository->settings.sparse_index = 0;
+
        if (update_working_directory(&pl))
                die(_("error while refreshing working directory"));
 
index fc64e9ed99f4bf0a94f5ea3bf8d783ed0bd7638a..38fc8340f5c9b7bfd2ede379545af809c2e9e636 100755 (executable)
@@ -205,6 +205,19 @@ test_expect_success 'sparse-checkout disable' '
        check_files repo a deep folder1 folder2
 '
 
+test_expect_success 'sparse-index enabled and disabled' '
+       git -C repo sparse-checkout init --cone --sparse-index &&
+       test_cmp_config -C repo true index.sparse &&
+       test-tool -C repo read-cache --table >cache &&
+       grep " tree " cache &&
+
+       git -C repo sparse-checkout disable &&
+       test-tool -C repo read-cache --table >cache &&
+       ! grep " tree " cache &&
+       git -C repo config --list >config &&
+       ! grep index.sparse config
+'
+
 test_expect_success 'cone mode: init and set' '
        git -C repo sparse-checkout init --cone &&
        git -C repo config --list >config &&