779
bitmap_free(tips);
780
}
781
782
+static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
783
+ uint32_t pos)
784
+{
785
+ struct packed_git *pack = bitmap_git->pack;
786
+ unsigned long size;
787
+ struct object_info oi = OBJECT_INFO_INIT;
788
+
789
+ oi.sizep = &size;
790
+
791
+ if (pos < pack->num_objects) {
792
+ struct revindex_entry *entry = &pack->revindex[pos];
793
+ if (packed_object_info(the_repository, pack,
794
+ entry->offset, &oi) < 0) {
795
+ struct object_id oid;
796
+ nth_packed_object_oid(&oid, pack, entry->nr);
797
+ die(_("unable to get size of %s"), oid_to_hex(&oid));
798
+ }
799
+ } else {
800
+ struct eindex *eindex = &bitmap_git->ext_index;
801
+ struct object *obj = eindex->objects[pos - pack->num_objects];
802
+ if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
803
+ die(_("unable to get size of %s"), oid_to_hex(&obj->oid));
804
+ }
805
+
806
+ return size;
807
+}
808
+
809
+static void filter_bitmap_blob_limit(struct bitmap_index *bitmap_git,
810
+ struct object_list *tip_objects,
811
+ struct bitmap *to_filter,
812
+ unsigned long limit)
813
+{
814
+ struct eindex *eindex = &bitmap_git->ext_index;
815
+ struct bitmap *tips;
816
+ struct ewah_iterator it;
817
+ eword_t mask;
818
+ uint32_t i;
819
+
820
+ tips = find_tip_blobs(bitmap_git, tip_objects);
821
+
822
+ for (i = 0, init_type_iterator(&it, bitmap_git, OBJ_BLOB);
823
+ i < to_filter->word_alloc && ewah_iterator_next(&mask, &it);
824
+ i++) {
825
+ eword_t word = to_filter->words[i] & mask;
826
+ unsigned offset;
827
+
828
+ for (offset = 0; offset < BITS_IN_EWORD; offset++) {
829
+ uint32_t pos;
830
+
831
+ if ((word >> offset) == 0)
832
+ break;
833
+ offset += ewah_bit_ctz64(word >> offset);
834
+ pos = i * BITS_IN_EWORD + offset;
835
+
836
+ if (!bitmap_get(tips, pos) &&
837
+ get_size_by_pos(bitmap_git, pos) >= limit)
838
+ bitmap_unset(to_filter, pos);
839
+ }
840
+ }
841
+
842
+ for (i = 0; i < eindex->count; i++) {
843
+ uint32_t pos = i + bitmap_git->pack->num_objects;
844
+ if (eindex->objects[i]->type == OBJ_BLOB &&
845
+ bitmap_get(to_filter, pos) &&
846
+ !bitmap_get(tips, pos) &&
847
+ get_size_by_pos(bitmap_git, pos) >= limit)
848
+ bitmap_unset(to_filter, pos);
849
+ }
850
+
851
+ bitmap_free(tips);
852
+}
853
+
854
static int filter_bitmap(struct bitmap_index *bitmap_git,
855
struct object_list *tip_objects,
856
struct bitmap *to_filter,
866
return 0;
867
}
868
869
+ if (filter->choice == LOFC_BLOB_LIMIT) {
870
+ if (bitmap_git)
871
+ filter_bitmap_blob_limit(bitmap_git, tip_objects,
872
+ to_filter,
873
+ filter->blob_limit_value);
874
+ return 0;
875
+ }
876
+
877
/* filter choice not handled */
878
return -1;
879
}