| 3827 | } |
| 3828 | |
| 3829 | static int write_tree(struct repository *repo, |
| 3830 | struct object_id *result_oid, |
| 3831 | struct string_list *versions, |
| 3832 | unsigned int offset) |
| 3833 | { |
| 3834 | size_t maxlen = 0, extra; |
| 3835 | unsigned int nr; |
| 3836 | struct strbuf buf = STRBUF_INIT; |
| 3837 | int i, ret = 0; |
| 3838 | size_t hash_size = repo->hash_algo->rawsz; |
| 3839 | |
| 3840 | assert(offset <= versions->nr); |
| 3841 | nr = versions->nr - offset; |
| 3842 | if (versions->nr) |
| 3843 | /* No need for STABLE_QSORT -- filenames must be unique */ |
| 3844 | QSORT(versions->items + offset, nr, tree_entry_order); |
| 3845 | |
| 3846 | /* Pre-allocate some space in buf */ |
| 3847 | extra = hash_size + 8; /* 8: 6 for mode, 1 for space, 1 for NUL char */ |
| 3848 | for (i = 0; i < nr; i++) { |
| 3849 | maxlen += strlen(versions->items[offset+i].string) + extra; |
| 3850 | } |
| 3851 | strbuf_grow(&buf, maxlen); |
| 3852 | |
| 3853 | /* Write each entry out to buf */ |
| 3854 | for (i = 0; i < nr; i++) { |
| 3855 | struct merged_info *mi = versions->items[offset+i].util; |
| 3856 | struct version_info *ri = &mi->result; |
| 3857 | strbuf_addf(&buf, "%o %s%c", |
| 3858 | ri->mode, |
| 3859 | versions->items[offset+i].string, '\0'); |
| 3860 | strbuf_add(&buf, ri->oid.hash, hash_size); |
| 3861 | } |
| 3862 | |
| 3863 | /* Write this object file out, and record in result_oid */ |
| 3864 | if (odb_write_object(repo->objects, buf.buf, |
| 3865 | buf.len, OBJ_TREE, result_oid)) |
| 3866 | ret = -1; |
| 3867 | strbuf_release(&buf); |
| 3868 | return ret; |
| 3869 | } |
| 3870 | |
| 3871 | static void record_entry_for_tree(struct directory_versions *dir_metadata, |
| 3872 | const char *path, |
no test coverage detected