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

[PATCH] Auto-quote config values in config.c:store_write_pair()

From
Brian Gernhardt <benji@silverinsanity.com>
Date
Jan 9, 2007, 05:27 UTC
Message-ID
<20070109052741.GB27927@Hermes.local>
Suggested by Jakub Narebski <jnareb@gmail.com> on the list.

When we send a value to store_write_pair(), make sure that the value that gets read out matches the one passed in. This means that for any value that contains leading or trailing whitespace or any comment character (# and ;), we need to surround it in quotes.

Signed-off-by: Brian Gernhardt <benji@silverinsanity.com>
---
 config.c               |   14 ++++++++++++++
 t/t1300-repo-config.sh |   17 +++++++++++++++++
 2 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/config.c b/config.c
index 5cbd130..e99681a 100644
--- a/config.c
+++ b/config.c
@@ -496,11 +496,23 @@ static void store_write_section(int fd, const char* key)
 static void store_write_pair(int fd, const char* key, const char* value)
 {
 	int i;
+	int quote = 0;
+
+	/* Check to see if the value needs to be quoted. */
+	if (value[0] == ' ')
+		quote = 1;
+	for (i = 0; value[i]; i++)
+		if (value[i] == ';' || value[i] == '#')
+			quote = 1;
+	if (value[i-1] == ' ')
+		quote = 1;
 
 	write(fd, "\t", 1);
 	write(fd, key+store.baselen+1,
 		strlen(key+store.baselen+1));
 	write(fd, " = ", 3);
+	if (quote)
+		write(fd, "\"", 1);
 	for (i = 0; value[i]; i++)
 		switch (value[i]) {
 		case '\n': write(fd, "\\n", 2); break;
@@ -508,6 +520,8 @@ static void store_write_pair(int fd, const char* key, const char* value)
 		case '"': case '\\': write(fd, "\\", 1);
 		default: write(fd, value+i, 1);
 	}
+	if (quote)
+		write(fd, "\"", 1);
 	write(fd, "\n", 1);
 }
 
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index a29caa0..60acdd3 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -401,5 +401,22 @@ test_expect_success numbers '
 	test z1048576 = "z$m"
 '
 
+rm .git/config
+
+git-repo-config quote.leading " test"
+git-repo-config quote.ending "test "
+git-repo-config quote.semicolon "test;test"
+git-repo-config quote.hash "test#test"
+
+cat > expect << EOF
+[quote]
+	leading = " test"
+	ending = "test "
+	semicolon = "test;test"
+	hash = "test#test"
+EOF
+
+test_expect_success 'quoting' 'cmp .git/config expect'
+
 test_done
 
-- 
1.4.4.4.g4083
Next: Junio C Hamano
Message 1 of 4 in “Auto-quote config values in config.c:store_write_pair()”
  1. Auto-quote config values in config.c:store_write_pair()Brian Gernhardt, Jan 9, 2007
  2. Junio C HamanoJan 9, 2007
  3. Johannes SchindelinJan 9, 2007
  4. Johannes SchindelinJan 9, 2007

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.