char *normalize_value(const char *key, const char *value) { char *normalized; if (!value) return NULL; if (type == T_RAW) normalized = xstrdup(value); else { normalized = xmalloc(64); if (type == T_INT) { int v = git_config_int(key, value); sprintf(normalized, "%d", v); } else if (type == T_BOOL) sprintf(normalized, "%s", git_config_bool(key, value) ? "true" : "false"); else if (type == T_BOOL_OR_INT) { int is_bool, v; v = git_config_bool_or_int(key, value, &is_bool); if (!is_bool) sprintf(normalized, "%d", v); else sprintf(normalized, "%s", v ? "true" : "false"); } } return normalized; }
static int git_default_branch_config(const char *var, const char *value) { if (!strcmp(var, "branch.autosetupmerge")) { if (value && !strcasecmp(value, "always")) { git_branch_track = BRANCH_TRACK_ALWAYS; return 0; } git_branch_track = git_config_bool(var, value); return 0; } if (!strcmp(var, "branch.autosetuprebase")) { if (!value) return config_error_nonbool(var); else if (!strcmp(value, "never")) autorebase = AUTOREBASE_NEVER; else if (!strcmp(value, "local")) autorebase = AUTOREBASE_LOCAL; else if (!strcmp(value, "remote")) autorebase = AUTOREBASE_REMOTE; else if (!strcmp(value, "always")) autorebase = AUTOREBASE_ALWAYS; else return error("Malformed value for %s", var); return 0; } /* Add other config variables here and to Documentation/config.txt. */ return 0; }
int git_default_config(const char *var, const char *value, void *dummy) { if (!prefixcmp(var, "core.")) return git_default_core_config(var, value); if (!prefixcmp(var, "user.")) return git_default_user_config(var, value); if (!prefixcmp(var, "i18n.")) return git_default_i18n_config(var, value); if (!prefixcmp(var, "branch.")) return git_default_branch_config(var, value); if (!prefixcmp(var, "mailmap.")) return git_default_mailmap_config(var, value); if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) { pager_use_color = git_config_bool(var,value); return 0; } /* Add other config variables here and to Documentation/config.txt. */ return 0; }
static int notes_rewrite_config(const char *k, const char *v, void *cb) { struct notes_rewrite_cfg *c = cb; if (!prefixcmp(k, "notes.rewrite.") && !strcmp(k+14, c->cmd)) { c->enabled = git_config_bool(k, v); return 0; } else if (!c->mode_from_env && !strcmp(k, "notes.rewritemode")) { if (!v) config_error_nonbool(k); c->combine = parse_combine_notes_fn(v); if (!c->combine) { error(_("Bad notes.rewriteMode value: '%s'"), v); return 1; } return 0; } else if (!c->refs_from_env && !strcmp(k, "notes.rewriteref")) { /* note that a refs/ prefix is implied in the * underlying for_each_glob_ref */ if (!prefixcmp(v, "refs/notes/")) string_list_add_refs_by_glob(c->refs, v); else warning(_("Refusing to rewrite notes in %s" " (outside of refs/notes/)"), v); return 0; } return 0; }
static int pager_command_config(const char *var, const char *value, void *data) { struct pager_config *c = data; if (!prefixcmp(var, "pager.") && !strcmp(var + 6, c->cmd)) c->val = git_config_bool(var, value); return 0; }
int git_ident_config(const char *var, const char *value, void *data) { if (!strcmp(var, "user.useconfigonly")) { ident_use_config_only = git_config_bool(var, value); return 0; } if (!strcmp(var, "user.name")) { if (!value) return config_error_nonbool(var); 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; ident_config_given |= IDENT_NAME_GIVEN; return 0; } if (!strcmp(var, "user.email")) { if (!value) return config_error_nonbool(var); 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; ident_config_given |= IDENT_MAIL_GIVEN; return 0; } return 0; }
static int gc_config(const char *var, const char *value) { if (!strcmp(var, "gc.packrefs")) { if (value && !strcmp(value, "notbare")) pack_refs = -1; else pack_refs = git_config_bool(var, value); return 0; } if (!strcmp(var, "gc.aggressivewindow")) { aggressive_window = git_config_int(var, value); return 0; } if (!strcmp(var, "gc.auto")) { gc_auto_threshold = git_config_int(var, value); return 0; } if (!strcmp(var, "gc.autopacklimit")) { gc_auto_pack_limit = git_config_int(var, value); return 0; } if (!strcmp(var, "gc.pruneexpire")) { if (!value) return config_error_nonbool(var); if (strcmp(value, "now")) { unsigned long now = approxidate("now"); if (approxidate(value) >= now) return error("Invalid %s: '%s'", var, value); } prune_expire = xstrdup(value); return 0; } return git_default_config(var, value); }
int git_config_colorbool(const char *var, const char *value, int stdout_is_tty) { if (value) { if (!strcasecmp(value, "never")) return 0; if (!strcasecmp(value, "always")) return 1; if (!strcasecmp(value, "auto")) goto auto_color; } /* Missing or explicit false to turn off colorization */ if (!git_config_bool(var, value)) return 0; /* any normal truth value defaults to 'auto' */ auto_color: if (stdout_is_tty < 0) stdout_is_tty = isatty(1); if (stdout_is_tty || (pager_in_use() && pager_use_color)) { char *term = getenv("TERM"); if (term && strcmp(term, "dumb")) return 1; } return 0; }
static int send_pack_config(const char *var, const char *value, void *unused) { if (!strcmp("sendpack.sideband", var)) config_use_sideband = git_config_bool(var, value); return 0; }
static int get_colorbool(int argc, const char **argv) { /* * git config --get-colorbool <slot> [<stdout-is-tty>] * * returns "true" or "false" depending on how <slot> * is configured. */ if (argc == 2) stdout_is_tty = git_config_bool("command line", argv[1]); else if (argc == 1) stdout_is_tty = isatty(1); else usage(git_config_set_usage); get_colorbool_found = -1; get_diff_color_found = -1; get_color_slot = argv[0]; git_config(git_get_colorbool_config); if (get_colorbool_found < 0) { if (!strcmp(get_color_slot, "color.diff")) get_colorbool_found = get_diff_color_found; if (get_colorbool_found < 0) get_colorbool_found = git_use_color_default; } if (argc == 1) { return get_colorbool_found ? 0 : 1; } else { printf("%s\n", get_colorbool_found ? "true" : "false"); return 0; } }
static int git_format_config(const char *var, const char *value, void *cb) { if (!strcmp(var, "format.headers")) { if (!value) die("format.headers without value"); add_header(value); return 0; } if (!strcmp(var, "format.suffix")) { if (!value) return config_error_nonbool(var); fmt_patch_suffix = xstrdup(value); return 0; } if (!strcmp(var, "format.cc")) { if (!value) return config_error_nonbool(var); ALLOC_GROW(extra_cc, extra_cc_nr + 1, extra_cc_alloc); extra_cc[extra_cc_nr++] = xstrdup(value); return 0; } if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) { return 0; } if (!strcmp(var, "format.numbered")) { if (value && !strcasecmp(value, "auto")) { auto_number = 1; return 0; } numbered = git_config_bool(var, value); return 0; } return git_log_config(var, value, cb); }
static int git_merge_config(const char *k, const char *v, void *cb) { int status; if (branch && starts_with(k, "branch.") && starts_with(k + 7, branch) && !strcmp(k + 7 + strlen(branch), ".mergeoptions")) { free(branch_mergeoptions); branch_mergeoptions = xstrdup(v); return 0; } if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat")) show_diffstat = git_config_bool(k, v); else if (!strcmp(k, "pull.twohead")) return git_config_string(&pull_twohead, k, v); else if (!strcmp(k, "pull.octopus")) return git_config_string(&pull_octopus, k, v); else if (!strcmp(k, "merge.renormalize")) option_renormalize = git_config_bool(k, v); else if (!strcmp(k, "merge.ff")) { int boolval = git_config_maybe_bool(k, v); if (0 <= boolval) { fast_forward = boolval ? FF_ALLOW : FF_NO; } else if (v && !strcmp(v, "only")) { fast_forward = FF_ONLY; } /* do not barf on values from future versions of git */ return 0; } else if (!strcmp(k, "merge.defaulttoupstream")) { default_to_upstream = git_config_bool(k, v); return 0; } else if (!strcmp(k, "merge.verifysignatures")) { verify_signatures = git_config_bool(k, v); return 0; } else if (!strcmp(k, "commit.gpgsign")) { sign_commit = git_config_bool(k, v) ? "" : NULL; return 0; } status = fmt_merge_msg_config(k, v, cb); if (status) return status; status = git_gpg_config(k, v, NULL); if (status) return status; return git_diff_ui_config(k, v, cb); }
static int gc_config(const char *var, const char *value, void *cb) { if (!strcmp(var, "gc.packrefs")) { if (value && !strcmp(value, "notbare")) pack_refs = -1; else pack_refs = git_config_bool(var, value); return 0; } if (!strcmp(var, "gc.aggressivewindow")) { aggressive_window = git_config_int(var, value); return 0; } if (!strcmp(var, "gc.aggressivedepth")) { aggressive_depth = git_config_int(var, value); return 0; } if (!strcmp(var, "gc.auto")) { gc_auto_threshold = git_config_int(var, value); return 0; } if (!strcmp(var, "gc.autopacklimit")) { gc_auto_pack_limit = git_config_int(var, value); return 0; } if (!strcmp(var, "gc.autodetach")) { detach_auto = git_config_bool(var, value); return 0; } if (!strcmp(var, "gc.pruneexpire")) { if (value && strcmp(value, "now")) { unsigned long now = approxidate("now"); if (approxidate(value) >= now) return error(_("Invalid %s: '%s'"), var, value); } return git_config_string(&prune_expire, var, value); } if (!strcmp(var, "gc.prunereposexpire")) { if (value && strcmp(value, "now")) { unsigned long now = approxidate("now"); if (approxidate(value) >= now) return error(_("Invalid %s: '%s'"), var, value); } return git_config_string(&prune_repos_expire, var, value); } return git_default_config(var, value, cb); }
static int grep_config(const char *var, const char *value, void *cb) { struct grep_opt *opt = cb; char *color = NULL; if (userdiff_config(var, value) < 0) return -1; if (!strcmp(var, "grep.extendedregexp")) { if (git_config_bool(var, value)) opt->regflags |= REG_EXTENDED; else opt->regflags &= ~REG_EXTENDED; return 0; } if (!strcmp(var, "grep.linenumber")) { opt->linenum = git_config_bool(var, value); return 0; } if (!strcmp(var, "color.grep")) opt->color = git_config_colorbool(var, value); else if (!strcmp(var, "color.grep.context")) color = opt->color_context; else if (!strcmp(var, "color.grep.filename")) color = opt->color_filename; else if (!strcmp(var, "color.grep.function")) color = opt->color_function; else if (!strcmp(var, "color.grep.linenumber")) color = opt->color_lineno; else if (!strcmp(var, "color.grep.match")) color = opt->color_match; else if (!strcmp(var, "color.grep.selected")) color = opt->color_selected; else if (!strcmp(var, "color.grep.separator")) color = opt->color_sep; else return git_color_default_config(var, value, cb); if (color) { if (!value) return config_error_nonbool(var); color_parse(value, var, color); } return 0; }
static int parse_tristate(int *b, const char *k, const char *v) { if (v && !strcasecmp(v, "auto")) *b = -1; else *b = git_config_bool(k, v); return 1; }
static int add_config(const char *var, const char *value, void *cb) { if (!strcasecmp(var, "add.ignore-errors")) { ignore_add_errors = git_config_bool(var, value); return 0; } return git_default_config(var, value, cb); }
/** * Read config variables. */ static int git_pull_config(const char *var, const char *value, void *cb) { if (!strcmp(var, "rebase.autostash")) { config_autostash = git_config_bool(var, value); return 0; } return git_default_config(var, value, cb); }
static int git_log_config(const char *var, const char *value, void *cb) { const char *slot_name; if (!strcmp(var, "format.pretty")) return git_config_string(&fmt_pretty, var, value); if (!strcmp(var, "format.subjectprefix")) return git_config_string(&fmt_patch_subject_prefix, var, value); if (!strcmp(var, "log.abbrevcommit")) { default_abbrev_commit = git_config_bool(var, value); return 0; } if (!strcmp(var, "log.date")) return git_config_string(&default_date_mode, var, value); if (!strcmp(var, "log.decorate")) { decoration_style = parse_decoration_style(var, value); if (decoration_style < 0) decoration_style = 0; /* maybe warn? */ return 0; } if (!strcmp(var, "log.showroot")) { default_show_root = git_config_bool(var, value); return 0; } if (!strcmp(var, "log.follow")) { default_follow = git_config_bool(var, value); return 0; } if (skip_prefix(var, "color.decorate.", &slot_name)) return parse_decorate_color_config(var, slot_name, value); if (!strcmp(var, "log.mailmap")) { use_mailmap_config = git_config_bool(var, value); return 0; } if (!strcmp(var, "log.showsignature")) { default_show_signature = git_config_bool(var, value); return 0; } if (grep_config(var, value, cb) < 0) return -1; if (git_gpg_config(var, value, cb) < 0) return -1; return git_diff_ui_config(var, value, cb); }
static int git_worktree_config(const char *var, const char *value, void *cb) { if (!strcmp(var, "worktree.guessremote")) { guess_remote = git_config_bool(var, value); return 0; } return git_default_config(var, value, cb); }
static int receive_pack_config(const char *var, const char *value, void *cb) { if (strcmp(var, "receive.denydeletes") == 0) { deny_deletes = git_config_bool(var, value); return 0; } if (strcmp(var, "receive.denynonfastforwards") == 0) { deny_non_fast_forwards = git_config_bool(var, value); return 0; } if (strcmp(var, "receive.unpacklimit") == 0) { receive_unpack_limit = git_config_int(var, value); return 0; } if (strcmp(var, "transfer.unpacklimit") == 0) { transfer_unpack_limit = git_config_int(var, value); return 0; } if (strcmp(var, "receive.fsckobjects") == 0) { receive_fsck_objects = git_config_bool(var, value); return 0; } if (!strcmp(var, "receive.denycurrentbranch")) { deny_current_branch = parse_deny_action(var, value); return 0; } if (strcmp(var, "receive.denydeletecurrent") == 0) { deny_delete_current = parse_deny_action(var, value); return 0; } if (strcmp(var, "repack.usedeltabaseoffset") == 0) { prefer_ofs_delta = git_config_bool(var, value); return 0; } return git_default_config(var, value, cb); }
static int git_push_config(const char *k, const char *v, void *cb) { int *flags = cb; int status; status = git_gpg_config(k, v, NULL); if (status) return status; if (!strcmp(k, "push.followtags")) { if (git_config_bool(k, v)) *flags |= TRANSPORT_PUSH_FOLLOW_TAGS; else *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS; return 0; } else if (!strcmp(k, "push.gpgsign")) { const char *value; if (!git_config_get_value("push.gpgsign", &value)) { switch (git_parse_maybe_bool(value)) { case 0: set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER); break; case 1: set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS); break; default: if (value && !strcasecmp(value, "if-asked")) set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED); else return error("Invalid value for '%s'", k); } } } else if (!strcmp(k, "push.recursesubmodules")) { const char *value; if (!git_config_get_value("push.recursesubmodules", &value)) recurse_submodules = parse_push_recurse_submodules_arg(k, value); } else if (!strcmp(k, "submodule.recurse")) { int val = git_config_bool(k, v) ? RECURSE_SUBMODULES_ON_DEMAND : RECURSE_SUBMODULES_OFF; recurse_submodules = val; } return git_default_config(k, v, NULL); }
static int show_config(const char *key_, const char *value_, void *cb) { char value[256]; const char *vptr = value; int must_free_vptr = 0; int dup_error = 0; if (!use_key_regexp && strcmp(key_, key)) return 0; if (use_key_regexp && regexec(key_regexp, key_, 0, NULL, 0)) return 0; if (regexp != NULL && (do_not_match ^ !!regexec(regexp, (value_?value_:""), 0, NULL, 0))) return 0; if (show_keys) { if (value_) printf("%s%c", key_, key_delim); else printf("%s", key_); } if (seen && !do_all) dup_error = 1; if (types == TYPE_INT) sprintf(value, "%d", git_config_int(key_, value_?value_:"")); else if (types == TYPE_BOOL) vptr = git_config_bool(key_, value_) ? "true" : "false"; else if (types == TYPE_BOOL_OR_INT) { int is_bool, v; v = git_config_bool_or_int(key_, value_, &is_bool); if (is_bool) vptr = v ? "true" : "false"; else sprintf(value, "%d", v); } else if (types == TYPE_PATH) { git_config_pathname(&vptr, key_, value_); must_free_vptr = 1; } else vptr = value_?value_:""; seen++; if (dup_error) { error("More than one value for the key %s: %s", key_, vptr); } else printf("%s%c", vptr, term); if (must_free_vptr) /* If vptr must be freed, it's a pointer to a * dynamically allocated buffer, it's safe to cast to * const. */ free((char *)vptr); return 0; }
int submodule_config(const char *var, const char *value, void *cb) { if (!prefixcmp(var, "submodule.")) return parse_submodule_config_option(var, value); else if (!strcmp(var, "fetch.recursesubmodules")) { config_fetch_recurse_submodules = git_config_bool(var, value); return 0; } return 0; }
static int http_options(const char *var, const char *value, void *cb) { if (!strcmp("http.sslverify", var)) { curl_ssl_verify = git_config_bool(var, value); return 0; } if (!strcmp("http.sslcert", var)) return git_config_string(&ssl_cert, var, value); #if LIBCURL_VERSION_NUM >= 0x070902 if (!strcmp("http.sslkey", var)) return git_config_string(&ssl_key, var, value); #endif #if LIBCURL_VERSION_NUM >= 0x070908 if (!strcmp("http.sslcapath", var)) return git_config_string(&ssl_capath, var, value); #endif if (!strcmp("http.sslcainfo", var)) return git_config_string(&ssl_cainfo, var, value); #ifdef USE_CURL_MULTI if (!strcmp("http.maxrequests", var)) { max_requests = git_config_int(var, value); return 0; } #endif if (!strcmp("http.lowspeedlimit", var)) { curl_low_speed_limit = (long)git_config_int(var, value); return 0; } if (!strcmp("http.lowspeedtime", var)) { curl_low_speed_time = (long)git_config_int(var, value); return 0; } if (!strcmp("http.noepsv", var)) { curl_ftp_no_epsv = git_config_bool(var, value); return 0; } if (!strcmp("http.proxy", var)) return git_config_string(&curl_http_proxy, var, value); /* Fall back on the default ones */ return git_default_config(var, value, cb); }
static int upload_pack_config(const char *var, const char *value, void *unused) { if (!strcmp("uploadpack.allowtipsha1inwant", var)) { if (git_config_bool(var, value)) allow_unadvertised_object_request |= ALLOW_TIP_SHA1; else allow_unadvertised_object_request &= ~ALLOW_TIP_SHA1; } else if (!strcmp("uploadpack.allowreachablesha1inwant", var)) { if (git_config_bool(var, value)) allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1; else allow_unadvertised_object_request &= ~ALLOW_REACHABLE_SHA1; } else if (!strcmp("uploadpack.keepalive", var)) { keepalive = git_config_int(var, value); if (!keepalive) keepalive = -1; } return parse_hide_refs_config(var, value, "uploadpack"); }
int pager_in_use(void) { const char *env; if (spawned_pager) return 1; env = getenv("GIT_PAGER_IN_USE"); return env ? git_config_bool("GIT_PAGER_IN_USE", env) : 0; }
static int git_merge_config(const char *k, const char *v, void *cb) { int status; if (branch && !prefixcmp(k, "branch.") && !prefixcmp(k + 7, branch) && !strcmp(k + 7 + strlen(branch), ".mergeoptions")) { free(branch_mergeoptions); branch_mergeoptions = xstrdup(v); return 0; } if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat")) show_diffstat = git_config_bool(k, v); else if (!strcmp(k, "pull.twohead")) return git_config_string(&pull_twohead, k, v); else if (!strcmp(k, "pull.octopus")) return git_config_string(&pull_octopus, k, v); else if (!strcmp(k, "merge.renormalize")) option_renormalize = git_config_bool(k, v); else if (!strcmp(k, "merge.ff")) { int boolval = git_config_maybe_bool(k, v); if (0 <= boolval) { allow_fast_forward = boolval; } else if (v && !strcmp(v, "only")) { allow_fast_forward = 1; fast_forward_only = 1; } /* do not barf on values from future versions of git */ return 0; } else if (!strcmp(k, "merge.defaulttoupstream")) { default_to_upstream = git_config_bool(k, v); return 0; } status = fmt_merge_msg_config(k, v, cb); if (status) return status; status = git_gpg_config(k, v, NULL); if (status) return status; return git_diff_ui_config(k, v, cb); }
static int upload_pack_config(const char *var, const char *value, void *unused) { if (!strcmp("uploadpack.allowtipsha1inwant", var)) allow_tip_sha1_in_want = git_config_bool(var, value); else if (!strcmp("uploadpack.keepalive", var)) { keepalive = git_config_int(var, value); if (!keepalive) keepalive = -1; } return parse_hide_refs_config(var, value, "uploadpack"); }
static int git_daemon_config(const char *var, const char *value, void *cb) { if (!prefixcmp(var, "daemon.") && !strcmp(var + 7, service_looking_at->config_name)) { service_enabled = git_config_bool(var, value); return 0; } /* we are not interested in parsing any other configuration here */ return 0; }
static int git_patch_id_config(const char *var, const char *value, void *cb) { int *stable = cb; if (!strcmp(var, "patchid.stable")) { *stable = git_config_bool(var, value); return 0; } return git_default_config(var, value, cb); }