Merge branch 'ah/rebase-merges-config'
Streamline --rebase-merges command line option handling and introduce rebase.merges configuration variable. * ah/rebase-merges-config: rebase: add a config option for --rebase-merges rebase: deprecate --rebase-merges="" rebase: add documentation and test for --no-rebase-merges
This commit is contained in:
@ -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)""},
|
||||
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,17 +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)
|
||||
; /* default mode; do nothing */
|
||||
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,
|
||||
@ -1515,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
|
||||
@ -1527,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