зеркало из https://github.com/microsoft/git.git
config: pass source to config_parser_event_fn_t
..so that the callback can use a "struct config_source" parameter instead of "config_reader.source". "struct config_source" is internal to config.c, so we are adding a pointer to a struct defined in config.c into a public function signature defined in config.h, but this is okay because this function has only ever been (and probably ever will be) used internally by config.c. As a result, the_reader isn't used anywhere, so "struct config_reader" is obsolete (it was only intended to be used with the_reader). Remove them. Signed-off-by: Glen Choo <chooglen@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
908857a9f8
Коммит
6e8e7981eb
77
config.c
77
config.c
|
@ -66,40 +66,6 @@ struct config_source {
|
||||||
};
|
};
|
||||||
#define CONFIG_SOURCE_INIT { 0 }
|
#define CONFIG_SOURCE_INIT { 0 }
|
||||||
|
|
||||||
struct config_reader {
|
|
||||||
/*
|
|
||||||
* These members record the "current" config source, which can be
|
|
||||||
* accessed by parsing callbacks.
|
|
||||||
*
|
|
||||||
* The "source" variable will be non-NULL only when we are actually
|
|
||||||
* parsing a real config source (file, blob, cmdline, etc).
|
|
||||||
*/
|
|
||||||
struct config_source *source;
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* Where possible, prefer to accept "struct config_reader" as an arg than to use
|
|
||||||
* "the_reader". "the_reader" should only be used if that is infeasible, e.g. in
|
|
||||||
* a public function.
|
|
||||||
*/
|
|
||||||
static struct config_reader the_reader;
|
|
||||||
|
|
||||||
static inline void config_reader_push_source(struct config_reader *reader,
|
|
||||||
struct config_source *top)
|
|
||||||
{
|
|
||||||
top->prev = reader->source;
|
|
||||||
reader->source = top;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct config_source *config_reader_pop_source(struct config_reader *reader)
|
|
||||||
{
|
|
||||||
struct config_source *ret;
|
|
||||||
if (!reader->source)
|
|
||||||
BUG("tried to pop config source, but we weren't reading config");
|
|
||||||
ret = reader->source;
|
|
||||||
reader->source = reader->source->prev;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pack_compression_seen;
|
static int pack_compression_seen;
|
||||||
static int zlib_compression_seen;
|
static int zlib_compression_seen;
|
||||||
|
|
||||||
|
@ -752,14 +718,9 @@ int git_config_from_parameters(config_fn_t fn, void *data)
|
||||||
struct strvec to_free = STRVEC_INIT;
|
struct strvec to_free = STRVEC_INIT;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
char *envw = NULL;
|
char *envw = NULL;
|
||||||
struct config_source source = CONFIG_SOURCE_INIT;
|
|
||||||
struct key_value_info kvi = KVI_INIT;
|
struct key_value_info kvi = KVI_INIT;
|
||||||
|
|
||||||
source.origin_type = CONFIG_ORIGIN_CMDLINE;
|
|
||||||
config_reader_push_source(&the_reader, &source);
|
|
||||||
|
|
||||||
kvi_from_param(&kvi);
|
kvi_from_param(&kvi);
|
||||||
|
|
||||||
env = getenv(CONFIG_COUNT_ENVIRONMENT);
|
env = getenv(CONFIG_COUNT_ENVIRONMENT);
|
||||||
if (env) {
|
if (env) {
|
||||||
unsigned long count;
|
unsigned long count;
|
||||||
|
@ -816,7 +777,6 @@ out:
|
||||||
strbuf_release(&envvar);
|
strbuf_release(&envvar);
|
||||||
strvec_clear(&to_free);
|
strvec_clear(&to_free);
|
||||||
free(envw);
|
free(envw);
|
||||||
config_reader_pop_source(&the_reader);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1045,7 +1005,7 @@ static int do_event(struct config_source *cs, enum config_event_t type,
|
||||||
|
|
||||||
if (data->previous_type != CONFIG_EVENT_EOF &&
|
if (data->previous_type != CONFIG_EVENT_EOF &&
|
||||||
data->opts->event_fn(data->previous_type, data->previous_offset,
|
data->opts->event_fn(data->previous_type, data->previous_offset,
|
||||||
offset, data->opts->event_fn_data) < 0)
|
offset, cs, data->opts->event_fn_data) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
data->previous_type = type;
|
data->previous_type = type;
|
||||||
|
@ -2002,8 +1962,7 @@ int git_default_config(const char *var, const char *value,
|
||||||
* fgetc, ungetc, ftell of top need to be initialized before calling
|
* fgetc, ungetc, ftell of top need to be initialized before calling
|
||||||
* this function.
|
* this function.
|
||||||
*/
|
*/
|
||||||
static int do_config_from(struct config_reader *reader,
|
static int do_config_from(struct config_source *top, config_fn_t fn,
|
||||||
struct config_source *top, config_fn_t fn,
|
|
||||||
void *data, enum config_scope scope,
|
void *data, enum config_scope scope,
|
||||||
const struct config_options *opts)
|
const struct config_options *opts)
|
||||||
{
|
{
|
||||||
|
@ -2016,21 +1975,17 @@ static int do_config_from(struct config_reader *reader,
|
||||||
top->total_len = 0;
|
top->total_len = 0;
|
||||||
strbuf_init(&top->value, 1024);
|
strbuf_init(&top->value, 1024);
|
||||||
strbuf_init(&top->var, 1024);
|
strbuf_init(&top->var, 1024);
|
||||||
config_reader_push_source(reader, top);
|
|
||||||
kvi_from_source(top, scope, &kvi);
|
kvi_from_source(top, scope, &kvi);
|
||||||
|
|
||||||
ret = git_parse_source(top, fn, &kvi, data, opts);
|
ret = git_parse_source(top, fn, &kvi, data, opts);
|
||||||
|
|
||||||
/* pop config-file parsing state stack */
|
|
||||||
strbuf_release(&top->value);
|
strbuf_release(&top->value);
|
||||||
strbuf_release(&top->var);
|
strbuf_release(&top->var);
|
||||||
config_reader_pop_source(reader);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_config_from_file(struct config_reader *reader,
|
static int do_config_from_file(config_fn_t fn,
|
||||||
config_fn_t fn,
|
|
||||||
const enum config_origin_type origin_type,
|
const enum config_origin_type origin_type,
|
||||||
const char *name, const char *path, FILE *f,
|
const char *name, const char *path, FILE *f,
|
||||||
void *data, enum config_scope scope,
|
void *data, enum config_scope scope,
|
||||||
|
@ -2049,7 +2004,7 @@ static int do_config_from_file(struct config_reader *reader,
|
||||||
top.do_ftell = config_file_ftell;
|
top.do_ftell = config_file_ftell;
|
||||||
|
|
||||||
flockfile(f);
|
flockfile(f);
|
||||||
ret = do_config_from(reader, &top, fn, data, scope, opts);
|
ret = do_config_from(&top, fn, data, scope, opts);
|
||||||
funlockfile(f);
|
funlockfile(f);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2057,8 +2012,8 @@ static int do_config_from_file(struct config_reader *reader,
|
||||||
static int git_config_from_stdin(config_fn_t fn, void *data,
|
static int git_config_from_stdin(config_fn_t fn, void *data,
|
||||||
enum config_scope scope)
|
enum config_scope scope)
|
||||||
{
|
{
|
||||||
return do_config_from_file(&the_reader, fn, CONFIG_ORIGIN_STDIN, "",
|
return do_config_from_file(fn, CONFIG_ORIGIN_STDIN, "", NULL, stdin,
|
||||||
NULL, stdin, data, scope, NULL);
|
data, scope, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_config_from_file_with_options(config_fn_t fn, const char *filename,
|
int git_config_from_file_with_options(config_fn_t fn, const char *filename,
|
||||||
|
@ -2072,9 +2027,8 @@ int git_config_from_file_with_options(config_fn_t fn, const char *filename,
|
||||||
BUG("filename cannot be NULL");
|
BUG("filename cannot be NULL");
|
||||||
f = fopen_or_warn(filename, "r");
|
f = fopen_or_warn(filename, "r");
|
||||||
if (f) {
|
if (f) {
|
||||||
ret = do_config_from_file(&the_reader, fn, CONFIG_ORIGIN_FILE,
|
ret = do_config_from_file(fn, CONFIG_ORIGIN_FILE, filename,
|
||||||
filename, filename, f, data, scope,
|
filename, f, data, scope, opts);
|
||||||
opts);
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -2105,7 +2059,7 @@ int git_config_from_mem(config_fn_t fn,
|
||||||
top.do_ungetc = config_buf_ungetc;
|
top.do_ungetc = config_buf_ungetc;
|
||||||
top.do_ftell = config_buf_ftell;
|
top.do_ftell = config_buf_ftell;
|
||||||
|
|
||||||
return do_config_from(&the_reader, &top, fn, data, scope, opts);
|
return do_config_from(&top, fn, data, scope, opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_config_from_blob_oid(config_fn_t fn,
|
int git_config_from_blob_oid(config_fn_t fn,
|
||||||
|
@ -2198,8 +2152,7 @@ int git_config_system(void)
|
||||||
return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0);
|
return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_git_config_sequence(struct config_reader *reader,
|
static int do_git_config_sequence(const struct config_options *opts,
|
||||||
const struct config_options *opts,
|
|
||||||
const struct repository *repo,
|
const struct repository *repo,
|
||||||
config_fn_t fn, void *data)
|
config_fn_t fn, void *data)
|
||||||
{
|
{
|
||||||
|
@ -2299,7 +2252,7 @@ int config_with_options(config_fn_t fn, void *data,
|
||||||
ret = git_config_from_blob_ref(fn, repo, config_source->blob,
|
ret = git_config_from_blob_ref(fn, repo, config_source->blob,
|
||||||
data, config_source->scope);
|
data, config_source->scope);
|
||||||
} else {
|
} else {
|
||||||
ret = do_git_config_sequence(&the_reader, opts, repo, fn, data);
|
ret = do_git_config_sequence(opts, repo, fn, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inc.remote_urls) {
|
if (inc.remote_urls) {
|
||||||
|
@ -3009,7 +2962,6 @@ void git_die_config(const char *key, const char *err, ...)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct config_store_data {
|
struct config_store_data {
|
||||||
struct config_reader *config_reader;
|
|
||||||
size_t baselen;
|
size_t baselen;
|
||||||
char *key;
|
char *key;
|
||||||
int do_not_match;
|
int do_not_match;
|
||||||
|
@ -3055,11 +3007,10 @@ static int matches(const char *key, const char *value,
|
||||||
(value && !regexec(store->value_pattern, value, 0, NULL, 0));
|
(value && !regexec(store->value_pattern, value, 0, NULL, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int store_aux_event(enum config_event_t type,
|
static int store_aux_event(enum config_event_t type, size_t begin, size_t end,
|
||||||
size_t begin, size_t end, void *data)
|
struct config_source *cs, void *data)
|
||||||
{
|
{
|
||||||
struct config_store_data *store = data;
|
struct config_store_data *store = data;
|
||||||
struct config_source *cs = store->config_reader->source;
|
|
||||||
|
|
||||||
ALLOC_GROW(store->parsed, store->parsed_nr + 1, store->parsed_alloc);
|
ALLOC_GROW(store->parsed, store->parsed_nr + 1, store->parsed_alloc);
|
||||||
store->parsed[store->parsed_nr].begin = begin;
|
store->parsed[store->parsed_nr].begin = begin;
|
||||||
|
@ -3380,8 +3331,6 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
|
||||||
size_t contents_sz;
|
size_t contents_sz;
|
||||||
struct config_store_data store = CONFIG_STORE_INIT;
|
struct config_store_data store = CONFIG_STORE_INIT;
|
||||||
|
|
||||||
store.config_reader = &the_reader;
|
|
||||||
|
|
||||||
/* parse-key returns negative; flip the sign to feed exit(3) */
|
/* parse-key returns negative; flip the sign to feed exit(3) */
|
||||||
ret = 0 - git_config_parse_key(key, &store.key, &store.baselen);
|
ret = 0 - git_config_parse_key(key, &store.key, &store.baselen);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
6
config.h
6
config.h
|
@ -72,6 +72,7 @@ enum config_event_t {
|
||||||
CONFIG_EVENT_ERROR
|
CONFIG_EVENT_ERROR
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct config_source;
|
||||||
/*
|
/*
|
||||||
* The parser event function (if not NULL) is called with the event type and
|
* The parser event function (if not NULL) is called with the event type and
|
||||||
* the begin/end offsets of the parsed elements.
|
* the begin/end offsets of the parsed elements.
|
||||||
|
@ -81,6 +82,7 @@ enum config_event_t {
|
||||||
*/
|
*/
|
||||||
typedef int (*config_parser_event_fn_t)(enum config_event_t type,
|
typedef int (*config_parser_event_fn_t)(enum config_event_t type,
|
||||||
size_t begin_offset, size_t end_offset,
|
size_t begin_offset, size_t end_offset,
|
||||||
|
struct config_source *cs,
|
||||||
void *event_fn_data);
|
void *event_fn_data);
|
||||||
|
|
||||||
struct config_options {
|
struct config_options {
|
||||||
|
@ -100,6 +102,10 @@ struct config_options {
|
||||||
|
|
||||||
const char *commondir;
|
const char *commondir;
|
||||||
const char *git_dir;
|
const char *git_dir;
|
||||||
|
/*
|
||||||
|
* event_fn and event_fn_data are for internal use only. Handles events
|
||||||
|
* emitted by the config parser.
|
||||||
|
*/
|
||||||
config_parser_event_fn_t event_fn;
|
config_parser_event_fn_t event_fn;
|
||||||
void *event_fn_data;
|
void *event_fn_data;
|
||||||
enum config_error_action {
|
enum config_error_action {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче