git_default_config() now uses config-set API functions to query for values. Signed-off-by: Tanay Abhra <tanayabh@xxxxxxxxx> --- Sorry, for the short log message, I will explain why. The git_default_config() rewrite is 100% complete, the only problem remains is the call sites; there are too many of them. Some are called from callback functions which pass the remaining variables to git_default_config() which they do not have any use for. Those call sites can remain as they are, because git_default_config() is a single call function now, and is guarded by a sentinel value. So after one call, it would just return immediately instead of going on checking. For callers like git_config(git_default_config, NULL) (there are 38 of them), we can leave them as they are or rewrite them as I have illustrated in the next attached patch. I will take this series out of RFC as soon as we have decided what to do with the call sites. Cheers, Tanay Abhra. advice.c | 17 ++-- advice.h | 2 +- cache.h | 2 +- config.c | 346 ++++++++++++++++++++++----------------------------------------- ident.c | 17 ++-- 5 files changed, 136 insertions(+), 248 deletions(-) diff --git a/advice.c b/advice.c index 9b42033..34e1ccc 100644 --- a/advice.c +++ b/advice.c @@ -59,22 +59,17 @@ void advise(const char *advice, ...) strbuf_release(&buf); } -int git_default_advice_config(const char *var, const char *value) +void git_default_advice_config(void) { - const char *k; + struct strbuf var = STRBUF_INIT; int i; - if (!skip_prefix(var, "advice.", &k)) - return 0; - for (i = 0; i < ARRAY_SIZE(advice_config); i++) { - if (strcmp(k, advice_config[i].name)) - continue; - *advice_config[i].preference = git_config_bool(var, value); - return 0; + strbuf_addf(&var, "advice.%s", advice_config[i].name); + git_config_get_bool(var.buf, advice_config[i].preference); + strbuf_reset(&var); } - - return 0; + strbuf_release(&var); } int error_resolve_conflict(const char *me) diff --git a/advice.h b/advice.h index 5ecc6c1..5bfe46c 100644 --- a/advice.h +++ b/advice.h @@ -19,7 +19,7 @@ extern int advice_set_upstream_failure; extern int advice_object_name_warning; extern int advice_rm_hints; -int git_default_advice_config(const char *var, const char *value); +void git_default_advice_config(void); __attribute__((format (printf, 1, 2))) void advise(const char *advice, ...); int error_resolve_conflict(const char *me); diff --git a/cache.h b/cache.h index 2693a37..fa28b40 100644 --- a/cache.h +++ b/cache.h @@ -1065,7 +1065,7 @@ extern const char *fmt_name(const char *name, const char *email); extern const char *ident_default_email(void); extern const char *git_editor(void); extern const char *git_pager(int stdout_is_tty); -extern int git_ident_config(const char *, const char *, void *); +extern void git_ident_config(void); struct ident_split { const char *name_begin; diff --git a/config.c b/config.c index 427850a..36b9124 100644 --- a/config.c +++ b/config.c @@ -46,6 +46,8 @@ static int zlib_compression_seen; */ static struct config_set the_config_set; +static int default_config_loaded; + static int config_file_fgetc(struct config_source *conf) { return fgetc(conf->u.file); @@ -670,147 +672,91 @@ int git_config_pathname(const char **dest, const char *var, const char *value) return 0; } -static int git_default_core_config(const char *var, const char *value) +static void git_default_core_config(void) { + const char *value = NULL; + unsigned long v_l = 0; + int abbrev; + const char *comment; + /* This needs a better name */ - if (!strcmp(var, "core.filemode")) { - trust_executable_bit = git_config_bool(var, value); - return 0; - } - if (!strcmp(var, "core.trustctime")) { - trust_ctime = git_config_bool(var, value); - return 0; - } - if (!strcmp(var, "core.checkstat")) { + git_config_get_bool("core.filemode", &trust_executable_bit); + git_config_get_bool("core.trustctime", &trust_ctime); + + if (!git_config_get_value("core.checkstat", &value)) { if (!strcasecmp(value, "default")) check_stat = 1; else if (!strcasecmp(value, "minimal")) check_stat = 0; } - if (!strcmp(var, "core.quotepath")) { - quote_path_fully = git_config_bool(var, value); - return 0; - } + git_config_get_bool("core.quotepath", "e_path_fully); + git_config_get_bool("core.symlinks", &has_symlinks); + git_config_get_bool("core.ignorecase", &ignore_case); + git_config_get_pathname("core.attributesfile", &git_attributes_file); + git_config_get_bool("core.bare", &is_bare_repository_cfg); + git_config_get_bool("core.ignorestat", &assume_unchanged); + git_config_get_bool("core.prefersymlinkrefs", &prefer_symlink_refs); + git_config_get_bool("core.logallrefupdates", &log_all_ref_updates); + git_config_get_bool("core.warnambiguousrefs", &warn_ambiguous_refs); - if (!strcmp(var, "core.symlinks")) { - has_symlinks = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.ignorecase")) { - ignore_case = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.attributesfile")) - return git_config_pathname(&git_attributes_file, var, value); - - if (!strcmp(var, "core.bare")) { - is_bare_repository_cfg = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.ignorestat")) { - assume_unchanged = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.prefersymlinkrefs")) { - prefer_symlink_refs = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.logallrefupdates")) { - log_all_ref_updates = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.warnambiguousrefs")) { - warn_ambiguous_refs = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.abbrev")) { - int abbrev = git_config_int(var, value); + if (!git_config_get_int("core.abbrev", &abbrev)) { if (abbrev < minimum_abbrev || abbrev > 40) - return -1; + git_die_config("core.abbrev", NULL); default_abbrev = abbrev; - return 0; } - - if (!strcmp(var, "core.loosecompression")) { - int level = git_config_int(var, value); - if (level == -1) - level = Z_DEFAULT_COMPRESSION; - else if (level < 0 || level > Z_BEST_COMPRESSION) - die(_("bad zlib compression level %d"), level); - zlib_compression_level = level; + if (!git_config_get_int("core.loosecompression", &zlib_compression_level)) { + if (zlib_compression_level == -1) + zlib_compression_level = Z_DEFAULT_COMPRESSION; + else if (zlib_compression_level < 0 || + zlib_compression_level > Z_BEST_COMPRESSION) + git_die_config("core.loosecompression", _("bad zlib compression level %d"), + zlib_compression_level); zlib_compression_seen = 1; - return 0; } - - if (!strcmp(var, "core.compression")) { - int level = git_config_int(var, value); - if (level == -1) - level = Z_DEFAULT_COMPRESSION; - else if (level < 0 || level > Z_BEST_COMPRESSION) - die(_("bad zlib compression level %d"), level); - core_compression_level = level; + if (!git_config_get_int("core.compression", &core_compression_level)) { + if (core_compression_level == -1) + core_compression_level = Z_DEFAULT_COMPRESSION; + else if (core_compression_level < 0 || + core_compression_level > Z_BEST_COMPRESSION) + git_die_config("core.compression", _("bad zlib compression level %d"), + core_compression_level); core_compression_seen = 1; if (!zlib_compression_seen) - zlib_compression_level = level; - return 0; + zlib_compression_level = core_compression_level; } - - if (!strcmp(var, "core.packedgitwindowsize")) { + if (!git_config_get_ulong("core.packedgitwindowsize", &v_l)) { int pgsz_x2 = getpagesize() * 2; - packed_git_window_size = git_config_ulong(var, value); + packed_git_window_size = v_l; /* This value must be multiple of (pagesize * 2) */ packed_git_window_size /= pgsz_x2; if (packed_git_window_size < 1) packed_git_window_size = 1; packed_git_window_size *= pgsz_x2; - return 0; - } - - if (!strcmp(var, "core.bigfilethreshold")) { - big_file_threshold = git_config_ulong(var, value); - return 0; } + git_config_get_ulong("core.bigfilethreshold", &big_file_threshold); + if (!git_config_get_ulong("core.packedgitlimit", &v_l)) + packed_git_limit = v_l; + if (!git_config_get_ulong("core.deltabasecachelimit", &v_l)) + delta_base_cache_limit = v_l; - if (!strcmp(var, "core.packedgitlimit")) { - packed_git_limit = git_config_ulong(var, value); - return 0; - } - - if (!strcmp(var, "core.deltabasecachelimit")) { - delta_base_cache_limit = git_config_ulong(var, value); - return 0; - } - - if (!strcmp(var, "core.autocrlf")) { + if (!git_config_get_value("core.autocrlf", &value)) { if (value && !strcasecmp(value, "input")) { if (core_eol == EOL_CRLF) - return error("core.autocrlf=input conflicts with core.eol=crlf"); + git_die_config("core.autocrlf", + "core.autocrlf=input conflicts with core.eol=crlf"); auto_crlf = AUTO_CRLF_INPUT; - return 0; - } - auto_crlf = git_config_bool(var, value); - return 0; + } else + auto_crlf = git_config_bool("core.autocrlf", value); } - - if (!strcmp(var, "core.safecrlf")) { - if (value && !strcasecmp(value, "warn")) { + if (!git_config_get_value("core.safecrlf", &value)) { + if (value && !strcasecmp(value, "warn")) safe_crlf = SAFE_CRLF_WARN; - return 0; - } - safe_crlf = git_config_bool(var, value); - return 0; + else + safe_crlf = git_config_bool("core.safecrlf", value); } - - if (!strcmp(var, "core.eol")) { + if (!git_config_get_value("core.eol", &value)) { if (value && !strcasecmp(value, "lf")) core_eol = EOL_LF; else if (value && !strcasecmp(value, "crlf")) @@ -820,106 +766,71 @@ static int git_default_core_config(const char *var, const char *value) else core_eol = EOL_UNSET; if (core_eol == EOL_CRLF && auto_crlf == AUTO_CRLF_INPUT) - return error("core.autocrlf=input conflicts with core.eol=crlf"); - return 0; + git_die_config("core.autocrlf", + "core.autocrlf=input conflicts with core.eol=crlf"); } + git_config_get_string("core.notesref", ¬es_ref_name); + git_config_get_string_const("core.pager", &pager_program); + git_config_get_string_const("core.editor", &editor_program); - if (!strcmp(var, "core.notesref")) { - notes_ref_name = xstrdup(value); - return 0; - } - - if (!strcmp(var, "core.pager")) - return git_config_string(&pager_program, var, value); - - if (!strcmp(var, "core.editor")) - return git_config_string(&editor_program, var, value); - - if (!strcmp(var, "core.commentchar")) { - if (!value) - return config_error_nonbool(var); - else if (!strcasecmp(value, "auto")) + if (!git_config_get_string_const("core.commentchar", &comment)) { + if (!strcasecmp(comment, "auto")) auto_comment_line_char = 1; - else if (value[0] && !value[1]) { - comment_line_char = value[0]; + else if (comment[0] && !comment[1]) { + comment_line_char = comment[0]; auto_comment_line_char = 0; } else - return error("core.commentChar should only be one character"); - return 0; + git_die_config("core.commentchar", + "core.commentchar should only be one character"); } + git_config_get_string_const("core.askpass", &askpass_program); + git_config_get_pathname("core.excludesfile", &excludes_file); - if (!strcmp(var, "core.askpass")) - return git_config_string(&askpass_program, var, value); - - if (!strcmp(var, "core.excludesfile")) - return git_config_pathname(&excludes_file, var, value); - - if (!strcmp(var, "core.whitespace")) { + if (!git_config_get_value("core.whitespace", &value)) { if (!value) - return config_error_nonbool(var); - whitespace_rule_cfg = parse_whitespace_rule(value); - return 0; - } - - if (!strcmp(var, "core.fsyncobjectfiles")) { - fsync_object_files = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.preloadindex")) { - core_preload_index = git_config_bool(var, value); - return 0; + git_die_config("core.whitespace", "Missing value for 'core.whitespace'"); + else + whitespace_rule_cfg = parse_whitespace_rule(value); } + git_config_get_bool("core.fsyncobjectfiles", &fsync_object_files); + git_config_get_bool("core.preloadindex", &core_preload_index); - if (!strcmp(var, "core.createobject")) { + if (!git_config_get_value("core.createobject", &value)) { if (!strcmp(value, "rename")) object_creation_mode = OBJECT_CREATION_USES_RENAMES; else if (!strcmp(value, "link")) object_creation_mode = OBJECT_CREATION_USES_HARDLINKS; else - die(_("invalid mode for object creation: %s"), value); - return 0; - } - - if (!strcmp(var, "core.sparsecheckout")) { - core_apply_sparse_checkout = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "core.precomposeunicode")) { - precomposed_unicode = git_config_bool(var, value); - return 0; + git_die_config("core.createobject", + _("Invalid mode for object creation: %s"), value); } + git_config_get_bool("core.sparsecheckout", &core_apply_sparse_checkout); + git_config_get_bool("core.precomposeunicode", &precomposed_unicode); /* Add other config variables here and to Documentation/config.txt. */ - return 0; } -static int git_default_i18n_config(const char *var, const char *value) +static void git_default_i18n_config(void) { - if (!strcmp(var, "i18n.commitencoding")) - return git_config_string(&git_commit_encoding, var, value); - - if (!strcmp(var, "i18n.logoutputencoding")) - return git_config_string(&git_log_output_encoding, var, value); + git_config_get_string_const("i18n.commitencoding", &git_commit_encoding); + git_config_get_string_const("i18n.logoutputencoding", &git_log_output_encoding); /* Add other config variables here and to Documentation/config.txt. */ - return 0; } -static int git_default_branch_config(const char *var, const char *value) +static void git_default_branch_config(void) { - if (!strcmp(var, "branch.autosetupmerge")) { - if (value && !strcasecmp(value, "always")) { + const char *value = NULL; + if (!git_config_get_value("branch.autosetupmerge", &value)) { + if (value && !strcasecmp(value, "always")) git_branch_track = BRANCH_TRACK_ALWAYS; - return 0; - } - git_branch_track = git_config_bool(var, value); - return 0; + else + git_branch_track = git_config_bool("branch.autosetupmerge", value); } - if (!strcmp(var, "branch.autosetuprebase")) { + if (!git_config_get_value("branch.autosetuprebase", &value)) { if (!value) - return config_error_nonbool(var); + git_die_config("branch.autosetuprebase", + "Missing value for 'branch.autosetuprebase'"); else if (!strcmp(value, "never")) autorebase = AUTOREBASE_NEVER; else if (!strcmp(value, "local")) @@ -929,19 +840,19 @@ static int git_default_branch_config(const char *var, const char *value) else if (!strcmp(value, "always")) autorebase = AUTOREBASE_ALWAYS; else - return error("Malformed value for %s", var); - return 0; + git_die_config("branch.autosetuprebase", + "Malformed value for branch.autosetuprebase"); } /* Add other config variables here and to Documentation/config.txt. */ - return 0; } -static int git_default_push_config(const char *var, const char *value) +static void git_default_push_config(void) { - if (!strcmp(var, "push.default")) { + const char *value = NULL; + if (!git_config_get_value("push.default", &value)) { if (!value) - return config_error_nonbool(var); + git_die_config("push.default", "Missing value for 'push.default'"); else if (!strcmp(value, "nothing")) push_default = PUSH_DEFAULT_NOTHING; else if (!strcmp(value, "matching")) @@ -955,60 +866,44 @@ static int git_default_push_config(const char *var, const char *value) else if (!strcmp(value, "current")) push_default = PUSH_DEFAULT_CURRENT; else { - error("Malformed value for %s: %s", var, value); - return error("Must be one of nothing, matching, simple, " + error("Malformed value for push.default: %s", value); + git_die_config("push.default", "Must be one of nothing, matching, simple, " "upstream or current."); } - return 0; } /* Add other config variables here and to Documentation/config.txt. */ - return 0; } -static int git_default_mailmap_config(const char *var, const char *value) +static void git_default_mailmap_config(void) { - if (!strcmp(var, "mailmap.file")) - return git_config_pathname(&git_mailmap_file, var, value); - if (!strcmp(var, "mailmap.blob")) - return git_config_string(&git_mailmap_blob, var, value); + git_config_get_pathname("mailmap.file", &git_mailmap_file); + git_config_get_string_const("mailmap.blob", &git_mailmap_blob); /* Add other config variables here and to Documentation/config.txt. */ - return 0; } -int git_default_config(const char *var, const char *value, void *dummy) +int git_default_config(const char *unused, const char *unused2, void *dummy) { - if (starts_with(var, "core.")) - return git_default_core_config(var, value); - - if (starts_with(var, "user.")) - return git_ident_config(var, value, dummy); - - if (starts_with(var, "i18n.")) - return git_default_i18n_config(var, value); - - if (starts_with(var, "branch.")) - return git_default_branch_config(var, value); - - if (starts_with(var, "push.")) - return git_default_push_config(var, value); + const char *v = NULL; - if (starts_with(var, "mailmap.")) - return git_default_mailmap_config(var, value); - - if (starts_with(var, "advice.")) - return git_default_advice_config(var, value); - - if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) { - pager_use_color = git_config_bool(var,value); - return 0; - } - - if (!strcmp(var, "pack.packsizelimit")) { - pack_size_limit_cfg = git_config_ulong(var, value); + if (default_config_loaded) return 0; - } + git_default_core_config(); + git_ident_config(); + git_default_i18n_config(); + git_default_branch_config(); + git_default_push_config(); + git_default_mailmap_config(); + git_default_advice_config(); + + if (!git_config_get_value("pager.color", &v)) + pager_use_color = git_config_bool("pager.color",v); + else if (!git_config_get_value("color.pager", &v)) + pager_use_color = git_config_bool("color.pager",v); + + git_config_get_ulong("pack.packsizelimit", &pack_size_limit_cfg); + default_config_loaded = 1; /* Add other config variables here and to Documentation/config.txt. */ return 0; } @@ -2082,6 +1977,7 @@ int git_config_set_multivar_in_file(const char *config_filename, /* Invalidate the config cache */ git_config_clear(); + default_config_loaded = 0; out_free: if (lock) diff --git a/ident.c b/ident.c index 1d9b6e7..0db595f 100644 --- a/ident.c +++ b/ident.c @@ -392,29 +392,26 @@ int author_ident_sufficiently_given(void) return ident_is_sufficient(author_ident_explicitly_given); } -int git_ident_config(const char *var, const char *value, void *data) +void git_ident_config(void) { - if (!strcmp(var, "user.name")) { + const char *value = NULL; + + if (!git_config_get_value("user.name", &value)) { if (!value) - return config_error_nonbool(var); + git_die_config("user.name", "Missing value for 'user.name'"); strbuf_reset(&git_default_name); strbuf_addstr(&git_default_name, value); committer_ident_explicitly_given |= IDENT_NAME_GIVEN; author_ident_explicitly_given |= IDENT_NAME_GIVEN; - return 0; } - - if (!strcmp(var, "user.email")) { + if (!git_config_get_value("user.email", &value)) { if (!value) - return config_error_nonbool(var); + git_die_config("user.email", "Missing value for 'user.email'"); strbuf_reset(&git_default_email); strbuf_addstr(&git_default_email, value); committer_ident_explicitly_given |= IDENT_MAIL_GIVEN; author_ident_explicitly_given |= IDENT_MAIL_GIVEN; - return 0; } - - return 0; } static int buf_cmp(const char *a_begin, const char *a_end, -- 1.9.0.GIT -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html