]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t4216-log-bloom.sh
bloom/diff: properly short-circuit on max_changes
[thirdparty/git.git] / t / t4216-log-bloom.sh
index ca7cc7afb71cb9bc0e8e9d0a8414d1d1d9a47872..6535a3c5d5fa3f188e8add2e8171e8e2e2b45ed8 100755 (executable)
@@ -176,21 +176,103 @@ test_expect_success 'persist filter settings' '
        grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2-auto.txt
 '
 
+test_max_changed_paths () {
+       grep "\"max_changed_paths\":$1" $2
+}
+
+test_filter_computed () {
+       grep "\"key\":\"filter-computed\",\"value\":\"$1\"" $2
+}
+
+test_filter_trunc_large () {
+       grep "\"key\":\"filter-trunc-large\",\"value\":\"$1\"" $2
+}
+
 test_expect_success 'correctly report changes over limit' '
-       git init 513changes &&
+       git init limits &&
        (
-               cd 513changes &&
-               for i in $(test_seq 1 513)
+               cd limits &&
+               mkdir d &&
+               mkdir d/e &&
+
+               for i in $(test_seq 1 2)
                do
-                       echo $i >file$i.txt || return 1
+                       printf $i >d/file$i.txt &&
+                       printf $i >d/e/file$i.txt || return 1
                done &&
-               git add . &&
+
+               mkdir mode &&
+               printf bash >mode/script.sh &&
+
+               mkdir foo &&
+               touch foo/bar &&
+               touch foo.txt &&
+
+               git add d foo foo.txt mode &&
                git commit -m "files" &&
-               git commit-graph write --reachable --changed-paths &&
-               for i in $(test_seq 1 513)
+
+               # Commit has 7 file and 4 directory adds
+               GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS=10 \
+                       GIT_TRACE2_EVENT="$(pwd)/trace" \
+                       git commit-graph write --reachable --changed-paths &&
+               test_max_changed_paths 10 trace &&
+               test_filter_computed 1 trace &&
+               test_filter_trunc_large 1 trace &&
+
+               for path in $(git ls-tree -r --name-only HEAD)
+               do
+                       git -c commitGraph.readChangedPaths=false log \
+                               -- $path >expect &&
+                       git log -- $path >actual &&
+                       test_cmp expect actual || return 1
+               done &&
+
+               # Make a variety of path changes
+               printf new1 >d/e/file1.txt &&
+               printf new2 >d/file2.txt &&
+               rm d/e/file2.txt &&
+               rm -r foo &&
+               printf text >foo &&
+               mkdir f &&
+               printf new1 >f/file1.txt &&
+
+               # including a mode-only change (counts as modified)
+               git update-index --chmod=+x mode/script.sh &&
+
+               git add foo d f &&
+               git commit -m "complicated" &&
+
+               # start from scratch and rebuild
+               rm -f .git/objects/info/commit-graph &&
+               GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS=10 \
+                       GIT_TRACE2_EVENT="$(pwd)/trace-edit" \
+                       git commit-graph write --reachable --changed-paths &&
+               test_max_changed_paths 10 trace-edit &&
+               test_filter_computed 2 trace-edit &&
+               test_filter_trunc_large 2 trace-edit &&
+
+               for path in $(git ls-tree -r --name-only HEAD)
+               do
+                       git -c commitGraph.readChangedPaths=false log \
+                               -- $path >expect &&
+                       git log -- $path >actual &&
+                       test_cmp expect actual || return 1
+               done &&
+
+               # start from scratch and rebuild
+               rm -f .git/objects/info/commit-graph &&
+               GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS=11 \
+                       GIT_TRACE2_EVENT="$(pwd)/trace-update" \
+                       git commit-graph write --reachable --changed-paths &&
+               test_max_changed_paths 11 trace-update &&
+               test_filter_computed 2 trace-update &&
+               test_filter_trunc_large 0 trace-update &&
+
+               for path in $(git ls-tree -r --name-only HEAD)
                do
-                       git -c core.commitGraph=false log -- file$i.txt >expect &&
-                       git log -- file$i.txt >actual &&
+                       git -c commitGraph.readChangedPaths=false log \
+                               -- $path >expect &&
+                       git log -- $path >actual &&
                        test_cmp expect actual || return 1
                done
        )