]> git.ipfire.org Git - thirdparty/git.git/blobdiff - sparse-index.c
refs: print error message in debug output
[thirdparty/git.git] / sparse-index.c
index 7b7ff79e0443a89d37409620a0fd6b04ef9cdc10..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,25 +168,41 @@ 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)
+{
        /*
-        * NEEDSWORK: If we have unmerged entries, then stay full.
-        * Unmerged entries prevent the cache-tree extension from working.
+        * If the index is already sparse, empty, or otherwise
+        * cannot be converted to sparse, do not convert.
         */
-       if (index_has_unmerged_entries(istate))
+       if (istate->sparse_index || !istate->cache_nr ||
+           !is_sparse_index_allowed(istate, flags))
                return 0;
 
-       /* Clear and recompute the cache-tree */
-       cache_tree_free(&istate->cache_tree);
        /*
-        * Silently return if there is a problem with the cache tree update,
-        * which might just be due to a conflict state in some entry.
-        *
-        * This might create new tree objects, so be sure to use
-        * WRITE_TREE_MISSING_OK.
+        * NEEDSWORK: If we have unmerged entries, then stay full.
+        * Unmerged entries prevent the cache-tree extension from working.
         */
-       if (cache_tree_update(istate, WRITE_TREE_MISSING_OK))
+       if (index_has_unmerged_entries(istate))
                return 0;
 
+       if (!cache_tree_fully_valid(istate->cache_tree)) {
+               /* Clear and recompute the cache-tree */
+               cache_tree_free(&istate->cache_tree);
+
+               /*
+                * Silently return if there is a problem with the cache tree update,
+                * which might just be due to a conflict state in some entry.
+                *
+                * This might create new tree objects, so be sure to use
+                * WRITE_TREE_MISSING_OK.
+                */
+               if (cache_tree_update(istate, WRITE_TREE_MISSING_OK))
+                       return 0;
+       }
+
        remove_fsmonitor(istate);
 
        trace2_region_enter("index", "convert_to_sparse", istate->repo);
@@ -313,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().