|
21 | 21 | #include "streaming.h" |
22 | 22 | #include "oid-array.h" |
23 | 23 | #include "packfile.h" |
| 24 | +#include "pack-bitmap.h" |
24 | 25 | #include "object-file.h" |
25 | 26 | #include "object-name.h" |
26 | 27 | #include "object-store-ll.h" |
@@ -825,17 +826,48 @@ static int batch_one_object_packed(const struct object_id *oid, |
825 | 826 | payload->payload); |
826 | 827 | } |
827 | 828 |
|
828 | | -static void batch_each_object(for_each_object_fn callback, |
| 829 | +static int batch_one_object_bitmapped(const struct object_id *oid, |
| 830 | + enum object_type type UNUSED, |
| 831 | + int flags UNUSED, |
| 832 | + uint32_t hash UNUSED, |
| 833 | + struct packed_git *pack, |
| 834 | + off_t offset, |
| 835 | + void *_payload) |
| 836 | +{ |
| 837 | + struct for_each_object_payload *payload = _payload; |
| 838 | + return payload->callback(oid, pack, offset, payload->payload); |
| 839 | +} |
| 840 | + |
| 841 | +static void batch_each_object(struct batch_options *opt, |
| 842 | + for_each_object_fn callback, |
829 | 843 | unsigned flags, |
830 | 844 | void *_payload) |
831 | 845 | { |
832 | 846 | struct for_each_object_payload payload = { |
833 | 847 | .callback = callback, |
834 | 848 | .payload = _payload, |
835 | 849 | }; |
| 850 | + struct bitmap_index *bitmap = prepare_bitmap_git(the_repository); |
| 851 | + |
836 | 852 | for_each_loose_object(batch_one_object_loose, &payload, 0); |
837 | | - for_each_packed_object(the_repository, batch_one_object_packed, |
838 | | - &payload, flags); |
| 853 | + |
| 854 | + if (bitmap && !for_each_bitmapped_object(bitmap, &opt->objects_filter, |
| 855 | + batch_one_object_bitmapped, &payload)) { |
| 856 | + struct packed_git *pack; |
| 857 | + |
| 858 | + for (pack = get_all_packs(the_repository); pack; pack = pack->next) { |
| 859 | + if (bitmap_index_contains_pack(bitmap, pack) || |
| 860 | + open_pack_index(pack)) |
| 861 | + continue; |
| 862 | + for_each_object_in_pack(pack, batch_one_object_packed, |
| 863 | + &payload, flags); |
| 864 | + } |
| 865 | + } else { |
| 866 | + for_each_packed_object(the_repository, batch_one_object_packed, |
| 867 | + &payload, flags); |
| 868 | + } |
| 869 | + |
| 870 | + free_bitmap_index(bitmap); |
839 | 871 | } |
840 | 872 |
|
841 | 873 | static int batch_objects(struct batch_options *opt) |
@@ -892,14 +924,14 @@ static int batch_objects(struct batch_options *opt) |
892 | 924 |
|
893 | 925 | cb.seen = &seen; |
894 | 926 |
|
895 | | - batch_each_object(batch_unordered_object, |
| 927 | + batch_each_object(opt, batch_unordered_object, |
896 | 928 | FOR_EACH_OBJECT_PACK_ORDER, &cb); |
897 | 929 |
|
898 | 930 | oidset_clear(&seen); |
899 | 931 | } else { |
900 | 932 | struct oid_array sa = OID_ARRAY_INIT; |
901 | 933 |
|
902 | | - batch_each_object(collect_object, 0, &sa); |
| 934 | + batch_each_object(opt, collect_object, 0, &sa); |
903 | 935 | oid_array_for_each_unique(&sa, batch_object_cb, &cb); |
904 | 936 |
|
905 | 937 | oid_array_clear(&sa); |
|
0 commit comments