static int default_edit_option(void) { static const char name[] = "GIT_MERGE_AUTOEDIT"; const char *e = getenv(name); struct stat st_stdin, st_stdout; if (have_message) /* an explicit -m msg without --[no-]edit */ return 0; if (e) { int v = git_config_maybe_bool(name, e); if (v < 0) die("Bad value '%s' in environment '%s'", e, name); return v; } /* Use editor if stdin and stdout are the same and is a tty */ return (!fstat(0, &st_stdin) && !fstat(1, &st_stdout) && isatty(0) && isatty(1) && st_stdin.st_dev == st_stdout.st_dev && st_stdin.st_ino == st_stdout.st_ino && st_stdin.st_mode == st_stdout.st_mode); }
static int parse_push_recurse(const char *opt, const char *arg, int die_on_error) { switch (git_config_maybe_bool(opt, arg)) { case 1: /* There's no simple "on" value when pushing */ if (die_on_error) die("bad %s argument: %s", opt, arg); else return RECURSE_SUBMODULES_ERROR; case 0: return RECURSE_SUBMODULES_OFF; default: if (!strcmp(arg, "on-demand")) return RECURSE_SUBMODULES_ON_DEMAND; else if (!strcmp(arg, "check")) return RECURSE_SUBMODULES_CHECK; else if (!strcmp(arg, "only")) return RECURSE_SUBMODULES_ONLY; else if (die_on_error) die("bad %s argument: %s", opt, arg); else return RECURSE_SUBMODULES_ERROR; } }
int git_config_bool_or_int(const char *name, const char *value, int *is_bool) { int v = git_config_maybe_bool(name, value); if (0 <= v) { *is_bool = 1; return v; } *is_bool = 0; return git_config_int(name, value); }
int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg) { switch (git_config_maybe_bool(opt, arg)) { case 1: return RECURSE_SUBMODULES_ON; case 0: return RECURSE_SUBMODULES_OFF; default: if (!strcmp(arg, "on-demand")) return RECURSE_SUBMODULES_ON_DEMAND; die("bad %s argument: %s", opt, arg); } }
int parse_update_recurse_submodules_arg(const char *opt, const char *arg) { switch (git_config_maybe_bool(opt, arg)) { case 1: return RECURSE_SUBMODULES_ON; case 0: return RECURSE_SUBMODULES_OFF; default: if (!strcmp(arg, "checkout")) return RECURSE_SUBMODULES_ON; die("bad %s argument: %s", opt, arg); } }
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)) { int b = git_config_maybe_bool(var, value); if (b >= 0) c->want = b; else { c->want = 1; c->value = xstrdup(value); } } return 0; }
static int parse_update_recurse(const char *opt, const char *arg, int die_on_error) { switch (git_config_maybe_bool(opt, arg)) { case 1: return RECURSE_SUBMODULES_ON; case 0: return RECURSE_SUBMODULES_OFF; default: if (die_on_error) die("bad %s argument: %s", opt, arg); return RECURSE_SUBMODULES_ERROR; } }
static int parse_decoration_style(const char *var, const char *value) { switch (git_config_maybe_bool(var, value)) { case 1: return DECORATE_SHORT_REFS; case 0: return 0; default: break; } if (!strcmp(value, "full")) return DECORATE_FULL_REFS; else if (!strcmp(value, "short")) return DECORATE_SHORT_REFS; return -1; }
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 pager_command_config(const char *var, const char *value, void *vdata) { struct pager_command_config_data *data = vdata; const char *cmd; if (skip_prefix(var, "pager.", &cmd) && !strcmp(cmd, data->cmd)) { int b = git_config_maybe_bool(var, value); if (b >= 0) data->want = b; else { data->want = 1; data->value = xstrdup(value); } } return 0; }
static int parse_fetch_recurse(const char *opt, const char *arg, int die_on_error) { switch (git_config_maybe_bool(opt, arg)) { case 1: return RECURSE_SUBMODULES_ON; case 0: return RECURSE_SUBMODULES_OFF; default: if (!strcmp(arg, "on-demand")) return RECURSE_SUBMODULES_ON_DEMAND; if (die_on_error) die("bad %s argument: %s", opt, arg); else return RECURSE_SUBMODULES_ERROR; } }
/** * If pull.ff is unset, returns NULL. If pull.ff is "true", returns "--ff". If * pull.ff is "false", returns "--no-ff". If pull.ff is "only", returns * "--ff-only". Otherwise, if pull.ff is set to an invalid value, die with an * error. */ static const char *config_get_ff(void) { const char *value; if (git_config_get_value("pull.ff", &value)) return NULL; switch (git_config_maybe_bool("pull.ff", value)) { case 0: return "--no-ff"; case 1: return "--ff"; } if (!strcmp(value, "only")) return "--ff-only"; die(_("Invalid value for pull.ff: %s"), value); }
/** * Parses the value of --rebase. If value is a false value, returns * REBASE_FALSE. If value is a true value, returns REBASE_TRUE. If value is * "preserve", returns REBASE_PRESERVE. If value is a invalid value, dies with * a fatal error if fatal is true, otherwise returns REBASE_INVALID. */ static enum rebase_type parse_config_rebase(const char *key, const char *value, int fatal) { int v = git_config_maybe_bool("pull.rebase", value); if (!v) return REBASE_FALSE; else if (v > 0) return REBASE_TRUE; else if (!strcmp(value, "preserve")) return REBASE_PRESERVE; if (fatal) die(_("Invalid value for %s: %s"), key, value); else error(_("Invalid value for %s: %s"), key, value); return REBASE_INVALID; }
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 git_merge_config(const char *k, const char *v, void *cb) { 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.log") || !strcmp(k, "merge.summary")) { int is_bool; shortlog_len = git_config_bool_or_int(k, v, &is_bool); if (!is_bool && shortlog_len < 0) return error(_("%s: negative length %s"), k, v); if (is_bool && shortlog_len) shortlog_len = DEFAULT_MERGE_LOG_LEN; return 0; } 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; } return git_diff_ui_config(k, v, 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_config_maybe_bool("push.gpgsign", 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); } return git_default_config(k, v, NULL); }