check-attr: integrate with sparse-index

Set the requires-full-index to false for "check-attr".

Add a test to ensure that the index is not expanded whether the files
are outside or inside the sparse-checkout cone when the sparse index is
enabled.

The `p2000` tests demonstrate a ~63% execution time reduction for
'git check-attr' using a sparse index.

Test                                            before  after
-----------------------------------------------------------------------
2000.106: git check-attr -a f2/f4/a (full-v3)    0.05   0.05 +0.0%
2000.107: git check-attr -a f2/f4/a (full-v4)    0.05   0.05 +0.0%
2000.108: git check-attr -a f2/f4/a (sparse-v3)  0.04   0.02 -50.0%
2000.109: git check-attr -a f2/f4/a (sparse-v4)  0.04   0.01 -75.0%

Helped-by: Victoria Dye <vdye@github.com>
Signed-off-by: Shuqi Liang <cheskaqiqi@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Shuqi Liang 2023-08-11 10:22:11 -04:00 committed by Junio C Hamano
parent 4723ae1007
commit f9815878c1
3 changed files with 19 additions and 0 deletions

View File

@ -122,6 +122,9 @@ int cmd_check_attr(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, check_attr_options,
check_attr_usage, PARSE_OPT_KEEP_DASHDASH);
prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
if (repo_read_index(the_repository) < 0) {
die("invalid cache");
}

View File

@ -134,5 +134,6 @@ test_perf_on_all git diff-files -- $SPARSE_CONE/a
test_perf_on_all git diff-tree HEAD
test_perf_on_all git diff-tree HEAD -- $SPARSE_CONE/a
test_perf_on_all "git worktree add ../temp && git worktree remove ../temp"
test_perf_on_all git check-attr -a -- $SPARSE_CONE/a
test_done

View File

@ -2316,4 +2316,19 @@ test_expect_failure 'diff --check with pathspec outside sparse definition' '
test_all_match test_must_fail git diff --check --cached -- folder1/a
'
test_expect_success 'sparse-index is not expanded: check-attr' '
init_repos &&
echo "a -crlf myAttr" >>.gitattributes &&
mkdir ./sparse-index/folder1 &&
cp ./sparse-index/a ./sparse-index/folder1/a &&
cp .gitattributes ./sparse-index/deep &&
cp .gitattributes ./sparse-index/folder1 &&
git -C sparse-index add deep/.gitattributes &&
git -C sparse-index add --sparse folder1/.gitattributes &&
ensure_not_expanded check-attr -a --cached -- deep/a &&
ensure_not_expanded check-attr -a --cached -- folder1/a
'
test_done