| 2057 | } |
| 2058 | |
| 2059 | int for_each_bitmapped_object(struct bitmap_index *bitmap_git, |
| 2060 | struct list_objects_filter_options *filter, |
| 2061 | show_reachable_fn show_reach, |
| 2062 | void *payload) |
| 2063 | { |
| 2064 | struct bitmap *filtered_bitmap = NULL; |
| 2065 | uint32_t objects_nr; |
| 2066 | size_t full_word_count; |
| 2067 | int ret; |
| 2068 | |
| 2069 | if (!can_filter_bitmap(filter)) { |
| 2070 | ret = -1; |
| 2071 | goto out; |
| 2072 | } |
| 2073 | |
| 2074 | objects_nr = bitmap_num_objects(bitmap_git); |
| 2075 | full_word_count = objects_nr / BITS_IN_EWORD; |
| 2076 | |
| 2077 | /* We start from the all-1 bitmap and then filter down from there. */ |
| 2078 | filtered_bitmap = bitmap_word_alloc(full_word_count + !!(objects_nr % BITS_IN_EWORD)); |
| 2079 | memset(filtered_bitmap->words, 0xff, full_word_count * sizeof(*filtered_bitmap->words)); |
| 2080 | for (size_t i = full_word_count * BITS_IN_EWORD; i < objects_nr; i++) |
| 2081 | bitmap_set(filtered_bitmap, i); |
| 2082 | |
| 2083 | if (filter_bitmap(bitmap_git, NULL, filtered_bitmap, filter) < 0) { |
| 2084 | ret = -1; |
| 2085 | goto out; |
| 2086 | } |
| 2087 | |
| 2088 | show_objects_for_type(bitmap_git, filtered_bitmap, |
| 2089 | OBJ_COMMIT, show_reach, payload); |
| 2090 | show_objects_for_type(bitmap_git, filtered_bitmap, |
| 2091 | OBJ_TREE, show_reach, payload); |
| 2092 | show_objects_for_type(bitmap_git, filtered_bitmap, |
| 2093 | OBJ_BLOB, show_reach, payload); |
| 2094 | show_objects_for_type(bitmap_git, filtered_bitmap, |
| 2095 | OBJ_TAG, show_reach, payload); |
| 2096 | |
| 2097 | ret = 0; |
| 2098 | out: |
| 2099 | bitmap_free(filtered_bitmap); |
| 2100 | return ret; |
| 2101 | } |
| 2102 | |
| 2103 | struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs, |
| 2104 | int filter_provided_objects) |
no test coverage detected