2021-03-30 13:10:45 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description="test performance of Git operations using the index"
|
|
|
|
|
|
|
|
. ./perf-lib.sh
|
|
|
|
|
|
|
|
test_perf_default_repo
|
|
|
|
|
2021-06-29 02:13:02 +00:00
|
|
|
SPARSE_CONE=f2/f4
|
2021-03-30 13:10:45 +00:00
|
|
|
|
|
|
|
test_expect_success 'setup repo and indexes' '
|
|
|
|
git reset --hard HEAD &&
|
|
|
|
|
|
|
|
# Remove submodules from the example repo, because our
|
|
|
|
# duplication of the entire repo creates an unlikely data shape.
|
|
|
|
if git config --file .gitmodules --get-regexp "submodule.*.path" >modules
|
|
|
|
then
|
|
|
|
git rm $(awk "{print \$2}" modules) &&
|
|
|
|
git commit -m "remove submodules" || return 1
|
|
|
|
fi &&
|
|
|
|
|
|
|
|
echo bogus >a &&
|
|
|
|
cp a b &&
|
|
|
|
git add a b &&
|
|
|
|
git commit -m "level 0" &&
|
|
|
|
BLOB=$(git rev-parse HEAD:a) &&
|
|
|
|
OLD_COMMIT=$(git rev-parse HEAD) &&
|
|
|
|
OLD_TREE=$(git rev-parse HEAD^{tree}) &&
|
|
|
|
|
2021-06-29 02:13:02 +00:00
|
|
|
for i in $(test_seq 1 3)
|
2021-03-30 13:10:45 +00:00
|
|
|
do
|
|
|
|
cat >in <<-EOF &&
|
|
|
|
100755 blob $BLOB a
|
|
|
|
040000 tree $OLD_TREE f1
|
|
|
|
040000 tree $OLD_TREE f2
|
|
|
|
040000 tree $OLD_TREE f3
|
|
|
|
040000 tree $OLD_TREE f4
|
|
|
|
EOF
|
|
|
|
NEW_TREE=$(git mktree <in) &&
|
|
|
|
NEW_COMMIT=$(git commit-tree $NEW_TREE -p $OLD_COMMIT -m "level $i") &&
|
|
|
|
OLD_TREE=$NEW_TREE &&
|
|
|
|
OLD_COMMIT=$NEW_COMMIT || return 1
|
|
|
|
done &&
|
|
|
|
|
|
|
|
git sparse-checkout init --cone &&
|
2023-04-03 16:47:49 +00:00
|
|
|
git tag -a v1.0 -m "Final" &&
|
2021-06-29 02:13:02 +00:00
|
|
|
git sparse-checkout set $SPARSE_CONE &&
|
|
|
|
git checkout -b wide $OLD_COMMIT &&
|
|
|
|
|
|
|
|
for l2 in f1 f2 f3 f4
|
|
|
|
do
|
|
|
|
echo more bogus >>$SPARSE_CONE/$l2/a &&
|
|
|
|
git commit -a -m "edit $SPARSE_CONE/$l2/a" || return 1
|
|
|
|
done &&
|
|
|
|
|
2021-06-29 02:13:03 +00:00
|
|
|
git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . full-v3 &&
|
2021-03-30 13:10:45 +00:00
|
|
|
(
|
2021-06-29 02:13:03 +00:00
|
|
|
cd full-v3 &&
|
2021-03-30 13:10:45 +00:00
|
|
|
git sparse-checkout init --cone &&
|
|
|
|
git sparse-checkout set $SPARSE_CONE &&
|
|
|
|
git config index.version 3 &&
|
2021-06-29 02:13:02 +00:00
|
|
|
git update-index --index-version=3 &&
|
|
|
|
git checkout HEAD~4
|
2021-03-30 13:10:45 +00:00
|
|
|
) &&
|
2021-06-29 02:13:03 +00:00
|
|
|
git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . full-v4 &&
|
2021-03-30 13:10:45 +00:00
|
|
|
(
|
2021-06-29 02:13:03 +00:00
|
|
|
cd full-v4 &&
|
2021-03-30 13:10:45 +00:00
|
|
|
git sparse-checkout init --cone &&
|
|
|
|
git sparse-checkout set $SPARSE_CONE &&
|
|
|
|
git config index.version 4 &&
|
2021-06-29 02:13:02 +00:00
|
|
|
git update-index --index-version=4 &&
|
|
|
|
git checkout HEAD~4
|
2021-03-30 13:11:04 +00:00
|
|
|
) &&
|
2021-06-29 02:13:03 +00:00
|
|
|
git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . sparse-v3 &&
|
2021-03-30 13:11:04 +00:00
|
|
|
(
|
2021-06-29 02:13:03 +00:00
|
|
|
cd sparse-v3 &&
|
2021-03-30 13:11:04 +00:00
|
|
|
git sparse-checkout init --cone --sparse-index &&
|
|
|
|
git sparse-checkout set $SPARSE_CONE &&
|
|
|
|
git config index.version 3 &&
|
2021-06-29 02:13:02 +00:00
|
|
|
git update-index --index-version=3 &&
|
|
|
|
git checkout HEAD~4
|
2021-03-30 13:11:04 +00:00
|
|
|
) &&
|
2021-06-29 02:13:03 +00:00
|
|
|
git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . sparse-v4 &&
|
2021-03-30 13:11:04 +00:00
|
|
|
(
|
2021-06-29 02:13:03 +00:00
|
|
|
cd sparse-v4 &&
|
2021-03-30 13:11:04 +00:00
|
|
|
git sparse-checkout init --cone --sparse-index &&
|
|
|
|
git sparse-checkout set $SPARSE_CONE &&
|
|
|
|
git config index.version 4 &&
|
2021-06-29 02:13:02 +00:00
|
|
|
git update-index --index-version=4 &&
|
|
|
|
git checkout HEAD~4
|
2021-03-30 13:10:45 +00:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_perf_on_all () {
|
|
|
|
command="$@"
|
2021-06-29 02:13:03 +00:00
|
|
|
for repo in full-v3 full-v4 \
|
|
|
|
sparse-v3 sparse-v4
|
2021-03-30 13:10:45 +00:00
|
|
|
do
|
|
|
|
test_perf "$command ($repo)" "
|
|
|
|
(
|
|
|
|
cd $repo &&
|
|
|
|
echo >>$SPARSE_CONE/a &&
|
|
|
|
$command
|
|
|
|
)
|
|
|
|
"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
test_perf_on_all git status
|
2022-05-10 23:32:27 +00:00
|
|
|
test_perf_on_all 'git stash && git stash pop'
|
|
|
|
test_perf_on_all 'echo >>new && git stash -u && git stash pop'
|
2021-03-30 13:10:45 +00:00
|
|
|
test_perf_on_all git add -A
|
|
|
|
test_perf_on_all git add .
|
|
|
|
test_perf_on_all git commit -a -m A
|
2021-06-29 02:13:02 +00:00
|
|
|
test_perf_on_all git checkout -f -
|
2022-05-23 13:48:45 +00:00
|
|
|
test_perf_on_all "git sparse-checkout add f2/f3/f1 && git sparse-checkout set $SPARSE_CONE"
|
2021-11-29 15:52:39 +00:00
|
|
|
test_perf_on_all git reset
|
|
|
|
test_perf_on_all git reset --hard
|
|
|
|
test_perf_on_all git reset -- does-not-exist
|
2021-12-06 15:56:00 +00:00
|
|
|
test_perf_on_all git diff
|
|
|
|
test_perf_on_all git diff --cached
|
2021-12-06 15:56:01 +00:00
|
|
|
test_perf_on_all git blame $SPARSE_CONE/a
|
|
|
|
test_perf_on_all git blame $SPARSE_CONE/f3/a
|
2022-03-01 20:24:27 +00:00
|
|
|
test_perf_on_all git read-tree -mu HEAD
|
2022-01-11 18:05:01 +00:00
|
|
|
test_perf_on_all git checkout-index -f --all
|
update-index: add tests for sparse-checkout compatibility
Introduce tests for a variety of `git update-index` use cases, including
performance scenarios. Tests are intended to exercise `update-index` with
options that change the commands interaction with the index (e.g.,
`--again`) and with files/directories inside and outside a sparse checkout
cone.
Of note is that these tests clearly establish the behavior of `git
update-index --add` with untracked, outside-of-cone files. Unlike `git add`,
which fails with an error when provided with such files, `update-index`
succeeds in adding them to the index. Additionally, the `skip-worktree` flag
is *not* automatically added to the new entry. Although this is pre-existing
behavior, there are a couple of reasons to avoid changing it in favor of
consistency with e.g. `git add`:
* `update-index` is low-level command for modifying the index; while it can
perform operations similar to those of `add`, it traditionally has fewer
"guardrails" preventing a user from doing something they may not want to
do (in this case, adding an outside-of-cone, non-`skip-worktree` file to
the index)
* `update-index` typically only exits with an error code if it is incapable
of performing an operation (e.g., if an internal function call fails);
adding a new file outside the sparse checkout definition is still a valid
operation, albeit an inadvisable one
* `update-index` does not implicitly set flags (e.g., `skip-worktree`) when
creating new index entries with `--add`; if flags need to be updated,
options like `--[no-]skip-worktree` allow a user to intentionally set them
All this to say that, while there are valid reasons to consider changing the
treatment of outside-of-cone files in `update-index`, there are also
sufficient reasons for leaving it as-is.
Co-authored-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Victoria Dye <vdye@github.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-01-11 18:05:04 +00:00
|
|
|
test_perf_on_all git update-index --add --remove $SPARSE_CONE/a
|
2022-08-07 04:13:35 +00:00
|
|
|
test_perf_on_all "git rm -f $SPARSE_CONE/a && git checkout HEAD -- $SPARSE_CONE/a"
|
2023-03-28 20:09:22 +00:00
|
|
|
test_perf_on_all git grep --cached bogus -- "f2/f1/f1/*"
|
2023-04-04 00:35:39 +00:00
|
|
|
test_perf_on_all git write-tree
|
2023-04-03 16:47:49 +00:00
|
|
|
test_perf_on_all git describe --dirty
|
|
|
|
test_perf_on_all 'echo >>new && git describe --dirty'
|
2023-05-09 19:42:41 +00:00
|
|
|
test_perf_on_all git diff-files
|
|
|
|
test_perf_on_all git diff-files -- $SPARSE_CONE/a
|
diff-tree: integrate with sparse index
The index is read in 'cmd_diff_tree' at two points:
1. The first index read was added in fd66bcc31ff (diff-tree: read the
index so attribute checks work in bare repositories, 2017-12-06) to deal
with reading '.gitattributes' content. 77efbb366ab (attr: be careful
about sparse directories, 2021-09-08) established that, in a sparse
index, we do _not_ try to load a '.gitattributes' file from within a
sparse directory.
2. The second index access point is involved in rename detection,
specifically when reading from stdin.This was initially added in
f0c6b2a2fd9 ([PATCH] Optimize diff-tree -[CM]--stdin, 2005-05-27), where
'setup' was set to 'DIFF_SETUP_USE_SIZE_CACHE |DIFF_SETUP_USE_CACHE'.
That assignment was later modified to drop the'DIFF_SETUP_USE_CACHE' in
ff7fe37b053 (diff.c: move read_index() code back to the caller,
2018-08-13).However, 'DIFF_SETUP_USE_SIZE_CACHE' seems to be unused as
of 6e0b8ed6d35 (diff.c: do not use a separate "size cache"., 2007-05-07)
and nothing about 'detect_rename' otherwise indicates index usage.
Hence we can just set the requires-full-index to false for "diff-tree".
Add tests that verify that 'git diff-tree' behaves correctly when the
sparse index is enabled and test to ensure the index is not expanded.
The `p2000` tests demonstrate a ~98% execution time reduction for
'git diff-tree' using a sparse index:
Test before after
-----------------------------------------------------------------------
2000.94: git diff-tree HEAD (full-v3) 0.05 0.04 -20.0%
2000.95: git diff-tree HEAD (full-v4) 0.06 0.05 -16.7%
2000.96: git diff-tree HEAD (sparse-v3) 0.59 0.01 -98.3%
2000.97: git diff-tree HEAD (sparse-v4) 0.61 0.01 -98.4%
2000.98: git diff-tree HEAD -- f2/f4/a (full-v3) 0.05 0.05 +0.0%
2000.99: git diff-tree HEAD -- f2/f4/a (full-v4) 0.05 0.04 -20.0%
2000.100: git diff-tree HEAD -- f2/f4/a (sparse-v3) 0.58 0.01 -98.3%
2000.101: git diff-tree HEAD -- f2/f4/a (sparse-v4) 0.55 0.01 -98.2%
Helped-by: Victoria Dye <vdye@github.com>
Signed-off-by: Shuqi Liang <cheskaqiqi@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-05-18 15:44:54 +00:00
|
|
|
test_perf_on_all git diff-tree HEAD
|
|
|
|
test_perf_on_all git diff-tree HEAD -- $SPARSE_CONE/a
|
2023-06-06 17:26:33 +00:00
|
|
|
test_perf_on_all "git worktree add ../temp && git worktree remove ../temp"
|
2021-03-30 13:10:45 +00:00
|
|
|
|
|
|
|
test_done
|