summaryrefslogtreecommitdiff
path: root/unpack-trees.c
diff options
context:
space:
mode:
authorVictoria Dye <vdye@github.com>2022-05-10 23:32:32 (GMT)
committerJunio C Hamano <gitster@pobox.com>2022-05-10 23:45:13 (GMT)
commit0f329b9ae4f49d1f76cdd4cae518b2ae757e111e (patch)
tree59f22c6947290f53e39f5deef90ff0ebfa3756bb /unpack-trees.c
parent874cf2a6044462ddba7162730557354a107c3a6d (diff)
downloadgit-0f329b9ae4f49d1f76cdd4cae518b2ae757e111e.zip
git-0f329b9ae4f49d1f76cdd4cae518b2ae757e111e.tar.gz
git-0f329b9ae4f49d1f76cdd4cae518b2ae757e111e.tar.bz2
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>
Diffstat (limited to 'unpack-trees.c')
-rw-r--r--unpack-trees.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/unpack-trees.c b/unpack-trees.c
index 7f528d3..a1d0ff3 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -11,6 +11,7 @@
#include "refs.h"
#include "attr.h"
#include "split-index.h"
+#include "sparse-index.h"
#include "submodule.h"
#include "submodule-config.h"
#include "fsmonitor.h"
@@ -1839,6 +1840,11 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
o->result.fsmonitor_last_update =
xstrdup_or_null(o->src_index->fsmonitor_last_update);
+ if (!o->src_index->initialized &&
+ !repo->settings.command_requires_full_index &&
+ is_sparse_index_allowed(&o->result, 0))
+ o->result.sparse_index = 1;
+
/*
* Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries
*/