@@ -752,7 +752,9 @@ static int collect_merge_info(struct merge_options *opt,
752
752
init_tree_desc (t + 1 , side1 -> buffer , side1 -> size );
753
753
init_tree_desc (t + 2 , side2 -> buffer , side2 -> size );
754
754
755
+ trace2_region_enter ("merge" , "traverse_trees" , opt -> repo );
755
756
ret = traverse_trees (NULL , 3 , t , & info );
757
+ trace2_region_leave ("merge" , "traverse_trees" , opt -> repo );
756
758
757
759
return ret ;
758
760
}
@@ -1439,7 +1441,18 @@ static void get_provisional_directory_renames(struct merge_options *opt,
1439
1441
"no destination getting a majority of the "
1440
1442
"files." ),
1441
1443
source_dir );
1442
- * clean = 0 ;
1444
+ /*
1445
+ * We should mark this as unclean IF something attempts
1446
+ * to use this rename. We do not yet have the logic
1447
+ * in place to detect if this directory rename is being
1448
+ * used, and optimizations that reduce the number of
1449
+ * renames cause this to falsely trigger. For now,
1450
+ * just disable it, causing t6423 testcase 2a to break.
1451
+ * We'll later fix the detection, and when we do we
1452
+ * will re-enable setting *clean to 0 (and thereby fix
1453
+ * t6423 testcase 2a).
1454
+ */
1455
+ /* *clean = 0; */
1443
1456
} else {
1444
1457
strmap_put (& renames -> dir_renames [side ],
1445
1458
source_dir , (void * )best );
@@ -2094,9 +2107,12 @@ static void detect_regular_renames(struct merge_options *opt,
2094
2107
diff_opts .show_rename_progress = opt -> show_rename_progress ;
2095
2108
diff_opts .output_format = DIFF_FORMAT_NO_OUTPUT ;
2096
2109
diff_setup_done (& diff_opts );
2110
+
2111
+ trace2_region_enter ("diff" , "diffcore_rename" , opt -> repo );
2097
2112
diff_tree_oid (& merge_base -> object .oid , & side -> object .oid , "" ,
2098
2113
& diff_opts );
2099
2114
diffcore_std (& diff_opts );
2115
+ trace2_region_leave ("diff" , "diffcore_rename" , opt -> repo );
2100
2116
2101
2117
if (diff_opts .needed_rename_limit > renames -> needed_limit )
2102
2118
renames -> needed_limit = diff_opts .needed_rename_limit ;
@@ -2195,9 +2211,12 @@ static int detect_and_process_renames(struct merge_options *opt,
2195
2211
2196
2212
memset (& combined , 0 , sizeof (combined ));
2197
2213
2214
+ trace2_region_enter ("merge" , "regular renames" , opt -> repo );
2198
2215
detect_regular_renames (opt , merge_base , side1 , MERGE_SIDE1 );
2199
2216
detect_regular_renames (opt , merge_base , side2 , MERGE_SIDE2 );
2217
+ trace2_region_leave ("merge" , "regular renames" , opt -> repo );
2200
2218
2219
+ trace2_region_enter ("merge" , "directory renames" , opt -> repo );
2201
2220
need_dir_renames =
2202
2221
!opt -> priv -> call_depth &&
2203
2222
(opt -> detect_directory_renames == MERGE_DIRECTORY_RENAMES_TRUE ||
@@ -2219,8 +2238,11 @@ static int detect_and_process_renames(struct merge_options *opt,
2219
2238
& renames -> dir_renames [1 ],
2220
2239
& renames -> dir_renames [2 ]);
2221
2240
QSORT (combined .queue , combined .nr , compare_pairs );
2241
+ trace2_region_leave ("merge" , "directory renames" , opt -> repo );
2222
2242
2243
+ trace2_region_enter ("merge" , "process renames" , opt -> repo );
2223
2244
clean &= process_renames (opt , & combined );
2245
+ trace2_region_leave ("merge" , "process renames" , opt -> repo );
2224
2246
2225
2247
/* Free memory for renames->pairs[] and combined */
2226
2248
for (s = MERGE_SIDE1 ; s <= MERGE_SIDE2 ; s ++ ) {
@@ -2902,20 +2924,30 @@ static void process_entries(struct merge_options *opt,
2902
2924
STRING_LIST_INIT_NODUP ,
2903
2925
NULL , 0 };
2904
2926
2927
+ trace2_region_enter ("merge" , "process_entries setup" , opt -> repo );
2905
2928
if (strmap_empty (& opt -> priv -> paths )) {
2906
2929
oidcpy (result_oid , opt -> repo -> hash_algo -> empty_tree );
2907
2930
return ;
2908
2931
}
2909
2932
2910
2933
/* Hack to pre-allocate plist to the desired size */
2934
+ trace2_region_enter ("merge" , "plist grow" , opt -> repo );
2911
2935
ALLOC_GROW (plist .items , strmap_get_size (& opt -> priv -> paths ), plist .alloc );
2936
+ trace2_region_leave ("merge" , "plist grow" , opt -> repo );
2912
2937
2913
2938
/* Put every entry from paths into plist, then sort */
2939
+ trace2_region_enter ("merge" , "plist copy" , opt -> repo );
2914
2940
strmap_for_each_entry (& opt -> priv -> paths , & iter , e ) {
2915
2941
string_list_append (& plist , e -> key )-> util = e -> value ;
2916
2942
}
2943
+ trace2_region_leave ("merge" , "plist copy" , opt -> repo );
2944
+
2945
+ trace2_region_enter ("merge" , "plist special sort" , opt -> repo );
2917
2946
plist .cmp = string_list_df_name_compare ;
2918
2947
string_list_sort (& plist );
2948
+ trace2_region_leave ("merge" , "plist special sort" , opt -> repo );
2949
+
2950
+ trace2_region_leave ("merge" , "process_entries setup" , opt -> repo );
2919
2951
2920
2952
/*
2921
2953
* Iterate over the items in reverse order, so we can handle paths
@@ -2926,6 +2958,7 @@ static void process_entries(struct merge_options *opt,
2926
2958
* (because it allows us to know whether the directory is still in
2927
2959
* the way when it is time to process the file at the same path).
2928
2960
*/
2961
+ trace2_region_enter ("merge" , "processing" , opt -> repo );
2929
2962
for (entry = & plist .items [plist .nr - 1 ]; entry >= plist .items ; -- entry ) {
2930
2963
char * path = entry -> string ;
2931
2964
/*
@@ -2944,7 +2977,9 @@ static void process_entries(struct merge_options *opt,
2944
2977
process_entry (opt , path , ci , & dir_metadata );
2945
2978
}
2946
2979
}
2980
+ trace2_region_leave ("merge" , "processing" , opt -> repo );
2947
2981
2982
+ trace2_region_enter ("merge" , "process_entries cleanup" , opt -> repo );
2948
2983
if (dir_metadata .offsets .nr != 1 ||
2949
2984
(uintptr_t )dir_metadata .offsets .items [0 ].util != 0 ) {
2950
2985
printf ("dir_metadata.offsets.nr = %d (should be 1)\n" ,
@@ -2959,6 +2994,7 @@ static void process_entries(struct merge_options *opt,
2959
2994
string_list_clear (& plist , 0 );
2960
2995
string_list_clear (& dir_metadata .versions , 0 );
2961
2996
string_list_clear (& dir_metadata .offsets , 0 );
2997
+ trace2_region_leave ("merge" , "process_entries cleanup" , opt -> repo );
2962
2998
}
2963
2999
2964
3000
/*** Function Grouping: functions related to merge_switch_to_result() ***/
@@ -3117,19 +3153,23 @@ void merge_switch_to_result(struct merge_options *opt,
3117
3153
if (result -> clean >= 0 && update_worktree_and_index ) {
3118
3154
struct merge_options_internal * opti = result -> priv ;
3119
3155
3156
+ trace2_region_enter ("merge" , "checkout" , opt -> repo );
3120
3157
if (checkout (opt , head , result -> tree )) {
3121
3158
/* failure to function */
3122
3159
result -> clean = -1 ;
3123
3160
return ;
3124
3161
}
3162
+ trace2_region_leave ("merge" , "checkout" , opt -> repo );
3125
3163
3164
+ trace2_region_enter ("merge" , "record_conflicted" , opt -> repo );
3126
3165
if (record_conflicted_index_entries (opt , opt -> repo -> index ,
3127
3166
& opti -> paths ,
3128
3167
& opti -> conflicted )) {
3129
3168
/* failure to function */
3130
3169
result -> clean = -1 ;
3131
3170
return ;
3132
3171
}
3172
+ trace2_region_leave ("merge" , "record_conflicted" , opt -> repo );
3133
3173
}
3134
3174
3135
3175
if (display_update_msgs ) {
@@ -3139,6 +3179,8 @@ void merge_switch_to_result(struct merge_options *opt,
3139
3179
struct string_list olist = STRING_LIST_INIT_NODUP ;
3140
3180
int i ;
3141
3181
3182
+ trace2_region_enter ("merge" , "display messages" , opt -> repo );
3183
+
3142
3184
/* Hack to pre-allocate olist to the desired size */
3143
3185
ALLOC_GROW (olist .items , strmap_get_size (& opti -> output ),
3144
3186
olist .alloc );
@@ -3160,6 +3202,8 @@ void merge_switch_to_result(struct merge_options *opt,
3160
3202
/* Also include needed rename limit adjustment now */
3161
3203
diff_warn_rename_limit ("merge.renamelimit" ,
3162
3204
opti -> renames .needed_limit , 0 );
3205
+
3206
+ trace2_region_leave ("merge" , "display messages" , opt -> repo );
3163
3207
}
3164
3208
3165
3209
merge_finalize (opt , result );
@@ -3201,6 +3245,7 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
3201
3245
int i ;
3202
3246
3203
3247
/* Sanity checks on opt */
3248
+ trace2_region_enter ("merge" , "sanity checks" , opt -> repo );
3204
3249
assert (opt -> repo );
3205
3250
3206
3251
assert (opt -> branch1 && opt -> branch2 );
@@ -3227,11 +3272,30 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
3227
3272
assert (opt -> obuf .len == 0 );
3228
3273
3229
3274
assert (opt -> priv == NULL );
3275
+ if (result -> priv ) {
3276
+ opt -> priv = result -> priv ;
3277
+ result -> priv = NULL ;
3278
+ /*
3279
+ * opt->priv non-NULL means we had results from a previous
3280
+ * run; do a few sanity checks that user didn't mess with
3281
+ * it in an obvious fashion.
3282
+ */
3283
+ assert (opt -> priv -> call_depth == 0 );
3284
+ assert (!opt -> priv -> toplevel_dir ||
3285
+ 0 == strlen (opt -> priv -> toplevel_dir ));
3286
+ }
3287
+ trace2_region_leave ("merge" , "sanity checks" , opt -> repo );
3230
3288
3231
3289
/* Default to histogram diff. Actually, just hardcode it...for now. */
3232
3290
opt -> xdl_opts = DIFF_WITH_ALG (opt , HISTOGRAM_DIFF );
3233
3291
3234
3292
/* Initialization of opt->priv, our internal merge data */
3293
+ trace2_region_enter ("merge" , "allocate/init" , opt -> repo );
3294
+ if (opt -> priv ) {
3295
+ clear_or_reinit_internal_opts (opt -> priv , 1 );
3296
+ trace2_region_leave ("merge" , "allocate/init" , opt -> repo );
3297
+ return ;
3298
+ }
3235
3299
opt -> priv = xcalloc (1 , sizeof (* opt -> priv ));
3236
3300
3237
3301
/* Initialization of various renames fields */
@@ -3264,6 +3328,8 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
3264
3328
* subset of the overall paths that have special output.
3265
3329
*/
3266
3330
strmap_init (& opt -> priv -> output );
3331
+
3332
+ trace2_region_leave ("merge" , "allocate/init" , opt -> repo );
3267
3333
}
3268
3334
3269
3335
/*** Function Grouping: merge_incore_*() and their internal variants ***/
@@ -3279,6 +3345,7 @@ static void merge_ort_nonrecursive_internal(struct merge_options *opt,
3279
3345
{
3280
3346
struct object_id working_tree_oid ;
3281
3347
3348
+ trace2_region_enter ("merge" , "collect_merge_info" , opt -> repo );
3282
3349
if (collect_merge_info (opt , merge_base , side1 , side2 ) != 0 ) {
3283
3350
/*
3284
3351
* TRANSLATORS: The %s arguments are: 1) tree hash of a merge
@@ -3291,10 +3358,16 @@ static void merge_ort_nonrecursive_internal(struct merge_options *opt,
3291
3358
result -> clean = -1 ;
3292
3359
return ;
3293
3360
}
3361
+ trace2_region_leave ("merge" , "collect_merge_info" , opt -> repo );
3294
3362
3363
+ trace2_region_enter ("merge" , "renames" , opt -> repo );
3295
3364
result -> clean = detect_and_process_renames (opt , merge_base ,
3296
3365
side1 , side2 );
3366
+ trace2_region_leave ("merge" , "renames" , opt -> repo );
3367
+
3368
+ trace2_region_enter ("merge" , "process_entries" , opt -> repo );
3297
3369
process_entries (opt , & working_tree_oid );
3370
+ trace2_region_leave ("merge" , "process_entries" , opt -> repo );
3298
3371
3299
3372
/* Set return values */
3300
3373
result -> tree = parse_tree_indirect (& working_tree_oid );
@@ -3395,9 +3468,15 @@ void merge_incore_nonrecursive(struct merge_options *opt,
3395
3468
struct tree * side2 ,
3396
3469
struct merge_result * result )
3397
3470
{
3471
+ trace2_region_enter ("merge" , "incore_nonrecursive" , opt -> repo );
3472
+
3473
+ trace2_region_enter ("merge" , "merge_start" , opt -> repo );
3398
3474
assert (opt -> ancestor != NULL );
3399
3475
merge_start (opt , result );
3476
+ trace2_region_leave ("merge" , "merge_start" , opt -> repo );
3477
+
3400
3478
merge_ort_nonrecursive_internal (opt , merge_base , side1 , side2 , result );
3479
+ trace2_region_leave ("merge" , "incore_nonrecursive" , opt -> repo );
3401
3480
}
3402
3481
3403
3482
void merge_incore_recursive (struct merge_options * opt ,
@@ -3406,9 +3485,15 @@ void merge_incore_recursive(struct merge_options *opt,
3406
3485
struct commit * side2 ,
3407
3486
struct merge_result * result )
3408
3487
{
3488
+ trace2_region_enter ("merge" , "incore_recursive" , opt -> repo );
3489
+
3409
3490
/* We set the ancestor label based on the merge_bases */
3410
3491
assert (opt -> ancestor == NULL );
3411
3492
3493
+ trace2_region_enter ("merge" , "merge_start" , opt -> repo );
3412
3494
merge_start (opt , result );
3495
+ trace2_region_leave ("merge" , "merge_start" , opt -> repo );
3496
+
3413
3497
merge_ort_internal (opt , merge_bases , side1 , side2 , result );
3498
+ trace2_region_leave ("merge" , "incore_recursive" , opt -> repo );
3414
3499
}
0 commit comments