| 604 | } |
| 605 | |
| 606 | static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator) |
| 607 | { |
| 608 | struct reftable_ref_iterator *iter = |
| 609 | (struct reftable_ref_iterator *)ref_iterator; |
| 610 | struct reftable_ref_store *refs = iter->refs; |
| 611 | const char *referent = NULL; |
| 612 | |
| 613 | while (!iter->err) { |
| 614 | int flags = 0; |
| 615 | |
| 616 | iter->err = reftable_iterator_next_ref(&iter->iter, &iter->ref); |
| 617 | if (iter->err) |
| 618 | break; |
| 619 | |
| 620 | /* |
| 621 | * The files backend only lists references contained in "refs/" unless |
| 622 | * the root refs are to be included. We emulate the same behaviour here. |
| 623 | */ |
| 624 | if (!starts_with(iter->ref.refname, "refs/") && |
| 625 | !(iter->flags & REFS_FOR_EACH_INCLUDE_ROOT_REFS && |
| 626 | is_root_ref(iter->ref.refname))) { |
| 627 | continue; |
| 628 | } |
| 629 | |
| 630 | if (iter->prefix_len && |
| 631 | strncmp(iter->prefix, iter->ref.refname, iter->prefix_len)) { |
| 632 | iter->err = 1; |
| 633 | break; |
| 634 | } |
| 635 | |
| 636 | if (iter->exclude_patterns && should_exclude_current_ref(iter)) |
| 637 | continue; |
| 638 | |
| 639 | if (iter->flags & REFS_FOR_EACH_PER_WORKTREE_ONLY && |
| 640 | parse_worktree_ref(iter->ref.refname, NULL, NULL, NULL) != |
| 641 | REF_WORKTREE_CURRENT) |
| 642 | continue; |
| 643 | |
| 644 | switch (iter->ref.value_type) { |
| 645 | case REFTABLE_REF_VAL1: |
| 646 | oidread(&iter->oid, iter->ref.value.val1, |
| 647 | refs->base.repo->hash_algo); |
| 648 | break; |
| 649 | case REFTABLE_REF_VAL2: |
| 650 | oidread(&iter->oid, iter->ref.value.val2.value, |
| 651 | refs->base.repo->hash_algo); |
| 652 | oidread(&iter->peeled_oid, iter->ref.value.val2.target_value, |
| 653 | refs->base.repo->hash_algo); |
| 654 | break; |
| 655 | case REFTABLE_REF_SYMREF: |
| 656 | referent = refs_resolve_ref_unsafe(&iter->refs->base, |
| 657 | iter->ref.refname, |
| 658 | RESOLVE_REF_READING, |
| 659 | &iter->oid, &flags); |
| 660 | if (!referent) |
| 661 | oidclr(&iter->oid, refs->base.repo->hash_algo); |
| 662 | break; |
| 663 | default: |
nothing calls this directly
no test coverage detected