int write_notes_tree(struct notes_tree *t, struct object_id *result) { struct tree_write_stack root; struct write_each_note_data cb_data; int ret; int flags; if (!t) t = &default_notes_tree; assert(t->initialized); /* Prepare for traversal of current notes tree */ root.next = NULL; /* last forward entry in list is grounded */ strbuf_init(&root.buf, 256 * (32 + GIT_SHA1_HEXSZ)); /* assume 256 entries */ root.path[0] = root.path[1] = '\0'; cb_data.root = &root; cb_data.next_non_note = t->first_non_note; /* Write tree objects representing current notes tree */ flags = FOR_EACH_NOTE_DONT_UNPACK_SUBTREES | FOR_EACH_NOTE_YIELD_SUBTREES; ret = for_each_note(t, flags, write_each_note, &cb_data) || write_each_non_note_until(NULL, &cb_data) || tree_write_stack_finish_subtree(&root) || write_object_file(root.buf.buf, root.buf.len, tree_type, result); strbuf_release(&root.buf); return ret; }
static int write_each_note(const struct object_id *object_oid, const struct object_id *note_oid, char *note_path, void *cb_data) { struct write_each_note_data *d = (struct write_each_note_data *) cb_data; size_t note_path_len = strlen(note_path); unsigned int mode = 0100644; if (note_path[note_path_len - 1] == '/') { /* subtree entry */ note_path_len--; note_path[note_path_len] = '\0'; mode = 040000; } assert(note_path_len <= GIT_SHA1_HEXSZ + FANOUT_PATH_SEPARATORS); /* Weave non-note entries into note entries */ return write_each_non_note_until(note_path, d) || write_each_note_helper(d->root, note_path, mode, note_oid); }
static int write_each_note(const unsigned char *object_sha1, const unsigned char *note_sha1, char *note_path, void *cb_data) { struct write_each_note_data *d = (struct write_each_note_data *) cb_data; size_t note_path_len = strlen(note_path); unsigned int mode = 0100644; if (note_path[note_path_len - 1] == '/') { /* subtree entry */ note_path_len--; note_path[note_path_len] = '\0'; mode = 040000; } assert(note_path_len <= 40 + 19); /* Weave non-note entries into note entries */ return write_each_non_note_until(note_path, d) || write_each_note_helper(d->root, note_path, mode, note_sha1); }