diff --git a/src/config_file.c b/src/config_file.c index 3c7c593ec..e1f4ef932 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -925,22 +925,18 @@ static int config_parse(diskfile_backend *cfg_file) static int write_section(git_filebuf *file, const char *key) { int error; - const char *fdot, *ldot; + const char *dot; git_buf buf = GIT_BUF_INIT; /* All of this just for [section "subsection"] */ - fdot = strchr(key, '.'); + dot = strchr(key, '.'); git_buf_putc(&buf, '['); - if (fdot == NULL) + if (dot == NULL) { git_buf_puts(&buf, key); - else - git_buf_put(&buf, key, fdot - key); - ldot = strrchr(key, '.'); - if (fdot != ldot && fdot != NULL) { - git_buf_putc(&buf, '"'); + } else { + git_buf_put(&buf, key, dot - key); /* TODO: escape */ - git_buf_put(&buf, fdot + 1, ldot - fdot - 1); - git_buf_putc(&buf, '"'); + git_buf_printf(&buf, " \"%s\"", dot + 1); } git_buf_puts(&buf, "]\n"); if (git_buf_oom(&buf)) diff --git a/tests-clar/config/write.c b/tests-clar/config/write.c index d22c6f2cf..f25bf5a91 100644 --- a/tests-clar/config/write.c +++ b/tests-clar/config/write.c @@ -67,6 +67,21 @@ void test_config_write__delete_value(void) git_config_free(cfg); } +void test_config_write__write_subsection(void) +{ + git_config *cfg; + const char *str; + + cl_git_pass(git_config_open_ondisk(&cfg, "config9")); + cl_git_pass(git_config_set_string(cfg, "my.own.var", "works")); + git_config_free(cfg); + + cl_git_pass(git_config_open_ondisk(&cfg, "config9")); + cl_git_pass(git_config_get_string(cfg, "my.own.var", &str)); + cl_git_pass(strcmp(str, "works")); + git_config_free(cfg); +} + void test_config_write__delete_inexistent(void) { git_config *cfg;