@@ -307,7 +307,9 @@ void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int v
307
307
}
308
308
}
309
309
310
- static void print_ref_status (char flag , const char * summary , struct ref * to , struct ref * from , const char * msg , int porcelain )
310
+ static void print_ref_status (char flag , const char * summary ,
311
+ struct ref * to , struct ref * from , const char * msg ,
312
+ int porcelain , int summary_width )
311
313
{
312
314
if (porcelain ) {
313
315
if (from )
@@ -319,7 +321,7 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
319
321
else
320
322
fprintf (stdout , "%s\n" , summary );
321
323
} else {
322
- fprintf (stderr , " %c %-*s " , flag , TRANSPORT_SUMMARY_WIDTH , summary );
324
+ fprintf (stderr , " %c %-*s " , flag , summary_width , summary );
323
325
if (from )
324
326
fprintf (stderr , "%s -> %s" , prettify_refname (from -> name ), prettify_refname (to -> name ));
325
327
else
@@ -333,15 +335,16 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
333
335
}
334
336
}
335
337
336
- static void print_ok_ref_status (struct ref * ref , int porcelain )
338
+ static void print_ok_ref_status (struct ref * ref , int porcelain , int summary_width )
337
339
{
338
340
if (ref -> deletion )
339
- print_ref_status ('-' , "[deleted]" , ref , NULL , NULL , porcelain );
341
+ print_ref_status ('-' , "[deleted]" , ref , NULL , NULL ,
342
+ porcelain , summary_width );
340
343
else if (is_null_oid (& ref -> old_oid ))
341
344
print_ref_status ('*' ,
342
345
(starts_with (ref -> name , "refs/tags/" ) ? "[new tag]" :
343
346
"[new branch]" ),
344
- ref , ref -> peer_ref , NULL , porcelain );
347
+ ref , ref -> peer_ref , NULL , porcelain , summary_width );
345
348
else {
346
349
struct strbuf quickref = STRBUF_INIT ;
347
350
char type ;
@@ -361,12 +364,14 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
361
364
strbuf_add_unique_abbrev (& quickref , ref -> new_oid .hash ,
362
365
DEFAULT_ABBREV );
363
366
364
- print_ref_status (type , quickref .buf , ref , ref -> peer_ref , msg , porcelain );
367
+ print_ref_status (type , quickref .buf , ref , ref -> peer_ref , msg ,
368
+ porcelain , summary_width );
365
369
strbuf_release (& quickref );
366
370
}
367
371
}
368
372
369
- static int print_one_push_status (struct ref * ref , const char * dest , int count , int porcelain )
373
+ static int print_one_push_status (struct ref * ref , const char * dest , int count ,
374
+ int porcelain , int summary_width )
370
375
{
371
376
if (!count ) {
372
377
char * url = transport_anonymize_url (dest );
@@ -376,88 +381,117 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, i
376
381
377
382
switch (ref -> status ) {
378
383
case REF_STATUS_NONE :
379
- print_ref_status ('X' , "[no match]" , ref , NULL , NULL , porcelain );
384
+ print_ref_status ('X' , "[no match]" , ref , NULL , NULL ,
385
+ porcelain , summary_width );
380
386
break ;
381
387
case REF_STATUS_REJECT_NODELETE :
382
388
print_ref_status ('!' , "[rejected]" , ref , NULL ,
383
- "remote does not support deleting refs" , porcelain );
389
+ "remote does not support deleting refs" ,
390
+ porcelain , summary_width );
384
391
break ;
385
392
case REF_STATUS_UPTODATE :
386
393
print_ref_status ('=' , "[up to date]" , ref ,
387
- ref -> peer_ref , NULL , porcelain );
394
+ ref -> peer_ref , NULL , porcelain , summary_width );
388
395
break ;
389
396
case REF_STATUS_REJECT_NONFASTFORWARD :
390
397
print_ref_status ('!' , "[rejected]" , ref , ref -> peer_ref ,
391
- "non-fast-forward" , porcelain );
398
+ "non-fast-forward" , porcelain , summary_width );
392
399
break ;
393
400
case REF_STATUS_REJECT_ALREADY_EXISTS :
394
401
print_ref_status ('!' , "[rejected]" , ref , ref -> peer_ref ,
395
- "already exists" , porcelain );
402
+ "already exists" , porcelain , summary_width );
396
403
break ;
397
404
case REF_STATUS_REJECT_FETCH_FIRST :
398
405
print_ref_status ('!' , "[rejected]" , ref , ref -> peer_ref ,
399
- "fetch first" , porcelain );
406
+ "fetch first" , porcelain , summary_width );
400
407
break ;
401
408
case REF_STATUS_REJECT_NEEDS_FORCE :
402
409
print_ref_status ('!' , "[rejected]" , ref , ref -> peer_ref ,
403
- "needs force" , porcelain );
410
+ "needs force" , porcelain , summary_width );
404
411
break ;
405
412
case REF_STATUS_REJECT_STALE :
406
413
print_ref_status ('!' , "[rejected]" , ref , ref -> peer_ref ,
407
- "stale info" , porcelain );
414
+ "stale info" , porcelain , summary_width );
408
415
break ;
409
416
case REF_STATUS_REJECT_SHALLOW :
410
417
print_ref_status ('!' , "[rejected]" , ref , ref -> peer_ref ,
411
- "new shallow roots not allowed" , porcelain );
418
+ "new shallow roots not allowed" ,
419
+ porcelain , summary_width );
412
420
break ;
413
421
case REF_STATUS_REMOTE_REJECT :
414
422
print_ref_status ('!' , "[remote rejected]" , ref ,
415
- ref -> deletion ? NULL : ref -> peer_ref ,
416
- ref -> remote_status , porcelain );
423
+ ref -> deletion ? NULL : ref -> peer_ref ,
424
+ ref -> remote_status , porcelain , summary_width );
417
425
break ;
418
426
case REF_STATUS_EXPECTING_REPORT :
419
427
print_ref_status ('!' , "[remote failure]" , ref ,
420
- ref -> deletion ? NULL : ref -> peer_ref ,
421
- "remote failed to report status" , porcelain );
428
+ ref -> deletion ? NULL : ref -> peer_ref ,
429
+ "remote failed to report status" ,
430
+ porcelain , summary_width );
422
431
break ;
423
432
case REF_STATUS_ATOMIC_PUSH_FAILED :
424
433
print_ref_status ('!' , "[rejected]" , ref , ref -> peer_ref ,
425
- "atomic push failed" , porcelain );
434
+ "atomic push failed" , porcelain , summary_width );
426
435
break ;
427
436
case REF_STATUS_OK :
428
- print_ok_ref_status (ref , porcelain );
437
+ print_ok_ref_status (ref , porcelain , summary_width );
429
438
break ;
430
439
}
431
440
432
441
return 1 ;
433
442
}
434
443
444
+ static int measure_abbrev (const struct object_id * oid , int sofar )
445
+ {
446
+ char hex [GIT_SHA1_HEXSZ + 1 ];
447
+ int w = find_unique_abbrev_r (hex , oid -> hash , DEFAULT_ABBREV );
448
+
449
+ return (w < sofar ) ? sofar : w ;
450
+ }
451
+
452
+ int transport_summary_width (const struct ref * refs )
453
+ {
454
+ int maxw = -1 ;
455
+
456
+ for (; refs ; refs = refs -> next ) {
457
+ maxw = measure_abbrev (& refs -> old_oid , maxw );
458
+ maxw = measure_abbrev (& refs -> new_oid , maxw );
459
+ }
460
+ if (maxw < 0 )
461
+ maxw = FALLBACK_DEFAULT_ABBREV ;
462
+ return (2 * maxw + 3 );
463
+ }
464
+
435
465
void transport_print_push_status (const char * dest , struct ref * refs ,
436
466
int verbose , int porcelain , unsigned int * reject_reasons )
437
467
{
438
468
struct ref * ref ;
439
469
int n = 0 ;
440
470
unsigned char head_sha1 [20 ];
441
471
char * head ;
472
+ int summary_width = transport_summary_width (refs );
442
473
443
474
head = resolve_refdup ("HEAD" , RESOLVE_REF_READING , head_sha1 , NULL );
444
475
445
476
if (verbose ) {
446
477
for (ref = refs ; ref ; ref = ref -> next )
447
478
if (ref -> status == REF_STATUS_UPTODATE )
448
- n += print_one_push_status (ref , dest , n , porcelain );
479
+ n += print_one_push_status (ref , dest , n ,
480
+ porcelain , summary_width );
449
481
}
450
482
451
483
for (ref = refs ; ref ; ref = ref -> next )
452
484
if (ref -> status == REF_STATUS_OK )
453
- n += print_one_push_status (ref , dest , n , porcelain );
485
+ n += print_one_push_status (ref , dest , n ,
486
+ porcelain , summary_width );
454
487
455
488
* reject_reasons = 0 ;
456
489
for (ref = refs ; ref ; ref = ref -> next ) {
457
490
if (ref -> status != REF_STATUS_NONE &&
458
491
ref -> status != REF_STATUS_UPTODATE &&
459
492
ref -> status != REF_STATUS_OK )
460
- n += print_one_push_status (ref , dest , n , porcelain );
493
+ n += print_one_push_status (ref , dest , n ,
494
+ porcelain , summary_width );
461
495
if (ref -> status == REF_STATUS_REJECT_NONFASTFORWARD ) {
462
496
if (head != NULL && !strcmp (head , ref -> name ))
463
497
* reject_reasons |= REJECT_NON_FF_HEAD ;
0 commit comments