git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCHv6 11/23] builtin/notes.c: Refactor creation of notes commits.

From
Johan Herland <johan@herland.net>
Date
Nov 9, 2010, 21:49 UTC
Message-ID
<1289339399-4733-12-git-send-email-johan@herland.net>
In-Reply-To
<1289339399-4733-1-git-send-email-johan@herland.net>

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>
---
 builtin.h       |    2 +-
 builtin/notes.c |   28 +++++-----------------------
 notes-merge.c   |   27 +++++++++++++++++++++++++++
 notes-merge.h   |   14 ++++++++++++++
 4 files changed, 47 insertions(+), 24 deletions(-)
diff --git a/builtin.h b/builtin.h
index ed6ee26..908d850 100644
--- a/builtin.h
+++ b/builtin.h
@@ -17,7 +17,7 @@ extern void prune_packed_objects(int);
 extern int fmt_merge_msg(int merge_summary, 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_tree **trees;
diff --git a/builtin/notes.c b/builtin/notes.c
index fbabdc7..97d8baa 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -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);
 }
 
-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;
+	unsigned char commit_sha1[20];
 
 	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 */
+		return; /* don't have to commit an unchanged tree */
 
 	/* Prepare commit message and reflog message */
 	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')
 		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);
+	create_notes_commit(t, NULL, buf.buf + 7, commit_sha1);
+	update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR);
 
 	strbuf_release(&buf);
-	return 0;
 }
 
 combine_notes_fn parse_combine_notes_fn(const char *v)
diff --git a/notes-merge.c b/notes-merge.c
index ab98850..b9956c3 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "commit.h"
 #include "refs.h"
+#include "notes.h"
 #include "notes-merge.h"
 
 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)
 
+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,
 		unsigned char *result_sha1)
 {
diff --git a/notes-merge.h b/notes-merge.h
index fd572ac..49e1b3a 100644
--- a/notes-merge.h
+++ b/notes-merge.h
@@ -15,6 +15,20 @@ struct notes_merge_options {
 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
  *
  * The commits given by the two refs are merged, producing one of the following
-- 
1.7.3.2.173.gab1c9.dirty
Previous: Johan HerlandNext: Johan Herland
Message 19 of 31 in “[PATCHv6 00/23] git notes merge”
  1. Johan HerlandNov 9, 2010
  2. 01/23 notes.c: Hexify SHA1 in die() message from init_notes()Johan Herland, Nov 9, 2010
  3. 02/23 (trivial) notes.h: Minor documentation fixes to copy_notes()Johan Herland, Nov 9, 2010
  4. 03/23 notes.h: Make default_notes_ref() available in notes APIJohan Herland, Nov 9, 2010
  5. 04/23 notes.c: Reorder functions in preparation for next commitJohan Herland, Nov 9, 2010
  6. 05/23 notes.h/c: Allow combine_notes functions to remove notesJohan Herland, Nov 9, 2010
  7. 06/23 notes.h/c: Propagate combine_notes_fn return value to add_note() and beyondJohan Herland, Nov 9, 2010
  8. Thiago FarinaNov 14, 2010
  9. Jonathan NiederNov 14, 2010
  10. Johan HerlandNov 14, 2010
  11. 06/23 notes.h/c: Propagate combine_notes_fn return value to add_note() and beyondJohan Herland, Nov 14, 2010
  12. 12/23 git notes merge: Handle real, non-conflicting notes mergesJohan Herland, Nov 14, 2010
  13. 13/23 git notes merge: Add automatic conflict resolvers (ours, theirs, union)Johan Herland, Nov 14, 2010
  14. 19/23 git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"Johan Herland, Nov 14, 2010
  15. 07/23 (trivial) t3303: Indent with tabs instead of spaces for consistencyJohan Herland, Nov 9, 2010
  16. 08/23 notes.c: Use two newlines (instead of one) when concatenating notesJohan Herland, Nov 9, 2010
  17. 09/23 builtin/notes.c: Split notes ref DWIMmery into a separate functionJohan Herland, Nov 9, 2010
  18. 10/23 git notes merge: Initial implementation handling trivial merges onlyJohan Herland, Nov 9, 2010
  19. 11/23 builtin/notes.c: Refactor creation of notes commits.Johan Herland, Nov 9, 2010
  20. 12/23 git notes merge: Handle real, non-conflicting notes mergesJohan Herland, Nov 9, 2010
  21. 13/23 git notes merge: Add automatic conflict resolvers (ours, theirs, union)Johan Herland, Nov 9, 2010
  22. 14/23 Documentation: Preliminary docs on 'git notes merge'Johan Herland, Nov 9, 2010
  23. 15/23 git notes merge: Manual conflict resolution, part 1/2Johan Herland, Nov 9, 2010
  24. 16/23 git notes merge: Manual conflict resolution, part 2/2Johan Herland, Nov 9, 2010
  25. 17/23 git notes merge: List conflicting notes in notes merge commit messageJohan Herland, Nov 9, 2010
  26. 18/23 git notes merge: --commit should fail if underlying notes ref has movedJohan Herland, Nov 9, 2010
  27. 19/23 git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"Johan Herland, Nov 9, 2010
  28. 20/23 git notes merge: Add testcases for merging notes trees at different fanoutsJohan Herland, Nov 9, 2010
  29. 21/23 Provide 'git notes get-ref' to easily retrieve current notes refJohan Herland, Nov 9, 2010
  30. 22/23 cmd_merge(): Parse options before checking MERGE_HEADJohan Herland, Nov 9, 2010
  31. 23/23 Provide 'git merge --abort' as a synonym to 'git reset --merge'Johan Herland, Nov 9, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.