| 569 | } |
| 570 | |
| 571 | static int fill_bitmap_tree(struct bitmap_writer *writer, |
| 572 | struct bitmap *bitmap, |
| 573 | struct tree *tree, |
| 574 | uint32_t pos) |
| 575 | { |
| 576 | int found; |
| 577 | struct tree_desc desc; |
| 578 | struct name_entry entry; |
| 579 | |
| 580 | bitmap_set(bitmap, pos); |
| 581 | |
| 582 | if (repo_parse_tree(writer->repo, tree) < 0) |
| 583 | die("unable to load tree object %s", |
| 584 | oid_to_hex(&tree->object.oid)); |
| 585 | init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size); |
| 586 | |
| 587 | while (tree_entry(&desc, &entry)) { |
| 588 | switch (object_type(entry.mode)) { |
| 589 | case OBJ_TREE: |
| 590 | pos = find_object_pos(writer, &entry.oid, &found); |
| 591 | if (!found) |
| 592 | return -1; |
| 593 | if (bitmap_get(bitmap, pos)) { |
| 594 | /* |
| 595 | * If our bit is already set, then there |
| 596 | * is nothing to do. Both this tree and |
| 597 | * all of its children will be set. |
| 598 | */ |
| 599 | break; |
| 600 | } |
| 601 | |
| 602 | if (fill_bitmap_tree(writer, bitmap, |
| 603 | lookup_tree(writer->repo, |
| 604 | &entry.oid), pos) < 0) |
| 605 | return -1; |
| 606 | break; |
| 607 | case OBJ_BLOB: |
| 608 | pos = find_object_pos(writer, &entry.oid, &found); |
| 609 | if (!found) |
| 610 | return -1; |
| 611 | bitmap_set(bitmap, pos); |
| 612 | break; |
| 613 | default: |
| 614 | /* Gitlink, etc; not reachable */ |
| 615 | break; |
| 616 | } |
| 617 | } |
| 618 | |
| 619 | free_tree_buffer(tree); |
| 620 | return 0; |
| 621 | } |
| 622 | |
| 623 | static int reused_bitmaps_nr; |
| 624 | static int reused_pseudo_merge_bitmaps_nr; |
no test coverage detected