mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-06 14:46:04 +00:00
Make config reading continue after hitting a missing include file.
For example, if you have [include] path = foo and foo didn't exist, git_config_open_ondisk() would just give up on the rest of the file. Now it ignores the unresolved include without error and continues reading the rest of the file.
This commit is contained in:
parent
264d74fd40
commit
727ae380a5
@ -1269,7 +1269,7 @@ static int config_parse(git_strmap *values, diskfile_backend *cfg_file, struct r
|
||||
if ((result = git_path_dirname_r(&path, reader->file_path)) < 0)
|
||||
break;
|
||||
|
||||
/* We need to know out index in the array, as the next config_parse call may realloc */
|
||||
/* We need to know our index in the array, as the next config_parse call may realloc */
|
||||
index = git_array_size(cfg_file->readers) - 1;
|
||||
dir = git_buf_detach(&path);
|
||||
result = included_path(&path, dir, var->entry->value);
|
||||
@ -1280,12 +1280,11 @@ static int config_parse(git_strmap *values, diskfile_backend *cfg_file, struct r
|
||||
|
||||
r->file_path = git_buf_detach(&path);
|
||||
git_buf_init(&r->buffer, 0);
|
||||
if ((result = git_futils_readbuffer_updated(&r->buffer, r->file_path, &r->file_mtime,
|
||||
&r->file_size, NULL)) < 0)
|
||||
break;
|
||||
|
||||
result = config_parse(values, cfg_file, r, level, depth+1);
|
||||
r = git_array_get(cfg_file->readers, index);
|
||||
if (git_futils_readbuffer_updated(&r->buffer, r->file_path, &r->file_mtime,
|
||||
&r->file_size, NULL) == 0) {
|
||||
result = config_parse(values, cfg_file, r, level, depth+1);
|
||||
r = git_array_get(cfg_file->readers, index);
|
||||
}
|
||||
git_buf_free(&r->buffer);
|
||||
|
||||
if (result < 0)
|
||||
|
@ -86,3 +86,18 @@ void test_config_include__depth(void)
|
||||
unlink("a");
|
||||
unlink("b");
|
||||
}
|
||||
|
||||
void test_config_include__missing(void)
|
||||
{
|
||||
git_config *cfg;
|
||||
const char *str;
|
||||
|
||||
cl_git_mkfile("included", "[include]\npath = nonexistentfile\n[foo]\nbar = baz");
|
||||
|
||||
cl_git_pass(git_config_open_ondisk(&cfg, "included"));
|
||||
cl_git_pass(git_config_get_string(&str, cfg, "foo.bar"));
|
||||
cl_assert_equal_s(str, "baz");
|
||||
|
||||
git_config_free(cfg);
|
||||
unlink("included");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user