]> git.ipfire.org Git - thirdparty/git.git/commitdiff
unpack-trees: preserve cache_bottom
authorDerrick Stolee <dstolee@microsoft.com>
Wed, 14 Jul 2021 13:12:30 +0000 (13:12 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Jul 2021 20:42:48 +0000 (13:42 -0700)
The cache_bottom member of 'struct unpack_trees_options' is used to
track the range of index entries corresponding to a node of the cache
tree. While recursing with traverse_by_cache_tree(), this value is
preserved on the call stack using a local and then restored as that
method returns.

The mark_ce_used() method normally modifies the cache_bottom member when
it refers to the marked cache entry. However, sparse directory entries
are stored as nodes in the cache-tree data structure as of 2de37c53
(cache-tree: integrate with sparse directory entries, 2021-03-30). Thus,
the cache_bottom will be modified as the cache-tree walk advances. Do
not update it as well within mark_ce_used().

Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
unpack-trees.c

index f88a69f8e71649af42828858c141efee9e3faa53..87c1ed204c83e44c336309aa3d564b6cc2fae978 100644 (file)
@@ -600,6 +600,13 @@ static void mark_ce_used(struct cache_entry *ce, struct unpack_trees_options *o)
 {
        ce->ce_flags |= CE_UNPACKED;
 
+       /*
+        * If this is a sparse directory, don't advance cache_bottom.
+        * That will be advanced later using the cache-tree data.
+        */
+       if (S_ISSPARSEDIR(ce->ce_mode))
+               return;
+
        if (o->cache_bottom < o->src_index->cache_nr &&
            o->src_index->cache[o->cache_bottom] == ce) {
                int bottom = o->cache_bottom;