|
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