Commit 54fef6eb by Carlos Martín Nieto

config: write out section headers with subsections correctly

write_section() mistakenly treated is input as the whole variable name
instead of simply the section (and possibly subsection) and would
confuse "section.subsection" as a section plus variable name and
produce a wrong section header.

Fix this and include a test for writing "section.subsection.var" and
reading it from the file.
parent 6cfe3b3f
...@@ -925,22 +925,18 @@ static int config_parse(diskfile_backend *cfg_file) ...@@ -925,22 +925,18 @@ static int config_parse(diskfile_backend *cfg_file)
static int write_section(git_filebuf *file, const char *key) static int write_section(git_filebuf *file, const char *key)
{ {
int error; int error;
const char *fdot, *ldot; const char *dot;
git_buf buf = GIT_BUF_INIT; git_buf buf = GIT_BUF_INIT;
/* All of this just for [section "subsection"] */ /* All of this just for [section "subsection"] */
fdot = strchr(key, '.'); dot = strchr(key, '.');
git_buf_putc(&buf, '['); git_buf_putc(&buf, '[');
if (fdot == NULL) if (dot == NULL) {
git_buf_puts(&buf, key); git_buf_puts(&buf, key);
else } else {
git_buf_put(&buf, key, fdot - key); git_buf_put(&buf, key, dot - key);
ldot = strrchr(key, '.');
if (fdot != ldot && fdot != NULL) {
git_buf_putc(&buf, '"');
/* TODO: escape */ /* TODO: escape */
git_buf_put(&buf, fdot + 1, ldot - fdot - 1); git_buf_printf(&buf, " \"%s\"", dot + 1);
git_buf_putc(&buf, '"');
} }
git_buf_puts(&buf, "]\n"); git_buf_puts(&buf, "]\n");
if (git_buf_oom(&buf)) if (git_buf_oom(&buf))
......
...@@ -67,6 +67,21 @@ void test_config_write__delete_value(void) ...@@ -67,6 +67,21 @@ void test_config_write__delete_value(void)
git_config_free(cfg); 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) void test_config_write__delete_inexistent(void)
{ {
git_config *cfg; git_config *cfg;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment