Re: [PATCH v4 3/3] builtin/grep.c: walking tree instead of expanding index with --sparse
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 3, 2022, 04:39 UTC
- Message-ID
- <xmqqczcd1382.fsf@gitster.g>
- In-Reply-To
- <20220903003623.64750-4-shaoxuan.yuan02@gmail.com>
Shaoxuan Yuan <shaoxuan.yuan02@gmail.com> writes:
Show 16 quoted lines
> @@ -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?
Show 38 quoted lines
> + 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