unpack-trees: preserve index sparsity

When unpacking trees, set the default sparsity of the resultant index based on repo settings and 'is_sparse_index_allowed()'. Normally, when executing 'unpack_trees', the output index is marked sparse when (and only when) it unpacks a sparse directory. However, an index may be "sparse" even if it contains no sparse directories - when all files fall inside the sparse-checkout definition or otherwise have SKIP_WORKTREE disabled. Therefore, the output index may be marked "full" even when it is "sparse", resulting in unnecessary 'ensure_full_index' calls when writing to disk. Avoid this by setting the "default" index sparsity to match what is expected for the repository. As a consequence of this fix, the (non-merge) 'read-tree' performed when applying a stash with untracked files no longer expands the index. Update the corresponding test in 't1092'. Signed-off-by: Victoria Dye <vdye@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Victoria Dye committed May 10, 2022 at 23:32 UTC 0f329b9ae4f49d1f76cdd4cae518b2ae757e111e
2 files changed +7 -1
t/t1092-sparse-checkout-compatibility.sh
+1 -1
@@ -1392,7 +1392,7 @@ test_expect_success 'sparse-index is not expanded: stash' '
1392 ensure_not_expanded stash -u &&
1393 (
1394 WITHOUT_UNTRACKED_TXT=1 &&
1395 - ! ensure_not_expanded stash pop
1395 + ensure_not_expanded stash pop
1396 ) &&
1397
1398 ensure_not_expanded stash create &&
unpack-trees.c
+6
@@ -11,6 +11,7 @@
11 #include "refs.h"
12 #include "attr.h"
13 #include "split-index.h"
14 +#include "sparse-index.h"
15 #include "submodule.h"
16 #include "submodule-config.h"
17 #include "fsmonitor.h"
@@ -1839,6 +1840,11 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
1840 o->result.fsmonitor_last_update =
1841 xstrdup_or_null(o->src_index->fsmonitor_last_update);
1842
1843 + if (!o->src_index->initialized &&
1844 + !repo->settings.command_requires_full_index &&
1845 + is_sparse_index_allowed(&o->result, 0))
1846 + o->result.sparse_index = 1;
1847 +
1848 /*
1849 * Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries
1850 */