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:
John Fultz 2014-11-01 11:21:45 -05:00
parent 264d74fd40
commit 727ae380a5
2 changed files with 21 additions and 7 deletions

View File

@ -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)

View File

@ -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");
}