@@ -124,6 +124,7 @@ struct rebase_options {
124124 int fork_point ;
125125 int update_refs ;
126126 int config_autosquash ;
127+ int config_rebase_merges ;
127128 int config_update_refs ;
128129};
129130
@@ -141,6 +142,8 @@ struct rebase_options {
141142 .allow_empty_message = 1, \
142143 .autosquash = -1, \
143144 .config_autosquash = -1, \
145+ .rebase_merges = -1, \
146+ .config_rebase_merges = -1, \
144147 .update_refs = -1, \
145148 .config_update_refs = -1, \
146149 }
@@ -772,6 +775,16 @@ static int run_specific_rebase(struct rebase_options *opts)
772775 return status ? -1 : 0 ;
773776}
774777
778+ static void parse_rebase_merges_value (struct rebase_options * options , const char * value )
779+ {
780+ if (!strcmp ("no-rebase-cousins" , value ))
781+ options -> rebase_cousins = 0 ;
782+ else if (!strcmp ("rebase-cousins" , value ))
783+ options -> rebase_cousins = 1 ;
784+ else
785+ die (_ ("Unknown rebase-merges mode: %s" ), value );
786+ }
787+
775788static int rebase_config (const char * var , const char * value , void * data )
776789{
777790 struct rebase_options * opts = data ;
@@ -801,6 +814,17 @@ static int rebase_config(const char *var, const char *value, void *data)
801814 return 0 ;
802815 }
803816
817+ if (!strcmp (var , "rebase.rebasemerges" )) {
818+ opts -> config_rebase_merges = git_parse_maybe_bool (value );
819+ if (opts -> config_rebase_merges < 0 ) {
820+ opts -> config_rebase_merges = 1 ;
821+ parse_rebase_merges_value (opts , value );
822+ } else {
823+ opts -> rebase_cousins = 0 ;
824+ }
825+ return 0 ;
826+ }
827+
804828 if (!strcmp (var , "rebase.updaterefs" )) {
805829 opts -> config_update_refs = git_config_bool (var , value );
806830 return 0 ;
@@ -981,6 +1005,28 @@ static int parse_opt_empty(const struct option *opt, const char *arg, int unset)
9811005 return 0 ;
9821006}
9831007
1008+ static int parse_opt_rebase_merges (const struct option * opt , const char * arg , int unset )
1009+ {
1010+ struct rebase_options * options = opt -> value ;
1011+
1012+ options -> rebase_merges = !unset ;
1013+ options -> rebase_cousins = 0 ;
1014+
1015+ if (arg ) {
1016+ if (!* arg ) {
1017+ warning (_ ("--rebase-merges with an empty string "
1018+ "argument is deprecated and will stop "
1019+ "working in a future version of Git. Use "
1020+ "--rebase-merges without an argument "
1021+ "instead, which does the same thing." ));
1022+ return 0 ;
1023+ }
1024+ parse_rebase_merges_value (options , arg );
1025+ }
1026+
1027+ return 0 ;
1028+ }
1029+
9841030static void NORETURN error_on_missing_default_upstream (void )
9851031{
9861032 struct branch * current_branch = branch_get (NULL );
@@ -1036,7 +1082,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
10361082 struct object_id branch_base ;
10371083 int ignore_whitespace = 0 ;
10381084 const char * gpg_sign = NULL ;
1039- const char * rebase_merges = NULL ;
10401085 struct string_list strategy_options = STRING_LIST_INIT_NODUP ;
10411086 struct object_id squash_onto ;
10421087 char * squash_onto_name = NULL ;
@@ -1138,10 +1183,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
11381183 & options .allow_empty_message ,
11391184 N_ ("allow rebasing commits with empty messages" ),
11401185 PARSE_OPT_HIDDEN ),
1141- {OPTION_STRING , 'r' , "rebase-merges" , & rebase_merges ,
1142- N_ ("mode" ),
1186+ OPT_CALLBACK_F ('r' , "rebase-merges" , & options , N_ ("mode" ),
11431187 N_ ("try to rebase merges instead of skipping them" ),
1144- PARSE_OPT_OPTARG , NULL , ( intptr_t ) "" } ,
1188+ PARSE_OPT_OPTARG , parse_opt_rebase_merges ) ,
11451189 OPT_BOOL (0 , "fork-point" , & options .fork_point ,
11461190 N_ ("use 'merge-base --fork-point' to refine upstream" )),
11471191 OPT_STRING ('s' , "strategy" , & options .strategy ,
@@ -1437,17 +1481,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
14371481 if (options .exec .nr )
14381482 imply_merge (& options , "--exec" );
14391483
1440- if (rebase_merges ) {
1441- if (!* rebase_merges )
1442- ; /* default mode; do nothing */
1443- else if (!strcmp ("rebase-cousins" , rebase_merges ))
1444- options .rebase_cousins = 1 ;
1445- else if (strcmp ("no-rebase-cousins" , rebase_merges ))
1446- die (_ ("Unknown mode: %s" ), rebase_merges );
1447- options .rebase_merges = 1 ;
1448- imply_merge (& options , "--rebase-merges" );
1449- }
1450-
14511484 if (options .type == REBASE_APPLY ) {
14521485 if (ignore_whitespace )
14531486 strvec_push (& options .git_am_opts ,
@@ -1515,6 +1548,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
15151548 "cannot be used together" ));
15161549 else if (options .autosquash == -1 && options .config_autosquash == 1 )
15171550 die (_ ("apply options are incompatible with rebase.autoSquash. Consider adding --no-autosquash" ));
1551+ else if (options .rebase_merges == -1 && options .config_rebase_merges == 1 )
1552+ die (_ ("apply options are incompatible with rebase.rebaseMerges. Consider adding --no-rebase-merges" ));
15181553 else if (options .update_refs == -1 && options .config_update_refs == 1 )
15191554 die (_ ("apply options are incompatible with rebase.updateRefs. Consider adding --no-update-refs" ));
15201555 else
@@ -1527,6 +1562,11 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
15271562 options .update_refs = (options .update_refs >= 0 ) ? options .update_refs :
15281563 ((options .config_update_refs >= 0 ) ? options .config_update_refs : 0 );
15291564
1565+ if (options .rebase_merges == 1 )
1566+ imply_merge (& options , "--rebase-merges" );
1567+ options .rebase_merges = (options .rebase_merges >= 0 ) ? options .rebase_merges :
1568+ ((options .config_rebase_merges >= 0 ) ? options .config_rebase_merges : 0 );
1569+
15301570 if (options .autosquash == 1 )
15311571 imply_merge (& options , "--autosquash" );
15321572 options .autosquash = (options .autosquash >= 0 ) ? options .autosquash :
0 commit comments