mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-04 08:43:55 +00:00
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.
This commit is contained in:
parent
6cfe3b3f12
commit
54fef6ebcb
@ -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))
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user