+
+ *szp = c - buf;
+ return buf;
+}
+
+static void store_tree(struct tree_entry *root)
+{
+ struct tree_content *t = root->tree;
+ unsigned int i, j, del;
+ unsigned long vers1len;
+ void **vers1dat;
+ struct last_object lo;
+
+ if (!is_null_sha1(root->versions[1].sha1))
+ return;
+
+ for (i = 0; i < t->entry_count; i++) {
+ if (t->entries[i]->tree)
+ store_tree(t->entries[i]);
+ }
+
+ if (is_null_sha1(root->versions[0].sha1)
+ || !find_object(root->versions[0].sha1)) {
+ lo.data = NULL;
+ lo.depth = 0;
+ } else {
+ lo.data = mktree(t, 0, &lo.len);
+ lo.depth = t->delta_depth;
+ hashcpy(lo.sha1, root->versions[0].sha1);
+ }
+ vers1dat = mktree(t, 1, &vers1len);
+
+ store_object(OBJ_TREE, vers1dat, vers1len,
+ &lo, root->versions[1].sha1, 0);
+ /* note: lo.dat (if created) was freed by store_object */
+ free(vers1dat);
+
+ t->delta_depth = lo.depth;
+ hashcpy(root->versions[0].sha1, root->versions[1].sha1);
+ for (i = 0, j = 0, del = 0; i < t->entry_count; i++) {
+ struct tree_entry *e = t->entries[i];
+ if (e->versions[1].mode) {
+ e->versions[0].mode = e->versions[1].mode;
+ hashcpy(e->versions[0].sha1, e->versions[1].sha1);
+ t->entries[j++] = e;
+ } else {
+ release_tree_entry(e);
+ del++;
+ }
+ }
+ t->entry_count -= del;