rebase: add a config option for --rebase-merges
The purpose of the new option is to accommodate users who would like --rebase-merges to be on by default and to facilitate turning on --rebase-merges by default without configuration in a future version of Git. Name the new option rebase.rebaseMerges, even though it is a little redundant, for consistency with the name of the command line option and to be clear when scrolling through values in the [rebase] section of .gitconfig. Support setting rebase.rebaseMerges to the nonspecific value "true" for users who don't need to or don't want to learn about the difference between rebase-cousins and no-rebase-cousins. Make --rebase-merges without an argument on the command line override any value of rebase.rebaseMerges in the configuration, for consistency with other command line flags with optional arguments that have an associated config option. Signed-off-by: Alex Henrie <alexhenrie24@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
33561f5170
commit
6605fb70cb
@ -124,6 +124,7 @@ struct rebase_options {
|
||||
int fork_point;
|
||||
int update_refs;
|
||||
int config_autosquash;
|
||||
int config_rebase_merges;
|
||||
int config_update_refs;
|
||||
};
|
||||
|
||||
@ -141,6 +142,8 @@ struct rebase_options {
|
||||
.allow_empty_message = 1, \
|
||||
.autosquash = -1, \
|
||||
.config_autosquash = -1, \
|
||||
.rebase_merges = -1, \
|
||||
.config_rebase_merges = -1, \
|
||||
.update_refs = -1, \
|
||||
.config_update_refs = -1, \
|
||||
}
|
||||
@ -772,6 +775,16 @@ static int run_specific_rebase(struct rebase_options *opts)
|
||||
return status ? -1 : 0;
|
||||
}
|
||||
|
||||
static void parse_rebase_merges_value(struct rebase_options *options, const char *value)
|
||||
{
|
||||
if (!strcmp("no-rebase-cousins", value))
|
||||
options->rebase_cousins = 0;
|
||||
else if (!strcmp("rebase-cousins", value))
|
||||
options->rebase_cousins = 1;
|
||||
else
|
||||
die(_("Unknown rebase-merges mode: %s"), value);
|
||||
}
|
||||
|
||||
static int rebase_config(const char *var, const char *value, void *data)
|
||||
{
|
||||
struct rebase_options *opts = data;
|
||||
@ -801,6 +814,17 @@ static int rebase_config(const char *var, const char *value, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "rebase.rebasemerges")) {
|
||||
opts->config_rebase_merges = git_parse_maybe_bool(value);
|
||||
if (opts->config_rebase_merges < 0) {
|
||||
opts->config_rebase_merges = 1;
|
||||
parse_rebase_merges_value(opts, value);
|
||||
} else {
|
||||
opts->rebase_cousins = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "rebase.updaterefs")) {
|
||||
opts->config_update_refs = git_config_bool(var, value);
|
||||
return 0;
|
||||
@ -981,6 +1005,28 @@ static int parse_opt_empty(const struct option *opt, const char *arg, int unset)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_opt_rebase_merges(const struct option *opt, const char *arg, int unset)
|
||||
{
|
||||
struct rebase_options *options = opt->value;
|
||||
|
||||
options->rebase_merges = !unset;
|
||||
options->rebase_cousins = 0;
|
||||
|
||||
if (arg) {
|
||||
if (!*arg) {
|
||||
warning(_("--rebase-merges with an empty string "
|
||||
"argument is deprecated and will stop "
|
||||
"working in a future version of Git. Use "
|
||||
"--rebase-merges without an argument "
|
||||
"instead, which does the same thing."));
|
||||
return 0;
|
||||
}
|
||||
parse_rebase_merges_value(options, arg);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void NORETURN error_on_missing_default_upstream(void)
|
||||
{
|
||||
struct branch *current_branch = branch_get(NULL);
|
||||
@ -1036,7 +1082,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
||||
struct object_id branch_base;
|
||||
int ignore_whitespace = 0;
|
||||
const char *gpg_sign = NULL;
|
||||
const char *rebase_merges = NULL;
|
||||
struct string_list strategy_options = STRING_LIST_INIT_NODUP;
|
||||
struct object_id squash_onto;
|
||||
char *squash_onto_name = NULL;
|
||||
@ -1138,10 +1183,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
||||
&options.allow_empty_message,
|
||||
N_("allow rebasing commits with empty messages"),
|
||||
PARSE_OPT_HIDDEN),
|
||||
{OPTION_STRING, 'r', "rebase-merges", &rebase_merges,
|
||||
N_("mode"),
|
||||
OPT_CALLBACK_F('r', "rebase-merges", &options, N_("mode"),
|
||||
N_("try to rebase merges instead of skipping them"),
|
||||
PARSE_OPT_OPTARG, NULL, (intptr_t)"no-rebase-cousins"},
|
||||
PARSE_OPT_OPTARG, parse_opt_rebase_merges),
|
||||
OPT_BOOL(0, "fork-point", &options.fork_point,
|
||||
N_("use 'merge-base --fork-point' to refine upstream")),
|
||||
OPT_STRING('s', "strategy", &options.strategy,
|
||||
@ -1437,21 +1481,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
||||
if (options.exec.nr)
|
||||
imply_merge(&options, "--exec");
|
||||
|
||||
if (rebase_merges) {
|
||||
if (!*rebase_merges)
|
||||
warning(_("--rebase-merges with an empty string "
|
||||
"argument is deprecated and will stop "
|
||||
"working in a future version of Git. Use "
|
||||
"--rebase-merges without an argument "
|
||||
"instead, which does the same thing."));
|
||||
else if (!strcmp("rebase-cousins", rebase_merges))
|
||||
options.rebase_cousins = 1;
|
||||
else if (strcmp("no-rebase-cousins", rebase_merges))
|
||||
die(_("Unknown mode: %s"), rebase_merges);
|
||||
options.rebase_merges = 1;
|
||||
imply_merge(&options, "--rebase-merges");
|
||||
}
|
||||
|
||||
if (options.type == REBASE_APPLY) {
|
||||
if (ignore_whitespace)
|
||||
strvec_push(&options.git_am_opts,
|
||||
@ -1519,6 +1548,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
||||
"cannot be used together"));
|
||||
else if (options.autosquash == -1 && options.config_autosquash == 1)
|
||||
die(_("apply options are incompatible with rebase.autoSquash. Consider adding --no-autosquash"));
|
||||
else if (options.rebase_merges == -1 && options.config_rebase_merges == 1)
|
||||
die(_("apply options are incompatible with rebase.rebaseMerges. Consider adding --no-rebase-merges"));
|
||||
else if (options.update_refs == -1 && options.config_update_refs == 1)
|
||||
die(_("apply options are incompatible with rebase.updateRefs. Consider adding --no-update-refs"));
|
||||
else
|
||||
@ -1531,6 +1562,11 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
||||
options.update_refs = (options.update_refs >= 0) ? options.update_refs :
|
||||
((options.config_update_refs >= 0) ? options.config_update_refs : 0);
|
||||
|
||||
if (options.rebase_merges == 1)
|
||||
imply_merge(&options, "--rebase-merges");
|
||||
options.rebase_merges = (options.rebase_merges >= 0) ? options.rebase_merges :
|
||||
((options.config_rebase_merges >= 0) ? options.config_rebase_merges : 0);
|
||||
|
||||
if (options.autosquash == 1)
|
||||
imply_merge(&options, "--autosquash");
|
||||
options.autosquash = (options.autosquash >= 0) ? options.autosquash :
|
||||
|
Reference in New Issue
Block a user