@@ -356,6 +356,7 @@ static int git_merge_trees(struct merge_options *o,
356356 o -> unpack_opts .fn = threeway_merge ;
357357 o -> unpack_opts .src_index = & the_index ;
358358 o -> unpack_opts .dst_index = & tmp_index ;
359+ o -> unpack_opts .aggressive = !merge_detect_rename (o );
359360 setup_unpack_trees_porcelain (& o -> unpack_opts , "merge" );
360361
361362 init_tree_desc_from_tree (t + 0 , common );
@@ -1603,7 +1604,15 @@ static struct diff_queue_struct *get_diffpairs(struct merge_options *o,
16031604 diff_setup (& opts );
16041605 opts .flags .recursive = 1 ;
16051606 opts .flags .rename_empty = 0 ;
1606- opts .detect_rename = DIFF_DETECT_RENAME ;
1607+ opts .detect_rename = merge_detect_rename (o );
1608+ /*
1609+ * We do not have logic to handle the detection of copies. In
1610+ * fact, it may not even make sense to add such logic: would we
1611+ * really want a change to a base file to be propagated through
1612+ * multiple other files by a merge?
1613+ */
1614+ if (opts .detect_rename > DIFF_DETECT_RENAME )
1615+ opts .detect_rename = DIFF_DETECT_RENAME ;
16071616 opts .rename_limit = o -> merge_rename_limit >= 0 ? o -> merge_rename_limit :
16081617 o -> diff_rename_limit >= 0 ? o -> diff_rename_limit :
16091618 1000 ;
@@ -2643,7 +2652,7 @@ static int handle_renames(struct merge_options *o,
26432652 ri -> head_renames = NULL ;
26442653 ri -> merge_renames = NULL ;
26452654
2646- if (!o -> detect_rename )
2655+ if (!merge_detect_rename ( o ) )
26472656 return 1 ;
26482657
26492658 head_pairs = get_diffpairs (o , common , head );
@@ -3325,9 +3334,18 @@ int merge_recursive_generic(struct merge_options *o,
33253334
33263335static void merge_recursive_config (struct merge_options * o )
33273336{
3337+ char * value = NULL ;
33283338 git_config_get_int ("merge.verbosity" , & o -> verbosity );
33293339 git_config_get_int ("diff.renamelimit" , & o -> diff_rename_limit );
33303340 git_config_get_int ("merge.renamelimit" , & o -> merge_rename_limit );
3341+ if (!git_config_get_string ("diff.renames" , & value )) {
3342+ o -> diff_detect_rename = git_config_rename ("diff.renames" , value );
3343+ free (value );
3344+ }
3345+ if (!git_config_get_string ("merge.renames" , & value )) {
3346+ o -> merge_detect_rename = git_config_rename ("merge.renames" , value );
3347+ free (value );
3348+ }
33313349 git_config (git_xmerge_config , NULL );
33323350}
33333351
@@ -3340,7 +3358,8 @@ void init_merge_options(struct merge_options *o)
33403358 o -> diff_rename_limit = -1 ;
33413359 o -> merge_rename_limit = -1 ;
33423360 o -> renormalize = 0 ;
3343- o -> detect_rename = 1 ;
3361+ o -> diff_detect_rename = -1 ;
3362+ o -> merge_detect_rename = -1 ;
33443363 merge_recursive_config (o );
33453364 merge_verbosity = getenv ("GIT_MERGE_VERBOSITY" );
33463365 if (merge_verbosity )
@@ -3391,16 +3410,16 @@ int parse_merge_opt(struct merge_options *o, const char *s)
33913410 else if (!strcmp (s , "no-renormalize" ))
33923411 o -> renormalize = 0 ;
33933412 else if (!strcmp (s , "no-renames" ))
3394- o -> detect_rename = 0 ;
3413+ o -> merge_detect_rename = 0 ;
33953414 else if (!strcmp (s , "find-renames" )) {
3396- o -> detect_rename = 1 ;
3415+ o -> merge_detect_rename = 1 ;
33973416 o -> rename_score = 0 ;
33983417 }
33993418 else if (skip_prefix (s , "find-renames=" , & arg ) ||
34003419 skip_prefix (s , "rename-threshold=" , & arg )) {
34013420 if ((o -> rename_score = parse_rename_score (& arg )) == -1 || * arg != 0 )
34023421 return -1 ;
3403- o -> detect_rename = 1 ;
3422+ o -> merge_detect_rename = 1 ;
34043423 }
34053424 else
34063425 return -1 ;
0 commit comments