Browse Source

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

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>
Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Brian Gernhardt 18 years ago committed by Junio C Hamano
parent
commit
cdd4fb15cf
  1. 14
      config.c
  2. 17
      t/t1300-repo-config.sh

14
config.c

@ -513,11 +513,23 @@ static int store_write_pair(int fd, const char* key, const char* value) @@ -513,11 +513,23 @@ static int store_write_pair(int fd, const char* key, const char* value)
{
int i;
int length = strlen(key+store.baselen+1);
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;

if (write_in_full(fd, "\t", 1) != 1 ||
write_in_full(fd, key+store.baselen+1, length) != length ||
write_in_full(fd, " = ", 3) != 3)
return 0;
if (quote && write_in_full(fd, "\"", 1) != 1)
return 0;
for (i = 0; value[i]; i++)
switch (value[i]) {
case '\n':
@ -537,6 +549,8 @@ static int store_write_pair(int fd, const char* key, const char* value) @@ -537,6 +549,8 @@ static int store_write_pair(int fd, const char* key, const char* value)
return 0;
break;
}
if (quote && write_in_full(fd, "\"", 1) != 1)
return 0;
if (write_in_full(fd, "\n", 1) != 1)
return 0;
return 1;

17
t/t1300-repo-config.sh

@ -401,5 +401,22 @@ test_expect_success numbers ' @@ -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


Loading…
Cancel
Save