diff options
author | Raghul Nanth A <nanth.raghul@gmail.com> | 2023-04-08 16:53:42 +0530 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-04-10 09:29:04 -0700 |
commit | fce46cf78efb4fcbadd077226bd55ace78e7efab (patch) | |
tree | 492ba8d9c48ddc99c358193d13b831bbc109f48b | |
parent | 0607f793cbe0af16aee6d2480056d891835884bd (diff) | |
download | git-fce46cf78efb4fcbadd077226bd55ace78e7efab.tar.gz |
diff-index: enable sparse index
diff-index uses the run_diff_index() function to generate its diff. This
function has been made sparse-index aware in the series that led to
8d2c3732 (Merge branch 'ld/sparse-diff-blame', 2021-12-21). Hence we can
just set the requires-full-index to false for "diff-index".
Performance metrics
Test HEAD~1 HEAD
----------------------------------------------------------------------------------------------
2000.2: echo >>a && git diff-index HEAD (full-v3) 0.09(0.06+0.04) 0.09(0.07+0.03) +0.0%
2000.3: echo >>a && git diff-index HEAD (full-v4) 0.09(0.06+0.04) 0.09(0.05+0.05) +0.0%
2000.4: echo >>a && git diff-index HEAD (sparse-v3) 0.37(0.31+0.06) 0.01(0.02+0.03) -97.3%
2000.5: echo >>a && git diff-index HEAD (sparse-v4) 0.30(0.26+0.05) 0.01(0.01+0.04) -96.7%
2000.6: git diff-index HEAD **a (full-v3) 0.06(0.05+0.01) 0.06(0.06+0.01) +0.0%
2000.7: git diff-index HEAD **a (full-v4) 0.06(0.05+0.01) 0.06(0.04+0.02) +0.0%
2000.8: git diff-index HEAD **a (sparse-v3) 0.29(0.25+0.03) 0.01(0.01+0.00) -96.6%
2000.9: git diff-index HEAD **a (sparse-v4) 0.37(0.34+0.02) 0.01(0.01+0.00) -97.3%
2000.10: git diff-index --cached HEAD (full-v3) 0.05(0.03+0.01) 0.05(0.03+0.02) +0.0%
2000.11: git diff-index --cached HEAD (full-v4) 0.05(0.03+0.01) 0.05(0.02+0.02) +0.0%
2000.12: git diff-index --cached HEAD (sparse-v3) 0.35(0.33+0.01) 0.01(0.00+0.00) -97.1%
2000.13: git diff-index --cached HEAD (sparse-v4) 0.35(0.32+0.02) 0.01(0.00+0.00) -97.1%
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/diff-index.c | 9 | ||||
-rwxr-xr-x | t/perf/p2000-sparse-operations.sh | 3 | ||||
-rwxr-xr-x | t/t1092-sparse-checkout-compatibility.sh | 44 |
3 files changed, 56 insertions, 0 deletions
diff --git a/builtin/diff-index.c b/builtin/diff-index.c index b9a19bb7d3..da7b845f1d 100644 --- a/builtin/diff-index.c +++ b/builtin/diff-index.c @@ -25,6 +25,14 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix) usage(diff_cache_usage); git_config(git_diff_basic_config, NULL); /* no "diff" UI options */ + + prepare_repo_settings(the_repository); + the_repository->settings.command_requires_full_index = 0; + + if (pathspec_needs_expanded_index(the_repository->index, + &rev.diffopt.pathspec)) + ensure_full_index(the_repository->index); + repo_init_revisions(the_repository, &rev, prefix); rev.abbrev = 0; prefix = precompose_argv_prefix(argc, argv, prefix); @@ -70,6 +78,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix) perror("repo_read_index"); return -1; } + result = run_diff_index(&rev, option); result = diff_result_code(&rev.diffopt, result); release_revisions(&rev); diff --git a/t/perf/p2000-sparse-operations.sh b/t/perf/p2000-sparse-operations.sh index e4a132f593..ea884e84bf 100755 --- a/t/perf/p2000-sparse-operations.sh +++ b/t/perf/p2000-sparse-operations.sh @@ -125,5 +125,8 @@ 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 bogus -- "f2/f1/f1/*" +test_perf_on_all 'echo >>a && git diff-index HEAD' +test_perf_on_all git diff-index HEAD "**a" +test_perf_on_all git diff-index --cached HEAD test_done diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh index 801919009e..24bc716c48 100755 --- a/t/t1092-sparse-checkout-compatibility.sh +++ b/t/t1092-sparse-checkout-compatibility.sh @@ -1996,6 +1996,50 @@ test_expect_success 'sparse index is not expanded: rm' ' ensure_not_expanded rm -r deep ' +test_expect_success 'sparse index is not expanded: diff-index' ' + init_repos && + + echo "new" >>sparse-index/g && + git -C sparse-index add g && + git -C sparse-index commit -m "dummy" && + ensure_not_expanded diff-index HEAD~1 && + + echo "text" >>sparse-index/deep/a && + + ensure_not_expanded diff-index HEAD deep/a && + ensure_not_expanded diff-index HEAD deep/* +' +test_expect_success 'diff-index pathspec expands index when necessary' ' + init_repos && + + echo "text" >>sparse-index/deep/a && + + # pathspec that should expand index + ! ensure_not_expanded diff-index "*/a" && + ! ensure_not_expanded diff-index "**a" +' + +test_expect_success 'diff-index with pathspec outside sparse definition' ' + init_repos && + + test_sparse_match test_must_fail git diff-index HEAD folder2/a +' + +test_expect_success 'match all: diff-index' ' + init_repos && + + test_all_match git diff-index HEAD && + write_script edit-contents <<-\EOF && + echo text >>$1 + EOF + run_on_all ../edit-contents g && + run_on_all git add g && + run_on_all git commit -m "two" && + run_on_all rm g && + test_all_match git diff-index HEAD && + test_all_match git diff-index --cached HEAD~1 +' + test_expect_success 'grep with and --cached' ' init_repos && |