| 826 | } |
| 827 | |
| 828 | static int build_pseudo_merge_bitmaps(struct bitmap_writer *writer, |
| 829 | struct bitmap_index *old_bitmap, |
| 830 | const uint32_t *mapping, |
| 831 | int *nr_stored) |
| 832 | { |
| 833 | size_t i = bitmap_writer_nr_selected_commits(writer); |
| 834 | int ret = 0; |
| 835 | |
| 836 | if (!writer->pseudo_merges_nr) |
| 837 | return 0; |
| 838 | |
| 839 | trace2_region_enter("pack-bitmap-write", "building_pseudo_merge_bitmaps", |
| 840 | writer->repo); |
| 841 | |
| 842 | for (; i < writer->selected_nr; i++) { |
| 843 | struct bitmapped_commit *merge = &writer->selected[i]; |
| 844 | struct commit_list *p; |
| 845 | struct bitmap *parents = bitmap_new(); |
| 846 | struct ewah_bitmap *objects = NULL; |
| 847 | |
| 848 | if (!merge->pseudo_merge) |
| 849 | BUG("found non-pseudo merge commit at %"PRIuMAX, |
| 850 | (uintmax_t)i); |
| 851 | |
| 852 | for (p = merge->commit->parents; p; p = p->next) { |
| 853 | int found; |
| 854 | uint32_t pos = find_object_pos(writer, |
| 855 | &p->item->object.oid, |
| 856 | &found); |
| 857 | if (!found) { |
| 858 | bitmap_free(parents); |
| 859 | ret = -1; |
| 860 | goto done; |
| 861 | } |
| 862 | bitmap_set(parents, pos); |
| 863 | } |
| 864 | |
| 865 | merge->pseudo_merge_parents = bitmap_to_ewah(parents); |
| 866 | bitmap_free(parents); |
| 867 | |
| 868 | if (build_pseudo_merge_bitmap(writer, old_bitmap, mapping, |
| 869 | merge->commit, &objects) < 0) { |
| 870 | ret = -1; |
| 871 | goto done; |
| 872 | } |
| 873 | merge->bitmap = objects; |
| 874 | |
| 875 | (*nr_stored)++; |
| 876 | display_progress(writer->progress, *nr_stored); |
| 877 | } |
| 878 | |
| 879 | done: |
| 880 | trace2_region_leave("pack-bitmap-write", "building_pseudo_merge_bitmaps", |
| 881 | writer->repo); |
| 882 | |
| 883 | trace2_data_intmax("pack-bitmap-write", writer->repo, |
| 884 | "pseudo_merge_bitmap_nr", |
| 885 | pseudo_merge_bitmap_nr); |
no test coverage detected