void create_notes_commit(struct notes_tree *t, struct commit_list *parents, const char *msg, unsigned char *result_sha1) { unsigned char tree_sha1[20]; assert(t->initialized); if (write_notes_tree(t, tree_sha1)) die("Failed to write notes tree to database"); if (!parents) { /* Deduce parent commit from t->ref */ unsigned char parent_sha1[20]; if (!read_ref(t->ref, parent_sha1)) { struct commit *parent = lookup_commit(parent_sha1); if (!parent || parse_commit(parent)) die("Failed to find/parse commit %s", t->ref); commit_list_insert(parent, &parents); } /* else: t->ref points to nothing, assume root/orphan commit */ } if (commit_tree(msg, tree_sha1, parents, result_sha1, NULL)) die("Failed to commit notes tree to database"); }
int commit_notes(struct notes_tree *t, const char *msg) { struct commit_list *parent; unsigned char tree_sha1[20], prev_commit[20], new_commit[20]; struct strbuf buf = STRBUF_INIT; if (!t) t = &default_notes_tree; if (!t->initialized || !t->ref || !*t->ref) die("Cannot commit uninitialized/unreferenced notes tree"); if (!t->dirty) return 0; /* don't have to commit an unchanged tree */ /* Prepare commit message and reflog message */ strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */ strbuf_addstr(&buf, msg); if (buf.buf[buf.len - 1] != '\n') strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */ /* Convert notes tree to tree object */ if (write_notes_tree(t, tree_sha1)) die("Failed to write current notes tree to database"); /* Create new commit for the tree object */ if (!read_ref(t->ref, prev_commit)) { /* retrieve parent commit */ parent = xmalloc(sizeof(*parent)); parent->item = lookup_commit(prev_commit); parent->next = NULL; } else { hashclr(prev_commit); parent = NULL; } if (commit_tree(buf.buf + 7, tree_sha1, parent, new_commit, NULL)) die("Failed to commit notes tree to database"); /* Update notes ref with new commit */ update_ref(buf.buf, t->ref, new_commit, prev_commit, 0, DIE_ON_ERR); strbuf_release(&buf); return 0; }
int notes_cache_write(struct notes_cache *c) { struct object_id tree_oid, commit_oid; if (!c || !c->tree.initialized || !c->tree.update_ref || !*c->tree.update_ref) return -1; if (!c->tree.dirty) return 0; if (write_notes_tree(&c->tree, &tree_oid)) return -1; if (commit_tree(c->validity, strlen(c->validity), &tree_oid, NULL, &commit_oid, NULL, NULL) < 0) return -1; if (update_ref("update notes cache", c->tree.update_ref, &commit_oid, NULL, 0, UPDATE_REFS_QUIET_ON_ERR) < 0) return -1; return 0; }
int notes_cache_write(struct notes_cache *c) { unsigned char tree_sha1[20]; unsigned char commit_sha1[20]; struct strbuf msg = STRBUF_INIT; if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref) return -1; if (!c->tree.dirty) return 0; if (write_notes_tree(&c->tree, tree_sha1)) return -1; strbuf_attach(&msg, c->validity, strlen(c->validity), strlen(c->validity) + 1); if (commit_tree(&msg, tree_sha1, NULL, commit_sha1, NULL, NULL) < 0) return -1; if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL, 0, QUIET_ON_ERR) < 0) return -1; return 0; }