@@ -245,53 +245,92 @@ static void wt_status_print_trailer(struct wt_status *s)
245
245
246
246
#define quote_path quote_path_relative
247
247
248
- static void wt_status_print_unmerged_data (struct wt_status * s ,
249
- struct string_list_item * it )
248
+ static const char * wt_status_unmerged_status_string (int stagemask )
250
249
{
251
- const char * c = color (WT_STATUS_UNMERGED , s );
252
- struct wt_status_change_data * d = it -> util ;
253
- struct strbuf onebuf = STRBUF_INIT ;
254
- const char * one , * how = _ ("bug" );
255
-
256
- one = quote_path (it -> string , s -> prefix , & onebuf );
257
- status_printf (s , color (WT_STATUS_HEADER , s ), "\t" );
258
- switch (d -> stagemask ) {
259
- case 1 : how = _ ("both deleted:" ); break ;
260
- case 2 : how = _ ("added by us:" ); break ;
261
- case 3 : how = _ ("deleted by them:" ); break ;
262
- case 4 : how = _ ("added by them:" ); break ;
263
- case 5 : how = _ ("deleted by us:" ); break ;
264
- case 6 : how = _ ("both added:" ); break ;
265
- case 7 : how = _ ("both modified:" ); break ;
250
+ switch (stagemask ) {
251
+ case 1 :
252
+ return _ ("both deleted:" );
253
+ case 2 :
254
+ return _ ("added by us:" );
255
+ case 3 :
256
+ return _ ("deleted by them:" );
257
+ case 4 :
258
+ return _ ("added by them:" );
259
+ case 5 :
260
+ return _ ("deleted by us:" );
261
+ case 6 :
262
+ return _ ("both added:" );
263
+ case 7 :
264
+ return _ ("both modified:" );
265
+ default :
266
+ die (_ ("bug: unhandled unmerged status %x" ), stagemask );
266
267
}
267
- status_printf_more (s , c , "%-20s%s\n" , how , one );
268
- strbuf_release (& onebuf );
269
268
}
270
269
271
270
static const char * wt_status_diff_status_string (int status )
272
271
{
273
272
switch (status ) {
274
273
case DIFF_STATUS_ADDED :
275
- return _ ("new file" );
274
+ return _ ("new file: " );
276
275
case DIFF_STATUS_COPIED :
277
- return _ ("copied" );
276
+ return _ ("copied: " );
278
277
case DIFF_STATUS_DELETED :
279
- return _ ("deleted" );
278
+ return _ ("deleted: " );
280
279
case DIFF_STATUS_MODIFIED :
281
- return _ ("modified" );
280
+ return _ ("modified: " );
282
281
case DIFF_STATUS_RENAMED :
283
- return _ ("renamed" );
282
+ return _ ("renamed: " );
284
283
case DIFF_STATUS_TYPE_CHANGED :
285
- return _ ("typechange" );
284
+ return _ ("typechange: " );
286
285
case DIFF_STATUS_UNKNOWN :
287
- return _ ("unknown" );
286
+ return _ ("unknown: " );
288
287
case DIFF_STATUS_UNMERGED :
289
- return _ ("unmerged" );
288
+ return _ ("unmerged: " );
290
289
default :
291
290
return NULL ;
292
291
}
293
292
}
294
293
294
+ static int maxwidth (const char * (* label )(int ), int minval , int maxval )
295
+ {
296
+ int result = 0 , i ;
297
+
298
+ for (i = minval ; i <= maxval ; i ++ ) {
299
+ const char * s = label (i );
300
+ int len = s ? utf8_strwidth (s ) : 0 ;
301
+ if (len > result )
302
+ result = len ;
303
+ }
304
+ return result ;
305
+ }
306
+
307
+ static void wt_status_print_unmerged_data (struct wt_status * s ,
308
+ struct string_list_item * it )
309
+ {
310
+ const char * c = color (WT_STATUS_UNMERGED , s );
311
+ struct wt_status_change_data * d = it -> util ;
312
+ struct strbuf onebuf = STRBUF_INIT ;
313
+ static char * padding ;
314
+ static int label_width ;
315
+ const char * one , * how ;
316
+ int len ;
317
+
318
+ if (!padding ) {
319
+ label_width = maxwidth (wt_status_unmerged_status_string , 1 , 7 );
320
+ label_width += strlen (" " );
321
+ padding = xmallocz (label_width );
322
+ memset (padding , ' ' , label_width );
323
+ }
324
+
325
+ one = quote_path (it -> string , s -> prefix , & onebuf );
326
+ status_printf (s , color (WT_STATUS_HEADER , s ), "\t" );
327
+
328
+ how = wt_status_unmerged_status_string (d -> stagemask );
329
+ len = label_width - utf8_strwidth (how );
330
+ status_printf_more (s , c , "%s%.*s%s\n" , how , len , padding , one );
331
+ strbuf_release (& onebuf );
332
+ }
333
+
295
334
static void wt_status_print_change_data (struct wt_status * s ,
296
335
int change_type ,
297
336
struct string_list_item * it )
@@ -305,21 +344,16 @@ static void wt_status_print_change_data(struct wt_status *s,
305
344
struct strbuf onebuf = STRBUF_INIT , twobuf = STRBUF_INIT ;
306
345
struct strbuf extra = STRBUF_INIT ;
307
346
static char * padding ;
347
+ static int label_width ;
308
348
const char * what ;
309
349
int len ;
310
350
311
351
if (!padding ) {
312
- int width = 0 ;
313
- /* If DIFF_STATUS_* uses outside this range, we're in trouble */
314
- for (status = 'A' ; status <= 'Z' ; status ++ ) {
315
- what = wt_status_diff_status_string (status );
316
- len = what ? strlen (what ) : 0 ;
317
- if (len > width )
318
- width = len ;
319
- }
320
- width += 2 ; /* colon and a space */
321
- padding = xmallocz (width );
322
- memset (padding , ' ' , width );
352
+ /* If DIFF_STATUS_* uses outside the range [A..Z], we're in trouble */
353
+ label_width = maxwidth (wt_status_diff_status_string , 'A' , 'Z' );
354
+ label_width += strlen (" " );
355
+ padding = xmallocz (label_width );
356
+ memset (padding , ' ' , label_width );
323
357
}
324
358
325
359
one_name = two_name = it -> string ;
@@ -355,14 +389,13 @@ static void wt_status_print_change_data(struct wt_status *s,
355
389
what = wt_status_diff_status_string (status );
356
390
if (!what )
357
391
die (_ ("bug: unhandled diff status %c" ), status );
358
- /* 1 for colon, which is not part of "what" */
359
- len = strlen (padding ) - (utf8_strwidth (what ) + 1 );
392
+ len = label_width - utf8_strwidth (what );
360
393
assert (len >= 0 );
361
394
if (status == DIFF_STATUS_COPIED || status == DIFF_STATUS_RENAMED )
362
- status_printf_more (s , c , "%s: %.*s%s -> %s" ,
395
+ status_printf_more (s , c , "%s%.*s%s -> %s" ,
363
396
what , len , padding , one , two );
364
397
else
365
- status_printf_more (s , c , "%s: %.*s%s" ,
398
+ status_printf_more (s , c , "%s%.*s%s" ,
366
399
what , len , padding , one );
367
400
if (extra .len ) {
368
401
status_printf_more (s , color (WT_STATUS_HEADER , s ), "%s" , extra .buf );
0 commit comments