@@ -728,6 +728,8 @@ static void clear_or_reinit_internal_opts(struct merge_options_internal *opti,
728728 strintmap_clear_func (& renames -> deferred [i ].possible_trivial_merges );
729729 strset_clear_func (& renames -> deferred [i ].target_dirs );
730730 renames -> deferred [i ].trivial_merges_okay = 1 ; /* 1 == maybe */
731+ free (renames -> pairs [i ].queue );
732+ diff_queue_init (& renames -> pairs [i ]);
731733 }
732734 renames -> cached_pairs_valid_side = 0 ;
733735 renames -> dir_rename_mask = 0 ;
@@ -1008,32 +1010,34 @@ static int traverse_trees_wrapper(struct index_state *istate,
10081010 info -> traverse_path = renames -> callback_data_traverse_path ;
10091011 info -> fn = old_fn ;
10101012 for (i = old_offset ; i < renames -> callback_data_nr ; ++ i ) {
1011- info -> fn (n ,
1012- renames -> callback_data [i ].mask ,
1013- renames -> callback_data [i ].dirmask ,
1014- renames -> callback_data [i ].names ,
1015- info );
1013+ ret = info -> fn (n ,
1014+ renames -> callback_data [i ].mask ,
1015+ renames -> callback_data [i ].dirmask ,
1016+ renames -> callback_data [i ].names ,
1017+ info );
1018+ if (ret < 0 )
1019+ break ;
10161020 }
10171021
10181022 renames -> callback_data_nr = old_offset ;
10191023 free (renames -> callback_data_traverse_path );
10201024 renames -> callback_data_traverse_path = old_callback_data_traverse_path ;
10211025 info -> traverse_path = NULL ;
1022- return 0 ;
1026+ return ret < 0 ? ret : 0 ;
10231027}
10241028
1025- static void setup_path_info (struct merge_options * opt ,
1026- struct string_list_item * result ,
1027- const char * current_dir_name ,
1028- int current_dir_name_len ,
1029- char * fullpath , /* we'll take over ownership */
1030- struct name_entry * names ,
1031- struct name_entry * merged_version ,
1032- unsigned is_null , /* boolean */
1033- unsigned df_conflict , /* boolean */
1034- unsigned filemask ,
1035- unsigned dirmask ,
1036- int resolved /* boolean */ )
1029+ static int setup_path_info (struct merge_options * opt ,
1030+ struct string_list_item * result ,
1031+ const char * current_dir_name ,
1032+ int current_dir_name_len ,
1033+ char * fullpath , /* we'll take over ownership */
1034+ struct name_entry * names ,
1035+ struct name_entry * merged_version ,
1036+ unsigned is_null , /* boolean */
1037+ unsigned df_conflict , /* boolean */
1038+ unsigned filemask ,
1039+ unsigned dirmask ,
1040+ int resolved /* boolean */ )
10371041{
10381042 /* result->util is void*, so mi is a convenience typed variable */
10391043 struct merged_info * mi ;
@@ -1077,9 +1081,11 @@ static void setup_path_info(struct merge_options *opt,
10771081 */
10781082 mi -> is_null = 1 ;
10791083 }
1080- strmap_put (& opt -> priv -> paths , fullpath , mi );
1084+ if (strmap_put (& opt -> priv -> paths , fullpath , mi ))
1085+ return error (_ ("tree has duplicate entries for '%s'" ), fullpath );
10811086 result -> string = fullpath ;
10821087 result -> util = mi ;
1088+ return 0 ;
10831089}
10841090
10851091static void add_pair (struct merge_options * opt ,
@@ -1346,9 +1352,10 @@ static int collect_merge_info_callback(int n,
13461352 */
13471353 if (side1_matches_mbase && side2_matches_mbase ) {
13481354 /* mbase, side1, & side2 all match; use mbase as resolution */
1349- setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1350- names , names + 0 , mbase_null , 0 /* df_conflict */ ,
1351- filemask , dirmask , 1 /* resolved */ );
1355+ if (setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1356+ names , names + 0 , mbase_null , 0 /* df_conflict */ ,
1357+ filemask , dirmask , 1 /* resolved */ ))
1358+ return -1 ; /* Quit traversing */
13521359 return mask ;
13531360 }
13541361
@@ -1360,9 +1367,10 @@ static int collect_merge_info_callback(int n,
13601367 */
13611368 if (sides_match && filemask == 0x07 ) {
13621369 /* use side1 (== side2) version as resolution */
1363- setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1364- names , names + 1 , side1_null , 0 ,
1365- filemask , dirmask , 1 );
1370+ if (setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1371+ names , names + 1 , side1_null , 0 ,
1372+ filemask , dirmask , 1 ))
1373+ return -1 ; /* Quit traversing */
13661374 return mask ;
13671375 }
13681376
@@ -1374,18 +1382,20 @@ static int collect_merge_info_callback(int n,
13741382 */
13751383 if (side1_matches_mbase && filemask == 0x07 ) {
13761384 /* use side2 version as resolution */
1377- setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1378- names , names + 2 , side2_null , 0 ,
1379- filemask , dirmask , 1 );
1385+ if (setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1386+ names , names + 2 , side2_null , 0 ,
1387+ filemask , dirmask , 1 ))
1388+ return -1 ; /* Quit traversing */
13801389 return mask ;
13811390 }
13821391
13831392 /* Similar to above but swapping sides 1 and 2 */
13841393 if (side2_matches_mbase && filemask == 0x07 ) {
13851394 /* use side1 version as resolution */
1386- setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1387- names , names + 1 , side1_null , 0 ,
1388- filemask , dirmask , 1 );
1395+ if (setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1396+ names , names + 1 , side1_null , 0 ,
1397+ filemask , dirmask , 1 ))
1398+ return -1 ; /* Quit traversing */
13891399 return mask ;
13901400 }
13911401
@@ -1409,8 +1419,9 @@ static int collect_merge_info_callback(int n,
14091419 * unconflict some more cases, but that comes later so all we can
14101420 * do now is record the different non-null file hashes.)
14111421 */
1412- setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1413- names , NULL , 0 , df_conflict , filemask , dirmask , 0 );
1422+ if (setup_path_info (opt , & pi , dirname , info -> pathlen , fullpath ,
1423+ names , NULL , 0 , df_conflict , filemask , dirmask , 0 ))
1424+ return -1 ; /* Quit traversing */
14141425
14151426 ci = pi .util ;
14161427 VERIFY_CI (ci );
@@ -1738,7 +1749,6 @@ static int collect_merge_info(struct merge_options *opt,
17381749 setup_traverse_info (& info , opt -> priv -> toplevel_dir );
17391750 info .fn = collect_merge_info_callback ;
17401751 info .data = opt ;
1741- info .show_all_errors = 1 ;
17421752
17431753 if (repo_parse_tree (opt -> repo , merge_base ) < 0 ||
17441754 repo_parse_tree (opt -> repo , side1 ) < 0 ||
0 commit comments