740
return ret;
741
}
742
743
+static void prime_cache_tree_sparse_dir(struct cache_tree *it,
744
+ struct tree *tree)
745
+{
746
+
747
+ oidcpy(&it->oid, &tree->object.oid);
748
+ it->entry_count = 1;
749
+}
750
+
751
static void prime_cache_tree_rec(struct repository *r,
752
struct cache_tree *it,
745
- struct tree *tree)
753
+ struct tree *tree,
754
+ struct strbuf *tree_path)
755
{
756
struct tree_desc desc;
757
struct name_entry entry;
758
int cnt;
759
+ int base_path_len = tree_path->len;
760
761
oidcpy(&it->oid, &tree->object.oid);
762
+
763
init_tree_desc(&desc, tree->buffer, tree->size);
764
cnt = 0;
765
while (tree_entry(&desc, &entry)) {
768
else {
769
struct cache_tree_sub *sub;
770
struct tree *subtree = lookup_tree(r, &entry.oid);
771
+
772
if (!subtree->object.parsed)
773
parse_tree(subtree);
774
sub = cache_tree_sub(it, entry.path);
775
sub->cache_tree = cache_tree();
764
- prime_cache_tree_rec(r, sub->cache_tree, subtree);
776
+
777
+ /*
778
+ * Recursively-constructed subtree path is only needed when working
779
+ * in a sparse index (where it's used to determine whether the
780
+ * subtree is a sparse directory in the index).
781
+ */
782
+ if (r->index->sparse_index) {
783
+ strbuf_setlen(tree_path, base_path_len);
784
+ strbuf_grow(tree_path, base_path_len + entry.pathlen + 1);
785
+ strbuf_add(tree_path, entry.path, entry.pathlen);
786
+ strbuf_addch(tree_path, '/');
787
+ }
788
+
789
+ /*
790
+ * If a sparse index is in use, the directory being processed may be
791
+ * sparse. To confirm that, we can check whether an entry with that
792
+ * exact name exists in the index. If it does, the created subtree
793
+ * should be sparse. Otherwise, cache tree expansion should continue
794
+ * as normal.
795
+ */
796
+ if (r->index->sparse_index &&
797
+ index_entry_exists(r->index, tree_path->buf, tree_path->len))
798
+ prime_cache_tree_sparse_dir(sub->cache_tree, subtree);
799
+ else
800
+ prime_cache_tree_rec(r, sub->cache_tree, subtree, tree_path);
801
cnt += sub->cache_tree->entry_count;
802
}
803
}
804
+
805
it->entry_count = cnt;
806
}
807
809
struct index_state *istate,
810
struct tree *tree)
811
{
812
+ struct strbuf tree_path = STRBUF_INIT;
813
+
814
trace2_region_enter("cache-tree", "prime_cache_tree", the_repository);
815
cache_tree_free(&istate->cache_tree);
816
istate->cache_tree = cache_tree();
817
779
- ensure_full_index(istate);
780
- prime_cache_tree_rec(r, istate->cache_tree, tree);
818
+ prime_cache_tree_rec(r, istate->cache_tree, tree, &tree_path);
819
+ strbuf_release(&tree_path);
820
istate->cache_changed |= CACHE_TREE_CHANGED;
821
trace2_region_leave("cache-tree", "prime_cache_tree", the_repository);
822
}