mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-07 23:19:28 +00:00
Test setting config var under duplicate header.
Add a test that exposes a bug in config_write. It is valid to have multiple separate headers for the same config section, but config_write will exit after finding the first matching section in certain situations. This test proves that config_write will duplicate a variable that already exists instead of overwriting it if the variable is defined under a duplicate section header.
This commit is contained in:
parent
2a950c945a
commit
5a70df9436
@ -145,6 +145,55 @@ void test_config_write__delete_value_with_duplicate_header(void)
|
|||||||
git_config_free(cfg);
|
git_config_free(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This test exposes a bug where duplicate section headers could cause
|
||||||
|
* config_write to add a new entry when one already exists.
|
||||||
|
*/
|
||||||
|
void test_config_write__add_value_with_duplicate_header(void)
|
||||||
|
{
|
||||||
|
const char *file_name = "config-duplicate-insert";
|
||||||
|
const char *entry_name = "foo.c";
|
||||||
|
const char *old_val = "old";
|
||||||
|
const char *new_val = "new";
|
||||||
|
const char *str;
|
||||||
|
git_config *cfg, *snapshot;
|
||||||
|
|
||||||
|
/* c = old should be replaced by c = new.
|
||||||
|
* The bug causes c = new to be inserted under the first 'foo' header.
|
||||||
|
*/
|
||||||
|
const char *file_content =
|
||||||
|
"[foo]\n" \
|
||||||
|
" a = b\n" \
|
||||||
|
"[other]\n" \
|
||||||
|
" a = b\n" \
|
||||||
|
"[foo]\n" \
|
||||||
|
" c = old\n";
|
||||||
|
|
||||||
|
/* Write the test config */
|
||||||
|
cl_git_mkfile(file_name, file_content);
|
||||||
|
cl_git_pass(git_config_open_ondisk(&cfg, file_name));
|
||||||
|
|
||||||
|
/* make sure the expected entry (foo.c) exists */
|
||||||
|
cl_git_pass(git_config_snapshot(&snapshot, cfg));
|
||||||
|
cl_git_pass(git_config_get_string(&str, snapshot, entry_name));
|
||||||
|
cl_assert_equal_s(old_val, str);
|
||||||
|
git_config_free(snapshot);
|
||||||
|
|
||||||
|
/* Try setting foo.c to something else */
|
||||||
|
cl_git_pass(git_config_set_string(cfg, entry_name, new_val));
|
||||||
|
git_config_free(cfg);
|
||||||
|
|
||||||
|
/* Reopen the file and make sure the new value was set */
|
||||||
|
cl_git_pass(git_config_open_ondisk(&cfg, file_name));
|
||||||
|
cl_git_pass(git_config_snapshot(&snapshot, cfg));
|
||||||
|
cl_git_pass(git_config_get_string(&str, snapshot, entry_name));
|
||||||
|
cl_assert_equal_s(new_val, str);
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
git_config_free(snapshot);
|
||||||
|
git_config_free(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
void test_config_write__overwrite_value_with_duplicate_header(void)
|
void test_config_write__overwrite_value_with_duplicate_header(void)
|
||||||
{
|
{
|
||||||
const char *file_name = "config-duplicate-header";
|
const char *file_name = "config-duplicate-header";
|
||||||
|
Loading…
Reference in New Issue
Block a user