]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-index: add index.sparse config option
authorDerrick Stolee <dstolee@microsoft.com>
Tue, 30 Mar 2021 13:10:59 +0000 (13:10 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 30 Mar 2021 19:57:47 +0000 (12:57 -0700)
When enabled, this config option signals that index writes should
attempt to use sparse-directory entries.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/index.txt
cache.h
repo-settings.c
repository.h
sparse-index.c

index 7cb50b37e98dba813886adb4578435495be8e78c..75f3a2d10541460a912946bbbf9987aa18275a02 100644 (file)
@@ -14,6 +14,11 @@ index.recordOffsetTable::
        Defaults to 'true' if index.threads has been explicitly enabled,
        'false' otherwise.
 
+index.sparse::
+       When enabled, write the index using sparse-directory entries. This
+       has no effect unless `core.sparseCheckout` and
+       `core.sparseCheckoutCone` are both enabled. Defaults to 'false'.
+
 index.threads::
        Specifies the number of threads to spawn when loading the index.
        This is meant to reduce index load time on multiprocessor machines.
diff --git a/cache.h b/cache.h
index 74b43aaa2bd14f32ebeac18e462d2d6004448171..8aede373aeb34fc77b0e7bc7e32fc709610c94f3 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1059,6 +1059,7 @@ struct repository_format {
        int worktree_config;
        int is_bare;
        int hash_algo;
+       int sparse_index;
        char *work_tree;
        struct string_list unknown_extensions;
        struct string_list v1_only_extensions;
index d63569e4041eca4946a23903309ca5d40bab7dea..0cfe8b787db26d9eaf55c31e839fc291477b879e 100644 (file)
@@ -85,4 +85,11 @@ void prepare_repo_settings(struct repository *r)
         * removed.
         */
        r->settings.command_requires_full_index = 1;
+
+       /*
+        * Initialize this as off.
+        */
+       r->settings.sparse_index = 0;
+       if (!repo_config_get_bool(r, "index.sparse", &value) && value)
+               r->settings.sparse_index = 1;
 }
index e06a23015697228b8070c806a60cb12468ef7e92..a45f7520fd9e12e496b5ad36ad4eba2b7ac7afef 100644 (file)
@@ -42,7 +42,8 @@ struct repo_settings {
 
        int core_multi_pack_index;
 
-       unsigned command_requires_full_index:1;
+       unsigned command_requires_full_index:1,
+                sparse_index:1;
 };
 
 struct repository {
index 7631f7bd00b78e9064ce113472db2c961dc17c14..6f4d95d35b1ef95768f9e437d6393aaa67616639 100644 (file)
@@ -102,19 +102,43 @@ static int convert_to_sparse_rec(struct index_state *istate,
        return num_converted - start_converted;
 }
 
+static int enable_sparse_index(struct repository *repo)
+{
+       const char *config_path = repo_git_path(repo, "config.worktree");
+
+       git_config_set_in_file_gently(config_path,
+                                     "index.sparse",
+                                     "true");
+
+       prepare_repo_settings(repo);
+       repo->settings.sparse_index = 1;
+       return 0;
+}
+
 int convert_to_sparse(struct index_state *istate)
 {
        if (istate->split_index || istate->sparse_index ||
            !core_apply_sparse_checkout || !core_sparse_checkout_cone)
                return 0;
 
+       if (!istate->repo)
+               istate->repo = the_repository;
+
+       /*
+        * The GIT_TEST_SPARSE_INDEX environment variable triggers the
+        * index.sparse config variable to be on.
+        */
+       if (git_env_bool("GIT_TEST_SPARSE_INDEX", 0)) {
+               int err = enable_sparse_index(istate->repo);
+               if (err < 0)
+                       return err;
+       }
+
        /*
-        * For now, only create a sparse index with the
-        * GIT_TEST_SPARSE_INDEX environment variable. We will relax
-        * this once we have a proper way to opt-in (and later still,
-        * opt-out).
+        * Only convert to sparse if index.sparse is set.
         */
-       if (!git_env_bool("GIT_TEST_SPARSE_INDEX", 0))
+       prepare_repo_settings(istate->repo);
+       if (!istate->repo->settings.sparse_index)
                return 0;
 
        if (!istate->sparse_checkout_patterns) {