зеркало из https://github.com/microsoft/git.git
config: factor out config file stack management
Because a config callback may start parsing a new file, the global context regarding the current config file is stored as a stack. Currently we only need to manage that stack from git_config_from_file. Let's factor it out to allow new sources of config data. Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net> Acked-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
b387c77b12
Коммит
ca4b5de28b
40
config.c
40
config.c
|
@ -896,6 +896,32 @@ int git_default_config(const char *var, const char *value, void *dummy)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The fields f and name of top need to be initialized before calling
|
||||
* this function.
|
||||
*/
|
||||
static int do_config_from(struct config_file *top, config_fn_t fn, void *data)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* push config-file parsing state stack */
|
||||
top->prev = cf;
|
||||
top->linenr = 1;
|
||||
top->eof = 0;
|
||||
strbuf_init(&top->value, 1024);
|
||||
strbuf_init(&top->var, 1024);
|
||||
cf = top;
|
||||
|
||||
ret = git_parse_file(fn, data);
|
||||
|
||||
/* pop config-file parsing state stack */
|
||||
strbuf_release(&top->value);
|
||||
strbuf_release(&top->var);
|
||||
cf = top->prev;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int git_config_from_file(config_fn_t fn, const char *filename, void *data)
|
||||
{
|
||||
int ret;
|
||||
|
@ -905,22 +931,10 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
|
|||
if (f) {
|
||||
config_file top;
|
||||
|
||||
/* push config-file parsing state stack */
|
||||
top.prev = cf;
|
||||
top.f = f;
|
||||
top.name = filename;
|
||||
top.linenr = 1;
|
||||
top.eof = 0;
|
||||
strbuf_init(&top.value, 1024);
|
||||
strbuf_init(&top.var, 1024);
|
||||
cf = ⊤
|
||||
|
||||
ret = git_parse_file(fn, data);
|
||||
|
||||
/* pop config-file parsing state stack */
|
||||
strbuf_release(&top.value);
|
||||
strbuf_release(&top.var);
|
||||
cf = top.prev;
|
||||
ret = do_config_from(&top, fn, data);
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче