| 797 | }; |
| 798 | |
| 799 | static enum write_one_status write_one(struct hashfile *f, |
| 800 | struct object_entry *e, |
| 801 | off_t *offset) |
| 802 | { |
| 803 | off_t size; |
| 804 | int recursing; |
| 805 | |
| 806 | /* |
| 807 | * we set offset to 1 (which is an impossible value) to mark |
| 808 | * the fact that this object is involved in "write its base |
| 809 | * first before writing a deltified object" recursion. |
| 810 | */ |
| 811 | recursing = (e->idx.offset == 1); |
| 812 | if (recursing) { |
| 813 | warning(_("recursive delta detected for object %s"), |
| 814 | oid_to_hex(&e->idx.oid)); |
| 815 | return WRITE_ONE_RECURSIVE; |
| 816 | } else if (e->idx.offset || e->preferred_base) { |
| 817 | /* offset is non zero if object is written already. */ |
| 818 | return WRITE_ONE_SKIP; |
| 819 | } |
| 820 | |
| 821 | /* if we are deltified, write out base object first. */ |
| 822 | if (DELTA(e)) { |
| 823 | e->idx.offset = 1; /* now recurse */ |
| 824 | switch (write_one(f, DELTA(e), offset)) { |
| 825 | case WRITE_ONE_RECURSIVE: |
| 826 | /* we cannot depend on this one */ |
| 827 | SET_DELTA(e, NULL); |
| 828 | break; |
| 829 | default: |
| 830 | break; |
| 831 | case WRITE_ONE_BREAK: |
| 832 | e->idx.offset = recursing; |
| 833 | return WRITE_ONE_BREAK; |
| 834 | } |
| 835 | } |
| 836 | |
| 837 | e->idx.offset = *offset; |
| 838 | size = write_object(f, e, *offset); |
| 839 | if (!size) { |
| 840 | e->idx.offset = recursing; |
| 841 | return WRITE_ONE_BREAK; |
| 842 | } |
| 843 | written_list[nr_written++] = &e->idx; |
| 844 | |
| 845 | /* make sure off_t is sufficiently large not to wrap */ |
| 846 | if (signed_add_overflows(*offset, size)) |
| 847 | die(_("pack too large for current definition of off_t")); |
| 848 | *offset += size; |
| 849 | return WRITE_ONE_WRITTEN; |
| 850 | } |
| 851 | |
| 852 | static int mark_tagged(const struct reference *ref, void *cb_data UNUSED) |
| 853 | { |
no test coverage detected