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

Re: [RFC PATCH] notes: add prepend command

From
Đoàn Trần Công Danh <congdanhqx@gmail.com>
Date
Oct 24, 2024, 11:19 UTC
Message-ID
<ZxotMcKv5rEIMZ8q@danh.dev>
In-Reply-To
<20241023201430.986389-1-bence@ferdinandy.com>
On 2024-10-23 22:14:24+0200, Bence Ferdinandy <bence@ferdinandy.com> wrote:
Show 30 quoted lines
> -static int append_edit(int argc, const char **argv, const char *prefix)
> +
> +static int append_prepend_edit(int argc, const char **argv, const char *prefix, int prepend)
>  {
>  	int allow_empty = 0;
>  	const char *object_ref;
> @@ -716,11 +718,18 @@ static int append_edit(int argc, const char **argv, const char *prefix)
>  
>  		if (!prev_buf)
>  			die(_("unable to read %s"), oid_to_hex(note));
> -		if (size)
> -			strbuf_add(&buf, prev_buf, size);
> -		if (d.buf.len && size)
> -			append_separator(&buf);
> -		strbuf_insert(&d.buf, 0, buf.buf, buf.len);
> +		if (prepend) {
> +			if (d.buf.len && size)
> +				append_separator(&buf);
> +			if (size)
> +				strbuf_add(&buf, prev_buf, size);
> +		} else {
> +			if (size)
> +				strbuf_add(&buf, prev_buf, size);
> +			if (d.buf.len && size)
> +				append_separator(&buf);
> +		}
> +		strbuf_insert(&d.buf, prepend ? d.buf.len : 0, buf.buf, buf.len);
>  
>  		free(prev_buf);
>  		strbuf_release(&buf);

Without prejudice about whether we should take this command. (I think we shouldn't, just like we shouldn't top-posting).

I think this diff should be written like this for easier reasoning:
----- 8< -----------------
@@ -711,19 +713,27 @@ static int append_edit(int argc, const char **argv, const char *prefix)
 		/* Append buf to previous note contents */
 		unsigned long size;
 		enum object_type type;
-		struct strbuf buf = STRBUF_INIT;
 		char *prev_buf = repo_read_object_file(the_repository, note, &type, &size);
 
 		if (!prev_buf)
 			die(_("unable to read %s"), oid_to_hex(note));
-		if (size)
+		if (!size) {
+			// no existing notes, use whatever we have here
+		} else if (prepend) {
+			if (d.buf.len)
+				append_separator(&d.buf);
+			strbuf_add(&d.buf, prev_buf, size);
+		} else {
+			struct strbuf buf = STRBUF_INIT;
 			strbuf_add(&buf, prev_buf, size);
-		if (d.buf.len && size)
-			append_separator(&buf);
-		strbuf_insert(&d.buf, 0, buf.buf, buf.len);
+			if (d.buf.len)
+				append_separator(&buf);
+			strbuf_addbuf(&buf, &d.buf);
+			strbuf_swap(&buf, &d.buf);
+			strbuf_release(&buf);
+		}
 
 		free(prev_buf);
-		strbuf_release(&buf);
 	}
 
 	if (d.buf.len || allow_empty) {
-------------- 8< --------------------

Even if we don't take this subcommand, I think we should re-write the
append part, so:
- we can see the append logic better,
- we can avoid the `strbuf_insert` which will require memmove/memcpy.

Well, the second point is micro-optimisation, so take it with a grain
of salt.


Also tests.
-------------- 8< -----------------------
diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh
index 99137fb235731..5a7ad40fde6a8 100755
--- a/t/t3301-notes.sh
+++ b/t/t3301-notes.sh
@@ -558,6 +558,20 @@ test_expect_success 'listing non-existing notes fails' '
 	test_must_be_empty actual
 '
 
+test_expect_success 'append: specify a separator with an empty arg' '
+	test_when_finished git notes remove HEAD &&
+	cat >expect <<-\EOF &&
+	notes-2
+
+	notes-1
+	EOF
+
+	git notes add -m "notes-1" &&
+	git notes prepend --separator="" -m "notes-2" &&
+	git notes show >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'append: specify a separator with an empty arg' '
 	test_when_finished git notes remove HEAD &&
 	cat >expect <<-\EOF &&
----------- >8 --------------
-- 
Danh
Previous: Bence FerdinandyNext: Bence Ferdinandy
Message 4 of 5 in “notes: add prepend command”
  1. notes: add prepend commandBence Ferdinandy, Oct 23, 2024
  2. Taylor BlauOct 23, 2024
  3. Bence FerdinandyOct 23, 2024
  4. Đoàn Trần Công DanhOct 24, 2024
  5. Bence FerdinandyOct 26, 2024

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.