builtin/notes.c: Refactor creation of notes commits.
Create new function create_notes_commit() which is slightly more general than commit_notes() (accepts multiple commit parents and does not auto-update the notes ref). This function will be used by the notes-merge functionality in future patches. Also rewrite builtin/notes.c:commit_notes() to reuse this new function. Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									75ef3f4a5c
								
							
						
					
					
						commit
						56881843d4
					
				|  | @ -17,7 +17,7 @@ extern void prune_packed_objects(int); | ||||||
| extern int fmt_merge_msg(int merge_summary, struct strbuf *in, | extern int fmt_merge_msg(int merge_summary, struct strbuf *in, | ||||||
| 	struct strbuf *out); | 	struct strbuf *out); | ||||||
| extern int fmt_merge_msg_shortlog(struct strbuf *in, struct strbuf *out); | extern int fmt_merge_msg_shortlog(struct strbuf *in, struct strbuf *out); | ||||||
| extern int commit_notes(struct notes_tree *t, const char *msg); | extern void commit_notes(struct notes_tree *t, const char *msg); | ||||||
|  |  | ||||||
| struct notes_rewrite_cfg { | struct notes_rewrite_cfg { | ||||||
| 	struct notes_tree **trees; | 	struct notes_tree **trees; | ||||||
|  |  | ||||||
|  | @ -288,18 +288,17 @@ static int parse_reedit_arg(const struct option *opt, const char *arg, int unset | ||||||
| 	return parse_reuse_arg(opt, arg, unset); | 	return parse_reuse_arg(opt, arg, unset); | ||||||
| } | } | ||||||
|  |  | ||||||
| int commit_notes(struct notes_tree *t, const char *msg) | void 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; | 	struct strbuf buf = STRBUF_INIT; | ||||||
|  | 	unsigned char commit_sha1[20]; | ||||||
|  |  | ||||||
| 	if (!t) | 	if (!t) | ||||||
| 		t = &default_notes_tree; | 		t = &default_notes_tree; | ||||||
| 	if (!t->initialized || !t->ref || !*t->ref) | 	if (!t->initialized || !t->ref || !*t->ref) | ||||||
| 		die("Cannot commit uninitialized/unreferenced notes tree"); | 		die("Cannot commit uninitialized/unreferenced notes tree"); | ||||||
| 	if (!t->dirty) | 	if (!t->dirty) | ||||||
| 		return 0; /* don't have to commit an unchanged tree */ | 		return; /* don't have to commit an unchanged tree */ | ||||||
|  |  | ||||||
| 	/* Prepare commit message and reflog message */ | 	/* Prepare commit message and reflog message */ | ||||||
| 	strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */ | 	strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */ | ||||||
|  | @ -307,27 +306,10 @@ int commit_notes(struct notes_tree *t, const char *msg) | ||||||
| 	if (buf.buf[buf.len - 1] != '\n') | 	if (buf.buf[buf.len - 1] != '\n') | ||||||
| 		strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */ | 		strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */ | ||||||
|  |  | ||||||
| 	/* Convert notes tree to tree object */ | 	create_notes_commit(t, NULL, buf.buf + 7, commit_sha1); | ||||||
| 	if (write_notes_tree(t, tree_sha1)) | 	update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR); | ||||||
| 		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); | 	strbuf_release(&buf); | ||||||
| 	return 0; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| combine_notes_fn parse_combine_notes_fn(const char *v) | combine_notes_fn parse_combine_notes_fn(const char *v) | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| #include "cache.h" | #include "cache.h" | ||||||
| #include "commit.h" | #include "commit.h" | ||||||
| #include "refs.h" | #include "refs.h" | ||||||
|  | #include "notes.h" | ||||||
| #include "notes-merge.h" | #include "notes-merge.h" | ||||||
|  |  | ||||||
| void init_notes_merge_options(struct notes_merge_options *o) | void init_notes_merge_options(struct notes_merge_options *o) | ||||||
|  | @ -17,6 +18,32 @@ void init_notes_merge_options(struct notes_merge_options *o) | ||||||
| 		} \ | 		} \ | ||||||
| 	} while (0) | 	} while (0) | ||||||
|  |  | ||||||
|  | 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 notes_merge(struct notes_merge_options *o, | int notes_merge(struct notes_merge_options *o, | ||||||
| 		unsigned char *result_sha1) | 		unsigned char *result_sha1) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -14,6 +14,20 @@ struct notes_merge_options { | ||||||
|  |  | ||||||
| void init_notes_merge_options(struct notes_merge_options *o); | void init_notes_merge_options(struct notes_merge_options *o); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Create new notes commit from the given notes tree | ||||||
|  |  * | ||||||
|  |  * Properties of the created commit: | ||||||
|  |  * - tree: the result of converting t to a tree object with write_notes_tree(). | ||||||
|  |  * - parents: the given parents OR (if NULL) the commit referenced by t->ref. | ||||||
|  |  * - author/committer: the default determined by commmit_tree(). | ||||||
|  |  * - commit message: msg | ||||||
|  |  * | ||||||
|  |  * The resulting commit SHA1 is stored in result_sha1. | ||||||
|  |  */ | ||||||
|  | void create_notes_commit(struct notes_tree *t, struct commit_list *parents, | ||||||
|  | 			 const char *msg, unsigned char *result_sha1); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Merge notes from o->remote_ref into o->local_ref |  * Merge notes from o->remote_ref into o->local_ref | ||||||
|  * |  * | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Johan Herland
						Johan Herland