]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-index: add ensure_correct_sparsity function
authorVictoria Dye <vdye@github.com>
Tue, 23 Nov 2021 00:20:32 +0000 (00:20 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 25 Nov 2021 00:32:38 +0000 (16:32 -0800)
The `ensure_correct_sparsity` function is intended to provide a means of
aligning the in-core index with the sparsity required by the repository
settings and other properties of the index. The function first checks
whether a sparse index is allowed (per repository & sparse checkout pattern
settings). If the sparse index may be used, the index is converted to
sparse; otherwise, it is explicitly expanded with `ensure_full_index`.

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Victoria Dye <vdye@github.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sparse-index.c
sparse-index.h

index 85613cd8a3a1a3b5fb744804f2ca3fd1c38fe3bd..a1d505d50e98cfcc7bbe8482d74769c10e56aa04 100644 (file)
@@ -122,17 +122,17 @@ static int index_has_unmerged_entries(struct index_state *istate)
        return 0;
 }
 
-int convert_to_sparse(struct index_state *istate, int flags)
+static int is_sparse_index_allowed(struct index_state *istate, int flags)
 {
-       int test_env;
-       if (istate->sparse_index || !istate->cache_nr ||
-           !core_apply_sparse_checkout || !core_sparse_checkout_cone)
+       if (!core_apply_sparse_checkout || !core_sparse_checkout_cone)
                return 0;
 
        if (!istate->repo)
                istate->repo = the_repository;
 
        if (!(flags & SPARSE_INDEX_MEMORY_ONLY)) {
+               int test_env;
+
                /*
                 * The sparse index is not (yet) integrated with a split index.
                 */
@@ -168,6 +168,19 @@ int convert_to_sparse(struct index_state *istate, int flags)
        if (!istate->sparse_checkout_patterns->use_cone_patterns)
                return 0;
 
+       return 1;
+}
+
+int convert_to_sparse(struct index_state *istate, int flags)
+{
+       /*
+        * If the index is already sparse, empty, or otherwise
+        * cannot be converted to sparse, do not convert.
+        */
+       if (istate->sparse_index || !istate->cache_nr ||
+           !is_sparse_index_allowed(istate, flags))
+               return 0;
+
        /*
         * NEEDSWORK: If we have unmerged entries, then stay full.
         * Unmerged entries prevent the cache-tree extension from working.
@@ -316,6 +329,18 @@ void ensure_full_index(struct index_state *istate)
        trace2_region_leave("index", "ensure_full_index", istate->repo);
 }
 
+void ensure_correct_sparsity(struct index_state *istate)
+{
+       /*
+        * If the index can be sparse, make it sparse. Otherwise,
+        * ensure the index is full.
+        */
+       if (is_sparse_index_allowed(istate, 0))
+               convert_to_sparse(istate, 0);
+       else
+               ensure_full_index(istate);
+}
+
 /*
  * This static global helps avoid infinite recursion between
  * expand_to_path() and index_file_exists().
index 9f3d7bc7fafce1968572c0f6b962a4d72f7a064c..656bd835b25e06c45ea382b174812e501be6e2be 100644 (file)
@@ -4,6 +4,7 @@
 struct index_state;
 #define SPARSE_INDEX_MEMORY_ONLY (1 << 0)
 int convert_to_sparse(struct index_state *istate, int flags);
+void ensure_correct_sparsity(struct index_state *istate);
 
 /*
  * Some places in the codebase expect to search for a specific path.