Thread (184 messages) flat view 184 messages, 6 authors, 2021-04-01

Re: [PATCH 13/20] unpack-trees: allow sparse directories

From: Elijah Newren <hidden>
Date: 2021-02-25 07:42:32

On Tue, Feb 23, 2021 at 12:14 PM Derrick Stolee via GitGitGadget
[off-list ref] wrote:
From: Derrick Stolee <redacted>

The index_pos_by_traverse_info() currently throws a BUG() when a
directory entry exists exactly in the index. We need to consider that it
is possible to have a directory in a sparse index as long as that entry
is itself marked with the skip-worktree bit.

The negation of the 'pos' variable must be conditioned to only when it
starts as negative. This is identical behavior as before when the index
is full.
Same comment on the second paragraph as I made in the RFC series --
https://lore.kernel.org/git/CABPp-BGPJgA4guWHVm3AVS=hM0fTixUpRvJe5i9NnHT-3QJMfw@mail.gmail.com/ (local).
I apologize if I'm repeating stuff you chose to not change, but I
didn't see a response and given the three typos left in previous
patches, I'm unsure whether it was unaddressed on purpose or on
accident.
quoted hunk ↗ jump to hunk
Signed-off-by: Derrick Stolee <redacted>
---
 unpack-trees.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/unpack-trees.c b/unpack-trees.c
index 4dd99219073a..b324eec2a5d1 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -746,9 +746,12 @@ static int index_pos_by_traverse_info(struct name_entry *names,
        strbuf_make_traverse_path(&name, info, names->path, names->pathlen);
        strbuf_addch(&name, '/');
        pos = index_name_pos(o->src_index, name.buf, name.len);
-       if (pos >= 0)
-               BUG("This is a directory and should not exist in index");
-       pos = -pos - 1;
+       if (pos >= 0) {
+               if (!o->src_index->sparse_index ||
+                   !(o->src_index->cache[pos]->ce_flags & CE_SKIP_WORKTREE))
+                       BUG("This is a directory and should not exist in index");
+       } else
+               pos = -pos - 1;
        if (pos >= o->src_index->cache_nr ||
            !starts_with(o->src_index->cache[pos]->name, name.buf) ||
            (pos > 0 && starts_with(o->src_index->cache[pos-1]->name, name.buf)))
--
gitgitgadget
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help