mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 20:42:23 +00:00
Merge pull request #1950 from csware/quote-config-values
Correctly quote config values while saving
This commit is contained in:
commit
b9cb72c28a
@ -1178,6 +1178,22 @@ static int write_section(git_filebuf *file, const char *key)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int value_needs_surrounding_quote(const char *value)
|
||||||
|
{
|
||||||
|
const char *ptr = value;
|
||||||
|
if (*value == ' ')
|
||||||
|
return 1;
|
||||||
|
while (*ptr) {
|
||||||
|
if (*ptr == ';' || *ptr == '#')
|
||||||
|
return 1;
|
||||||
|
++ptr;
|
||||||
|
}
|
||||||
|
if (ptr != value && *(--ptr) == ' ')
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is pretty much the parsing, except we write out anything we don't have
|
* This is pretty much the parsing, except we write out anything we don't have
|
||||||
*/
|
*/
|
||||||
@ -1302,7 +1318,10 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p
|
|||||||
/* Then replace the variable. If the value is NULL, it
|
/* Then replace the variable. If the value is NULL, it
|
||||||
* means we want to delete it, so don't write anything. */
|
* means we want to delete it, so don't write anything. */
|
||||||
if (value != NULL) {
|
if (value != NULL) {
|
||||||
git_filebuf_printf(&file, "\t%s = %s\n", name, value);
|
if (value_needs_surrounding_quote(value))
|
||||||
|
git_filebuf_printf(&file, "\t%s = \"%s\"\n", name, value);
|
||||||
|
else
|
||||||
|
git_filebuf_printf(&file, "\t%s = %s\n", name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1362,7 +1381,10 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p
|
|||||||
if (reader->buffer.size > 0 && *(reader->buffer.ptr + reader->buffer.size - 1) != '\n')
|
if (reader->buffer.size > 0 && *(reader->buffer.ptr + reader->buffer.size - 1) != '\n')
|
||||||
git_filebuf_write(&file, "\n", 1);
|
git_filebuf_write(&file, "\n", 1);
|
||||||
|
|
||||||
git_filebuf_printf(&file, "\t%s = %s\n", name, value);
|
if (value_needs_surrounding_quote(value))
|
||||||
|
git_filebuf_printf(&file, "\t%s = \"%s\"\n", name, value);
|
||||||
|
else
|
||||||
|
git_filebuf_printf(&file, "\t%s = %s\n", name, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,6 +229,37 @@ void test_config_write__add_value_at_file_with_no_clrf_at_the_end(void)
|
|||||||
git_config_free(cfg);
|
git_config_free(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_config_write__add_value_which_needs_quotes(void)
|
||||||
|
{
|
||||||
|
git_config *cfg;
|
||||||
|
const char* str1;
|
||||||
|
const char* str2;
|
||||||
|
const char* str3;
|
||||||
|
const char* str4;
|
||||||
|
const char* str5;
|
||||||
|
|
||||||
|
cl_git_pass(git_config_open_ondisk(&cfg, "config17"));
|
||||||
|
cl_git_pass(git_config_set_string(cfg, "core.startwithspace", " Something"));
|
||||||
|
cl_git_pass(git_config_set_string(cfg, "core.endwithspace", "Something "));
|
||||||
|
cl_git_pass(git_config_set_string(cfg, "core.containscommentchar1", "some#thing"));
|
||||||
|
cl_git_pass(git_config_set_string(cfg, "core.containscommentchar2", "some;thing"));
|
||||||
|
cl_git_pass(git_config_set_string(cfg, "core.startwhithsapceandcontainsdoublequote", " some\"thing"));
|
||||||
|
git_config_free(cfg);
|
||||||
|
|
||||||
|
cl_git_pass(git_config_open_ondisk(&cfg, "config17"));
|
||||||
|
cl_git_pass(git_config_get_string(&str1, cfg, "core.startwithspace"));
|
||||||
|
cl_assert_equal_s(" Something", str1);
|
||||||
|
cl_git_pass(git_config_get_string(&str2, cfg, "core.endwithspace"));
|
||||||
|
cl_assert_equal_s("Something ", str2);
|
||||||
|
cl_git_pass(git_config_get_string(&str3, cfg, "core.containscommentchar1"));
|
||||||
|
cl_assert_equal_s("some#thing", str3);
|
||||||
|
cl_git_pass(git_config_get_string(&str4, cfg, "core.containscommentchar2"));
|
||||||
|
cl_assert_equal_s("some;thing", str4);
|
||||||
|
cl_git_pass(git_config_get_string(&str5, cfg, "core.startwhithsapceandcontainsdoublequote"));
|
||||||
|
cl_assert_equal_s(" some\"thing", str5);
|
||||||
|
git_config_free(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
void test_config_write__can_set_a_value_to_NULL(void)
|
void test_config_write__can_set_a_value_to_NULL(void)
|
||||||
{
|
{
|
||||||
git_repository *repository;
|
git_repository *repository;
|
||||||
|
Loading…
Reference in New Issue
Block a user