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

[PATCHv3 05/21] notes.h/c: Clarify the handling of notes objects that are == null_sha1

From
Johan Herland <johan@herland.net>
Date
Oct 9, 2010, 01:11 UTC
Message-ID
<1286586701-3586-6-git-send-email-johan@herland.net>
In-Reply-To
<1286586528-3473-1-git-send-email-johan@herland.net>

Clearly specify how combine_notes functions are expected to handle null_sha1 in input. Also specify (and implement) that returning null_sha1 from a combine_notes function will cause the note in question to be removed.

Furthermore, document that passing note_sha1 == null_sha1 to add_note() is usually a no-op, except in cases where combining it with an existing note yields a new/changed result.

Signed-off-by: Johan Herland <johan@herland.net>
---
 notes.c |   12 +++++++++++-
 notes.h |   16 +++++++++++++++-
 2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/notes.c b/notes.c
index bfb3ea5..0c13a36 100644
--- a/notes.c
+++ b/notes.c
@@ -248,7 +248,10 @@ static void note_tree_insert(struct notes_tree *t, struct int_node *tree,
 	switch (GET_PTR_TYPE(*p)) {
 	case PTR_TYPE_NULL:
 		assert(!*p);
-		*p = SET_PTR_TYPE(entry, type);
+		if (is_null_sha1(entry->val_sha1))
+			free(entry);
+		else
+			*p = SET_PTR_TYPE(entry, type);
 		return;
 	case PTR_TYPE_NOTE:
 		switch (type) {
@@ -264,6 +267,9 @@ static void note_tree_insert(struct notes_tree *t, struct int_node *tree,
 					    sha1_to_hex(l->val_sha1),
 					    sha1_to_hex(entry->val_sha1),
 					    sha1_to_hex(l->key_sha1));
+
+				if (is_null_sha1(l->val_sha1))
+					note_tree_remove(t, tree, n, entry);
 				free(entry);
 				return;
 			}
@@ -295,6 +301,10 @@ static void note_tree_insert(struct notes_tree *t, struct int_node *tree,
 	/* non-matching leaf_node */
 	assert(GET_PTR_TYPE(*p) == PTR_TYPE_NOTE ||
 	       GET_PTR_TYPE(*p) == PTR_TYPE_SUBTREE);
+	if (is_null_sha1(entry->val_sha1)) { /* skip insertion of empty note */
+		free(entry);
+		return;
+	}
 	new_node = (struct int_node *) xcalloc(sizeof(struct int_node), 1);
 	note_tree_insert(t, new_node, n + 1, l, GET_PTR_TYPE(*p),
 			 combine_notes);
diff --git a/notes.h b/notes.h
index 20db42f..79ea797 100644
--- a/notes.h
+++ b/notes.h
@@ -12,7 +12,10 @@
  * resulting SHA1 into the first SHA1 argument (cur_sha1). A non-zero return
  * value indicates failure.
  *
- * The two given SHA1s must both be non-NULL and different from each other.
+ * The two given SHA1s shall both be non-NULL and different from each other.
+ * Either of them (but not both) may be == null_sha1, which indicates an
+ * empty/non-existent note. If the resulting SHA1 (cur_sha1) is == null_sha1,
+ * the note will be removed from the notes tree.
  *
  * The default combine_notes function (you get this when passing NULL) is
  * combine_notes_concatenate(), which appends the contents of the new note to
@@ -90,6 +93,17 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
 /*
  * Add the given note object to the given notes_tree structure
  *
+ * If there already exists a note for the given object_sha1, the given
+ * combine_notes function is invoked to break the tie. If not given (i.e.
+ * combine_notes == NULL), the default combine_notes function for the given
+ * notes_tree is used.
+ *
+ * Passing note_sha1 == null_sha1 indicates the addition of an
+ * empty/non-existent note. This is a (potentially expensive) no-op unless
+ * there already exists a note for the given object_sha1, AND combining that
+ * note with the empty note (using the given combine_notes function) results
+ * in a new/changed note.
+ *
  * IMPORTANT: The changes made by add_note() to the given notes_tree structure
  * are not persistent until a subsequent call to write_notes_tree() returns
  * zero.
-- 
1.7.3.1.104.g92b87a
Previous: Jonathan NiederNext: Johan Herland
Message 8 of 25 in “[PATCHv3 00/21] git notes merge”
  1. Johan HerlandOct 9, 2010
  2. 01/21 notes.c: Hexify SHA1 in die() message from init_notes()Johan Herland, Oct 9, 2010
  3. 02/21 (trivial) notes.h: Minor documentation fixes to copy_notes()Johan Herland, Oct 9, 2010
  4. 03/21 notes.h: Make default_notes_ref() available in notes APIJohan Herland, Oct 9, 2010
  5. 04/21 notes.c: Reorder functions in preparation for next commitJohan Herland, Oct 9, 2010
  6. Junio C HamanoOct 13, 2010
  7. Jonathan NiederOct 13, 2010
  8. 05/21 notes.h/c: Clarify the handling of notes objects that are == null_sha1Johan Herland, Oct 9, 2010
  9. 06/21 notes.h/c: Propagate combine_notes_fn return value to add_note() and beyondJohan Herland, Oct 9, 2010
  10. 07/21 (trivial) t3303: Indent with tabs instead of spaces for consistencyJohan Herland, Oct 9, 2010
  11. 08/21 notes.c: Use two newlines (instead of one) when concatenating notesJohan Herland, Oct 9, 2010
  12. 09/21 builtin/notes.c: Split notes ref DWIMmery into a separate functionJohan Herland, Oct 9, 2010
  13. 10/21 git notes merge: Initial implementation handling trivial merges onlyJohan Herland, Oct 9, 2010
  14. 11/21 builtin/notes.c: Refactor creation of notes commits.Johan Herland, Oct 9, 2010
  15. 12/21 git notes merge: Handle real, non-conflicting notes mergesJohan Herland, Oct 9, 2010
  16. 13/21 git notes merge: Add automatic conflict resolvers (ours, theirs, union)Johan Herland, Oct 9, 2010
  17. 14/21 Documentation: Preliminary docs on 'git notes merge'Johan Herland, Oct 9, 2010
  18. 15/21 git notes merge: Manual conflict resolution, part 1/2Johan Herland, Oct 9, 2010
  19. 16/21 git notes merge: Manual conflict resolution, part 2/2Johan Herland, Oct 9, 2010
  20. 17/21 git notes merge: List conflicting notes in notes merge commit messageJohan Herland, Oct 9, 2010
  21. 18/21 git notes merge: --commit should fail if underlying notes ref has movedJohan Herland, Oct 9, 2010
  22. 19/21 git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"Johan Herland, Oct 9, 2010
  23. 20/21 git notes merge: Add testcases for merging notes trees at different fanoutsJohan Herland, Oct 9, 2010
  24. 21/21 Provide 'git notes get-ref' to easily retrieve current notes refJohan Herland, Oct 9, 2010
  25. Sverre RabbelierOct 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.