]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ps/pack-bitmap-optim'
authorJunio C Hamano <gitster@pobox.com>
Wed, 7 Apr 2021 23:54:09 +0000 (16:54 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 7 Apr 2021 23:54:09 +0000 (16:54 -0700)
Optimize "rev-list --use-bitmap-index --objects" corner case that
uses negative tags as the stopping points.

* ps/pack-bitmap-optim:
  pack-bitmap: avoid traversal of objects referenced by uninteresting tag

pack-bitmap.c
t/perf/p5310-pack-bitmaps.sh

index 1ebe0c81628a35932c3d05ccb1306834442568a0..b4513f8672607be79020ad7ff861ed9d42baecc3 100644 (file)
@@ -997,6 +997,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
                                object_list_insert(object, &wants);
 
                        object = parse_object_or_die(get_tagged_oid(tag), NULL);
+                       object->flags |= (tag->object.flags & UNINTERESTING);
                }
 
                if (object->flags & UNINTERESTING)
index b3e725f0310a7b4d8343089de922c7eb6d148a52..452be01056c6b4797958809036811984634ace7d 100755 (executable)
@@ -15,6 +15,12 @@ test_expect_success 'setup bitmap config' '
        git config pack.writebitmaps true
 '
 
+# we need to create the tag up front such that it is covered by the repack and
+# thus by generated bitmaps.
+test_expect_success 'create tags' '
+       git tag --message="tag pointing to HEAD" perf-tag HEAD
+'
+
 test_perf 'repack to disk' '
        git repack -ad
 '
@@ -43,6 +49,14 @@ test_perf 'rev-list (objects)' '
        git rev-list --all --use-bitmap-index --objects >/dev/null
 '
 
+test_perf 'rev-list with tag negated via --not --all (objects)' '
+       git rev-list perf-tag --not --all --use-bitmap-index --objects >/dev/null
+'
+
+test_perf 'rev-list with negative tag (objects)' '
+       git rev-list HEAD --not perf-tag --use-bitmap-index --objects >/dev/null
+'
+
 test_perf 'rev-list count with blob:none' '
        git rev-list --use-bitmap-index --count --objects --all \
                --filter=blob:none >/dev/null