git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Johan Herland <johan@herland.net>
To: git@vger.kernel.org
Cc: johan@herland.net, jrnieder@gmail.com, bebarino@gmail.com,
	avarab@gmail.com, gitster@pobox.com, srabbelier@gmail.com
Subject: [PATCHv5 11/23] builtin/notes.c: Refactor creation of notes commits.
Date: Mon, 25 Oct 2010 02:08:41 +0200	[thread overview]
Message-ID: <1287965333-5099-12-git-send-email-johan@herland.net> (raw)
In-Reply-To: <1287965333-5099-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 cd917f9..6ffa6e7 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.98.g5ad7d9

  parent reply	other threads:[~2010-10-25  0:10 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-25  0:08 [PATCHv5 00/23] git notes merge Johan Herland
2010-10-25  0:08 ` [PATCHv5 01/23] notes.c: Hexify SHA1 in die() message from init_notes() Johan Herland
2010-10-25  0:08 ` [PATCHv5 02/23] (trivial) notes.h: Minor documentation fixes to copy_notes() Johan Herland
2010-10-25  0:08 ` [PATCHv5 03/23] notes.h: Make default_notes_ref() available in notes API Johan Herland
2010-10-25  0:08 ` [PATCHv5 04/23] notes.c: Reorder functions in preparation for next commit Johan Herland
2010-10-25  0:08 ` [PATCHv5 05/23] notes.h/c: Allow combine_notes functions to remove notes Johan Herland
2010-10-25  0:08 ` [PATCHv5 06/23] notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond Johan Herland
2010-10-25  0:08 ` [PATCHv5 07/23] (trivial) t3303: Indent with tabs instead of spaces for consistency Johan Herland
2010-10-25  0:08 ` [PATCHv5 08/23] notes.c: Use two newlines (instead of one) when concatenating notes Johan Herland
2010-10-25  0:08 ` [PATCHv5 09/23] builtin/notes.c: Split notes ref DWIMmery into a separate function Johan Herland
2010-10-25  0:08 ` [PATCHv5 10/23] git notes merge: Initial implementation handling trivial merges only Johan Herland
2010-10-25  0:08 ` Johan Herland [this message]
2010-10-25  0:08 ` [PATCHv5 12/23] git notes merge: Handle real, non-conflicting notes merges Johan Herland
2010-10-25  0:08 ` [PATCHv5 13/23] git notes merge: Add automatic conflict resolvers (ours, theirs, union) Johan Herland
2010-10-25  0:08 ` [PATCHv5 14/23] Documentation: Preliminary docs on 'git notes merge' Johan Herland
2010-10-25  0:08 ` [PATCHv5 15/23] git notes merge: Manual conflict resolution, part 1/2 Johan Herland
2010-10-25  0:08 ` [PATCHv5 16/23] git notes merge: Manual conflict resolution, part 2/2 Johan Herland
2010-10-25  0:08 ` [PATCHv5 17/23] git notes merge: List conflicting notes in notes merge commit message Johan Herland
2010-10-25  0:08 ` [PATCHv5 18/23] git notes merge: --commit should fail if underlying notes ref has moved Johan Herland
2010-10-25  0:08 ` [PATCHv5 19/23] git notes merge: Add another auto-resolving strategy: "cat_sort_uniq" Johan Herland
2010-10-25  0:08 ` [PATCHv5 20/23] git notes merge: Add testcases for merging notes trees at different fanouts Johan Herland
2010-10-29 15:01   ` Junio C Hamano
2010-11-01  0:09     ` Johan Herland
2010-10-25  0:08 ` [PATCHv5 21/23] Provide 'git notes get-ref' to easily retrieve current notes ref Johan Herland
2010-10-25  0:08 ` [PATCHv5 22/23] cmd_merge(): Parse options before checking MERGE_HEAD Johan Herland
2010-10-25  0:08 ` [PATCHv5 23/23] Provide 'git merge --abort' as a synonym to 'git reset --merge' Johan Herland
2010-10-25  1:32   ` Jonathan Nieder
2010-10-25 10:02     ` Johan Herland
2010-10-26  1:26       ` Johan Herland
2010-10-26  1:30         ` [PATCHv5.1 22/23] cmd_merge(): Parse options before checking MERGE_HEAD Johan Herland
2010-10-26  1:34         ` [PATCHv5.1 23/23] Provide 'git merge --abort' as a synonym to 'git reset --merge' Johan Herland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1287965333-5099-12-git-send-email-johan@herland.net \
    --to=johan@herland.net \
    --cc=avarab@gmail.com \
    --cc=bebarino@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=srabbelier@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).