Suggested by Jakub Narebski <jnareb@xxxxxxxxx> 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@xxxxxxxxxxxxxxxxxx> --- 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 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html