24
24
* situation better. See how "git checkout" and "git merge" replaces
25
25
* them using setup_unpack_trees_porcelain(), for example.
26
26
*/
27
- static const char * unpack_plumbing_errors [NB_UNPACK_TREES_ERROR_TYPES ] = {
27
+ static const char * unpack_plumbing_errors [NB_UNPACK_TREES_WARNING_TYPES ] = {
28
28
/* ERROR_WOULD_OVERWRITE */
29
29
"Entry '%s' would be overwritten by merge. Cannot merge." ,
30
30
@@ -46,6 +46,9 @@ static const char *unpack_plumbing_errors[NB_UNPACK_TREES_ERROR_TYPES] = {
46
46
/* ERROR_WOULD_LOSE_SUBMODULE */
47
47
"Submodule '%s' cannot checkout new HEAD." ,
48
48
49
+ /* NB_UNPACK_TREES_ERROR_TYPES; just a meta value */
50
+ "" ,
51
+
49
52
/* WARNING_SPARSE_NOT_UPTODATE_FILE */
50
53
"Entry '%s' not uptodate. Cannot update sparse checkout." ,
51
54
@@ -222,7 +225,7 @@ static int add_rejected_path(struct unpack_trees_options *o,
222
225
223
226
/*
224
227
* Otherwise, insert in a list for future display by
225
- * display_error_msgs ()
228
+ * display_(error|warning)_msgs ()
226
229
*/
227
230
string_list_append (& o -> unpack_rejects [e ], path );
228
231
return -1 ;
@@ -233,24 +236,53 @@ static int add_rejected_path(struct unpack_trees_options *o,
233
236
*/
234
237
static void display_error_msgs (struct unpack_trees_options * o )
235
238
{
236
- int e , i ;
237
- int something_displayed = 0 ;
239
+ int e ;
240
+ unsigned error_displayed = 0 ;
238
241
for (e = 0 ; e < NB_UNPACK_TREES_ERROR_TYPES ; e ++ ) {
239
242
struct string_list * rejects = & o -> unpack_rejects [e ];
243
+
240
244
if (rejects -> nr > 0 ) {
245
+ int i ;
241
246
struct strbuf path = STRBUF_INIT ;
242
- something_displayed = 1 ;
247
+
248
+ error_displayed = 1 ;
243
249
for (i = 0 ; i < rejects -> nr ; i ++ )
244
250
strbuf_addf (& path , "\t%s\n" , rejects -> items [i ].string );
245
251
error (ERRORMSG (o , e ), super_prefixed (path .buf ));
246
252
strbuf_release (& path );
247
253
}
248
254
string_list_clear (rejects , 0 );
249
255
}
250
- if (something_displayed )
256
+ if (error_displayed )
251
257
fprintf (stderr , _ ("Aborting\n" ));
252
258
}
253
259
260
+ /*
261
+ * display all the warning messages stored in a nice way
262
+ */
263
+ static void display_warning_msgs (struct unpack_trees_options * o )
264
+ {
265
+ int e ;
266
+ unsigned warning_displayed = 0 ;
267
+ for (e = NB_UNPACK_TREES_ERROR_TYPES + 1 ;
268
+ e < NB_UNPACK_TREES_WARNING_TYPES ; e ++ ) {
269
+ struct string_list * rejects = & o -> unpack_rejects [e ];
270
+
271
+ if (rejects -> nr > 0 ) {
272
+ int i ;
273
+ struct strbuf path = STRBUF_INIT ;
274
+
275
+ warning_displayed = 1 ;
276
+ for (i = 0 ; i < rejects -> nr ; i ++ )
277
+ strbuf_addf (& path , "\t%s\n" , rejects -> items [i ].string );
278
+ warning (ERRORMSG (o , e ), super_prefixed (path .buf ));
279
+ strbuf_release (& path );
280
+ }
281
+ string_list_clear (rejects , 0 );
282
+ }
283
+ if (warning_displayed )
284
+ fprintf (stderr , _ ("After fixing the above paths, you may want to run `git sparse-checkout reapply`.\n" ));
285
+ }
254
286
static int check_submodule_move_head (const struct cache_entry * ce ,
255
287
const char * old_id ,
256
288
const char * new_id ,
@@ -1705,8 +1737,10 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
1705
1737
return ret ;
1706
1738
1707
1739
return_failed :
1708
- if (o -> show_all_errors )
1740
+ if (o -> show_all_errors ) {
1709
1741
display_error_msgs (o );
1742
+ display_warning_msgs (o );
1743
+ }
1710
1744
mark_all_ce_unused (o -> src_index );
1711
1745
ret = unpack_failed (o , NULL );
1712
1746
if (o -> exiting_early )
@@ -1783,7 +1817,7 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o)
1783
1817
ret = UPDATE_SPARSITY_WORKTREE_UPDATE_FAILURES ;
1784
1818
1785
1819
done :
1786
- display_error_msgs (o );
1820
+ display_warning_msgs (o );
1787
1821
o -> show_all_errors = old_show_all_errors ;
1788
1822
if (free_pattern_list )
1789
1823
clear_pattern_list (& pl );
0 commit comments