Shaoxuan Yuan <shaoxuan.yuan02@xxxxxxxxx> writes: > @@ -537,8 +534,20 @@ static int grep_cache(struct grep_opt *opt, > > strbuf_setlen(&name, name_base_len); > strbuf_addstr(&name, ce->name); > + if (S_ISSPARSEDIR(ce->ce_mode)) { > + enum object_type type; > + struct tree_desc tree; > + void *data; > + unsigned long size; > + > + data = read_object_file(&ce->oid, &type, &size); > + init_tree_desc(&tree, data, size); > > - if (S_ISREG(ce->ce_mode) && > + hit |= grep_tree(opt, pathspec, &tree, &name, 0, 0); > + strbuf_reset(&name); Is this correct? I would have expected that this would chomp to name_base_len, just like what the code before this if/elseif cascade did. There needs a test that is run with repo->submodule_prefix != NULL to uncover issues like this, perhaps? > + strbuf_addstr(&name, ce->name); > + free(data); > + } else if (S_ISREG(ce->ce_mode) && > match_pathspec(repo->index, pathspec, name.buf, name.len, 0, NULL, > S_ISDIR(ce->ce_mode) || > S_ISGITLINK(ce->ce_mode))) { > diff --git a/t/perf/p2000-sparse-operations.sh b/t/perf/p2000-sparse-operations.sh > index fce8151d41..3242cfe91a 100755 > --- a/t/perf/p2000-sparse-operations.sh > +++ b/t/perf/p2000-sparse-operations.sh > @@ -124,5 +124,6 @@ test_perf_on_all git read-tree -mu HEAD > test_perf_on_all git checkout-index -f --all > test_perf_on_all git update-index --add --remove $SPARSE_CONE/a > test_perf_on_all "git rm -f $SPARSE_CONE/a && git checkout HEAD -- $SPARSE_CONE/a" > +test_perf_on_all git grep --cached --sparse bogus -- "f2/f1/f1/*" > > test_done > diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh > index 63becc3138..56e4614276 100755 > --- a/t/t1092-sparse-checkout-compatibility.sh > +++ b/t/t1092-sparse-checkout-compatibility.sh > @@ -1987,7 +1987,15 @@ test_expect_success 'grep is not expanded' ' > > # All files within the folder1/* pathspec are sparse, > # so this command does not find any matches > - ensure_not_expanded ! grep a -- folder1/* > + ensure_not_expanded ! grep a -- folder1/* && > + > + # test out-of-cone pathspec with or without wildcard > + ensure_not_expanded grep --sparse --cached a -- "folder1/a" && > + ensure_not_expanded grep --sparse --cached a -- "folder1/*" && > + > + # test in-cone pathspec with or without wildcard > + ensure_not_expanded grep --sparse --cached a -- "deep/a" && > + ensure_not_expanded grep --sparse --cached a -- "deep/*" > ' > > test_done