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

[PATCH v2] builtin/help.c: move strbuf out of help loops

From
Siddharth Shrimali <r.siddharth.shrimali@gmail.com>
Date
Mar 10, 2026, 16:00 UTC
Message-ID
<20260310160029.44605-1-r.siddharth.shrimali@gmail.com>
In-Reply-To
<abARj_VI9n2nB_xT@pks.im>

In list_config_help(), a strbuf was being initialized and released inside two separate loops. This caused unnecessary memory allocation and deallocation on every iteration.

Move the strbuf declaration to the top of the function and use strbuf_reset() inside the loops to reuse the same buffer. Similarly release() the buffer at the end of the function to free the memory. This improves performance by avoiding repeated heap pressure by reducing the number of allocations.

This also fixes a minor memory leak when the SHOW_CONFIG_HUMAN case triggers a continue.

Suggested-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Siddharth Shrimali <r.siddharth.shrimali@gmail.com>
---
Changes in v2:
- Moved strbuf_reset() after variable declarations to follow 
  coding standards.
- Removed unnecessary empty lines to tighten the code as suggested 
  by Patrick.
 builtin/help.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/builtin/help.c b/builtin/help.c
index 86a3d03a9b..467a0763a6 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -134,13 +134,11 @@ static void list_config_help(enum show_config_type type)
 	struct string_list keys = STRING_LIST_INIT_DUP;
 	struct string_list keys_uniq = STRING_LIST_INIT_DUP;
 	struct string_list_item *item;
+	struct strbuf sb = STRBUF_INIT;
 
 	for (p = config_name_list; *p; p++) {
 		const char *var = *p;
-		struct strbuf sb = STRBUF_INIT;
-
 		for (e = slot_expansions; e->prefix; e++) {
-
 			strbuf_reset(&sb);
 			strbuf_addf(&sb, "%s.%s", e->prefix, e->placeholder);
 			if (!strcasecmp(var, sb.buf)) {
@@ -149,7 +147,6 @@ static void list_config_help(enum show_config_type type)
 				break;
 			}
 		}
-		strbuf_release(&sb);
 		if (!e->prefix)
 			string_list_append(&keys, var);
 	}
@@ -164,7 +161,7 @@ static void list_config_help(enum show_config_type type)
 		const char *var = keys.items[i].string;
 		const char *wildcard, *tag, *cut;
 		const char *dot = NULL;
-		struct strbuf sb = STRBUF_INIT;
+		strbuf_reset(&sb);
 
 		switch (type) {
 		case SHOW_CONFIG_HUMAN:
@@ -195,13 +192,13 @@ static void list_config_help(enum show_config_type type)
 
 		strbuf_add(&sb, var, cut - var);
 		string_list_append(&keys_uniq, sb.buf);
-		strbuf_release(&sb);
 
 	}
 	string_list_clear(&keys, 0);
 	string_list_remove_duplicates(&keys_uniq, 0);
 	for_each_string_list_item(item, &keys_uniq)
 		puts(item->string);
+	strbuf_release(&sb);
 	string_list_clear(&keys_uniq, 0);
 }
 
-- 
2.51.2
Previous: Patrick SteinhardtNext: Junio C Hamano
Message 3 of 7 in “builtin/help.c: move strbuf out of help loops”
  1. builtin/help.c: move strbuf out of help loopsSiddharth Shrimali, Mar 10, 2026
  2. Patrick SteinhardtMar 10, 2026
  3. builtin/help.c: move strbuf out of help loopsSiddharth Shrimali, Mar 10, 2026
  4. Junio C HamanoMar 10, 2026
  5. Siddharth ShrimaliMar 11, 2026
  6. Amisha ChhajedMar 11, 2026
  7. Junio C HamanoMar 11, 2026

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.