@@ -2807,6 +2807,8 @@ static int process_renames(struct merge_options *opt,
2807
2807
pathnames ,
2808
2808
1 + 2 * opt -> priv -> call_depth ,
2809
2809
& merged );
2810
+ if (clean_merge < 0 )
2811
+ return -1 ;
2810
2812
if (!clean_merge &&
2811
2813
merged .mode == side1 -> stages [1 ].mode &&
2812
2814
oideq (& merged .oid , & side1 -> stages [1 ].oid ))
@@ -2916,7 +2918,7 @@ static int process_renames(struct merge_options *opt,
2916
2918
struct version_info merged ;
2917
2919
2918
2920
struct conflict_info * base , * side1 , * side2 ;
2919
- unsigned clean ;
2921
+ int clean ;
2920
2922
2921
2923
pathnames [0 ] = oldpath ;
2922
2924
pathnames [other_source_index ] = oldpath ;
@@ -2937,6 +2939,8 @@ static int process_renames(struct merge_options *opt,
2937
2939
pathnames ,
2938
2940
1 + 2 * opt -> priv -> call_depth ,
2939
2941
& merged );
2942
+ if (clean < 0 )
2943
+ return -1 ;
2940
2944
2941
2945
memcpy (& newinfo -> stages [target_index ], & merged ,
2942
2946
sizeof (merged ));
@@ -3571,15 +3575,15 @@ static int tree_entry_order(const void *a_, const void *b_)
3571
3575
b -> string , strlen (b -> string ), bmi -> result .mode );
3572
3576
}
3573
3577
3574
- static void write_tree (struct object_id * result_oid ,
3575
- struct string_list * versions ,
3576
- unsigned int offset ,
3577
- size_t hash_size )
3578
+ static int write_tree (struct object_id * result_oid ,
3579
+ struct string_list * versions ,
3580
+ unsigned int offset ,
3581
+ size_t hash_size )
3578
3582
{
3579
3583
size_t maxlen = 0 , extra ;
3580
3584
unsigned int nr ;
3581
3585
struct strbuf buf = STRBUF_INIT ;
3582
- int i ;
3586
+ int i , ret = 0 ;
3583
3587
3584
3588
assert (offset <= versions -> nr );
3585
3589
nr = versions -> nr - offset ;
@@ -3605,8 +3609,10 @@ static void write_tree(struct object_id *result_oid,
3605
3609
}
3606
3610
3607
3611
/* Write this object file out, and record in result_oid */
3608
- write_object_file (buf .buf , buf .len , OBJ_TREE , result_oid );
3612
+ if (write_object_file (buf .buf , buf .len , OBJ_TREE , result_oid ))
3613
+ ret = -1 ;
3609
3614
strbuf_release (& buf );
3615
+ return ret ;
3610
3616
}
3611
3617
3612
3618
static void record_entry_for_tree (struct directory_versions * dir_metadata ,
@@ -3625,13 +3631,13 @@ static void record_entry_for_tree(struct directory_versions *dir_metadata,
3625
3631
basename )-> util = & mi -> result ;
3626
3632
}
3627
3633
3628
- static void write_completed_directory (struct merge_options * opt ,
3629
- const char * new_directory_name ,
3630
- struct directory_versions * info )
3634
+ static int write_completed_directory (struct merge_options * opt ,
3635
+ const char * new_directory_name ,
3636
+ struct directory_versions * info )
3631
3637
{
3632
3638
const char * prev_dir ;
3633
3639
struct merged_info * dir_info = NULL ;
3634
- unsigned int offset ;
3640
+ unsigned int offset , ret = 0 ;
3635
3641
3636
3642
/*
3637
3643
* Some explanation of info->versions and info->offsets...
@@ -3717,7 +3723,7 @@ static void write_completed_directory(struct merge_options *opt,
3717
3723
* strcmp here.)
3718
3724
*/
3719
3725
if (new_directory_name == info -> last_directory )
3720
- return ;
3726
+ return 0 ;
3721
3727
3722
3728
/*
3723
3729
* If we are just starting (last_directory is NULL), or last_directory
@@ -3739,7 +3745,7 @@ static void write_completed_directory(struct merge_options *opt,
3739
3745
*/
3740
3746
string_list_append (& info -> offsets ,
3741
3747
info -> last_directory )-> util = (void * )offset ;
3742
- return ;
3748
+ return 0 ;
3743
3749
}
3744
3750
3745
3751
/*
@@ -3769,8 +3775,9 @@ static void write_completed_directory(struct merge_options *opt,
3769
3775
*/
3770
3776
dir_info -> is_null = 0 ;
3771
3777
dir_info -> result .mode = S_IFDIR ;
3772
- write_tree (& dir_info -> result .oid , & info -> versions , offset ,
3773
- opt -> repo -> hash_algo -> rawsz );
3778
+ if (write_tree (& dir_info -> result .oid , & info -> versions , offset ,
3779
+ opt -> repo -> hash_algo -> rawsz ) < 0 )
3780
+ ret = -1 ;
3774
3781
}
3775
3782
3776
3783
/*
@@ -3798,13 +3805,15 @@ static void write_completed_directory(struct merge_options *opt,
3798
3805
/* And, of course, we need to update last_directory to match. */
3799
3806
info -> last_directory = new_directory_name ;
3800
3807
info -> last_directory_len = strlen (info -> last_directory );
3808
+
3809
+ return ret ;
3801
3810
}
3802
3811
3803
3812
/* Per entry merge function */
3804
- static void process_entry (struct merge_options * opt ,
3805
- const char * path ,
3806
- struct conflict_info * ci ,
3807
- struct directory_versions * dir_metadata )
3813
+ static int process_entry (struct merge_options * opt ,
3814
+ const char * path ,
3815
+ struct conflict_info * ci ,
3816
+ struct directory_versions * dir_metadata )
3808
3817
{
3809
3818
int df_file_index = 0 ;
3810
3819
@@ -3818,7 +3827,7 @@ static void process_entry(struct merge_options *opt,
3818
3827
record_entry_for_tree (dir_metadata , path , & ci -> merged );
3819
3828
if (ci -> filemask == 0 )
3820
3829
/* nothing else to handle */
3821
- return ;
3830
+ return 0 ;
3822
3831
assert (ci -> df_conflict );
3823
3832
}
3824
3833
@@ -3865,7 +3874,7 @@ static void process_entry(struct merge_options *opt,
3865
3874
*/
3866
3875
if (ci -> filemask == 1 ) {
3867
3876
ci -> filemask = 0 ;
3868
- return ;
3877
+ return 0 ;
3869
3878
}
3870
3879
3871
3880
/*
@@ -4060,7 +4069,7 @@ static void process_entry(struct merge_options *opt,
4060
4069
} else if (ci -> filemask >= 6 ) {
4061
4070
/* Need a two-way or three-way content merge */
4062
4071
struct version_info merged_file ;
4063
- unsigned clean_merge ;
4072
+ int clean_merge ;
4064
4073
struct version_info * o = & ci -> stages [0 ];
4065
4074
struct version_info * a = & ci -> stages [1 ];
4066
4075
struct version_info * b = & ci -> stages [2 ];
@@ -4069,6 +4078,8 @@ static void process_entry(struct merge_options *opt,
4069
4078
ci -> pathnames ,
4070
4079
opt -> priv -> call_depth * 2 ,
4071
4080
& merged_file );
4081
+ if (clean_merge < 0 )
4082
+ return -1 ;
4072
4083
ci -> merged .clean = clean_merge &&
4073
4084
!ci -> df_conflict && !ci -> path_conflict ;
4074
4085
ci -> merged .result .mode = merged_file .mode ;
@@ -4164,6 +4175,7 @@ static void process_entry(struct merge_options *opt,
4164
4175
4165
4176
/* Record metadata for ci->merged in dir_metadata */
4166
4177
record_entry_for_tree (dir_metadata , path , & ci -> merged );
4178
+ return 0 ;
4167
4179
}
4168
4180
4169
4181
static void prefetch_for_content_merges (struct merge_options * opt ,
@@ -4214,8 +4226,8 @@ static void prefetch_for_content_merges(struct merge_options *opt,
4214
4226
oid_array_clear (& to_fetch );
4215
4227
}
4216
4228
4217
- static void process_entries (struct merge_options * opt ,
4218
- struct object_id * result_oid )
4229
+ static int process_entries (struct merge_options * opt ,
4230
+ struct object_id * result_oid )
4219
4231
{
4220
4232
struct hashmap_iter iter ;
4221
4233
struct strmap_entry * e ;
@@ -4224,11 +4236,12 @@ static void process_entries(struct merge_options *opt,
4224
4236
struct directory_versions dir_metadata = { STRING_LIST_INIT_NODUP ,
4225
4237
STRING_LIST_INIT_NODUP ,
4226
4238
NULL , 0 };
4239
+ int ret = 0 ;
4227
4240
4228
4241
trace2_region_enter ("merge" , "process_entries setup" , opt -> repo );
4229
4242
if (strmap_empty (& opt -> priv -> paths )) {
4230
4243
oidcpy (result_oid , opt -> repo -> hash_algo -> empty_tree );
4231
- return ;
4244
+ return 0 ;
4232
4245
}
4233
4246
4234
4247
/* Hack to pre-allocate plist to the desired size */
@@ -4270,13 +4283,19 @@ static void process_entries(struct merge_options *opt,
4270
4283
*/
4271
4284
struct merged_info * mi = entry -> util ;
4272
4285
4273
- write_completed_directory (opt , mi -> directory_name ,
4274
- & dir_metadata );
4286
+ if (write_completed_directory (opt , mi -> directory_name ,
4287
+ & dir_metadata ) < 0 ) {
4288
+ ret = -1 ;
4289
+ goto cleanup ;
4290
+ }
4275
4291
if (mi -> clean )
4276
4292
record_entry_for_tree (& dir_metadata , path , mi );
4277
4293
else {
4278
4294
struct conflict_info * ci = (struct conflict_info * )mi ;
4279
- process_entry (opt , path , ci , & dir_metadata );
4295
+ if (process_entry (opt , path , ci , & dir_metadata ) < 0 ) {
4296
+ ret = -1 ;
4297
+ goto cleanup ;
4298
+ };
4280
4299
}
4281
4300
}
4282
4301
trace2_region_leave ("merge" , "processing" , opt -> repo );
@@ -4291,12 +4310,16 @@ static void process_entries(struct merge_options *opt,
4291
4310
fflush (stdout );
4292
4311
BUG ("dir_metadata accounting completely off; shouldn't happen" );
4293
4312
}
4294
- write_tree (result_oid , & dir_metadata .versions , 0 ,
4295
- opt -> repo -> hash_algo -> rawsz );
4313
+ if (write_tree (result_oid , & dir_metadata .versions , 0 ,
4314
+ opt -> repo -> hash_algo -> rawsz ) < 0 )
4315
+ ret = -1 ;
4316
+ cleanup :
4296
4317
string_list_clear (& plist , 0 );
4297
4318
string_list_clear (& dir_metadata .versions , 0 );
4298
4319
string_list_clear (& dir_metadata .offsets , 0 );
4299
4320
trace2_region_leave ("merge" , "process_entries cleanup" , opt -> repo );
4321
+
4322
+ return ret ;
4300
4323
}
4301
4324
4302
4325
/*** Function Grouping: functions related to merge_switch_to_result() ***/
@@ -4928,15 +4951,18 @@ static void merge_ort_nonrecursive_internal(struct merge_options *opt,
4928
4951
}
4929
4952
4930
4953
trace2_region_enter ("merge" , "process_entries" , opt -> repo );
4931
- process_entries (opt , & working_tree_oid );
4954
+ if (process_entries (opt , & working_tree_oid ) < 0 )
4955
+ result -> clean = -1 ;
4932
4956
trace2_region_leave ("merge" , "process_entries" , opt -> repo );
4933
4957
4934
4958
/* Set return values */
4935
4959
result -> path_messages = & opt -> priv -> conflicts ;
4936
4960
4937
- result -> tree = parse_tree_indirect (& working_tree_oid );
4938
- /* existence of conflicted entries implies unclean */
4939
- result -> clean &= strmap_empty (& opt -> priv -> conflicted );
4961
+ if (result -> clean >= 0 ) {
4962
+ result -> tree = parse_tree_indirect (& working_tree_oid );
4963
+ /* existence of conflicted entries implies unclean */
4964
+ result -> clean &= strmap_empty (& opt -> priv -> conflicted );
4965
+ }
4940
4966
if (!opt -> priv -> call_depth ) {
4941
4967
result -> priv = opt -> priv ;
4942
4968
result -> _properly_initialized = RESULT_INITIALIZED ;
0 commit comments