@@ -114,15 +114,11 @@ pub fn color_repo(enabled: bool, name: &str) -> String {
114
114
return name. to_string ( ) ;
115
115
}
116
116
117
- let mut col: u32 = 5 ;
118
-
119
- for & b in name. as_bytes ( ) {
120
- col = ( b as u32 ) . wrapping_add ( ( col << 4 ) . wrapping_add ( col) ) ;
121
- }
122
-
123
- col = ( col % 6 ) + 9 ;
124
- let col = Style :: from ( Color :: Fixed ( col as u8 ) ) . bold ( ) ;
125
- col. paint ( name) . to_string ( )
117
+ let color = 9 + ( name. len ( ) % 6 ) as u8 ;
118
+ Style :: from ( Color :: Fixed ( color) )
119
+ . bold ( )
120
+ . paint ( name)
121
+ . to_string ( )
126
122
}
127
123
128
124
pub fn print_target ( targ : & str , quiet : bool ) {
@@ -443,13 +439,38 @@ pub fn print_install_verbose(config: &Config, actions: &Actions, devel: &HashSet
443
439
} ) ;
444
440
445
441
for pkg in & install {
446
- println ! (
447
- "{:<package_len$} {:<old_len$} {:<new_len$} {}" ,
448
- format!( "{}/{}" , pkg. pkg. db( ) . unwrap( ) . name( ) , pkg. pkg. name( ) ) ,
442
+ let repo_name = pkg. pkg . db ( ) . unwrap ( ) . name ( ) ;
443
+ let colored_repo = color_repo ( config. color . enabled , repo_name) ;
444
+ let pkg_str = format ! ( "{}/{}" , colored_repo, pkg. pkg. name( ) ) ;
445
+ let visible_width = repo_name. len ( ) + 1 + pkg. pkg . name ( ) . len ( ) ; // Calculate visible width without ANSI codes
446
+ let padding = " " . repeat ( package_len. saturating_sub ( visible_width) ) ;
447
+
448
+ let ( old_colored, new_colored) = colorize_version_diff (
449
449
db. pkg ( pkg. pkg . name ( ) )
450
450
. map ( |pkg| pkg. version ( ) . as_str ( ) )
451
451
. unwrap_or ( "" ) ,
452
452
pkg. pkg . version ( ) . as_str ( ) ,
453
+ ) ;
454
+
455
+ // Calculate visible width of the colored versions
456
+ let old_visible_width = db
457
+ . pkg ( pkg. pkg . name ( ) )
458
+ . map ( |pkg| pkg. version ( ) . as_str ( ) . len ( ) )
459
+ . unwrap_or ( 0 ) ;
460
+ let new_visible_width = pkg. pkg . version ( ) . as_str ( ) . len ( ) ;
461
+
462
+ // Add padding to maintain alignment
463
+ let old_padding = " " . repeat ( old_len. saturating_sub ( old_visible_width) ) ;
464
+ let new_padding = " " . repeat ( new_len. saturating_sub ( new_visible_width) ) ;
465
+
466
+ println ! (
467
+ "{}{} {}{} {}{} {}" ,
468
+ pkg_str,
469
+ padding,
470
+ old_colored,
471
+ old_padding,
472
+ new_colored,
473
+ new_padding,
453
474
if pkg. make { & yes } else { & no }
454
475
) ;
455
476
}
@@ -475,37 +496,83 @@ pub fn print_install_verbose(config: &Config, actions: &Actions, devel: &HashSet
475
496
match pkg {
476
497
Base :: Aur ( base) => {
477
498
for pkg in & base. pkgs {
499
+ let repo_name = repo ( config, & pkg. pkg . name ) ;
500
+ let colored_repo = color_repo ( config. color . enabled , & repo_name) ;
501
+ let pkg_str = format ! ( "{}/{}" , colored_repo, pkg. pkg. name) ;
502
+ let visible_width = repo_name. len ( ) + 1 + pkg. pkg . name . len ( ) ;
503
+ let padding = " " . repeat ( package_len. saturating_sub ( visible_width) ) ;
504
+
478
505
let ver = if devel. contains ( & pkg. pkg . name ) {
479
506
"latest-commit"
480
507
} else {
481
508
& pkg. pkg . version
482
509
} ;
510
+
511
+ let old_version = old_ver ( config, & pkg. pkg . name )
512
+ . map ( |v| v. as_str ( ) )
513
+ . unwrap_or_default ( ) ;
514
+
515
+ // Colorize the versions
516
+ let ( old_colored, new_colored) = colorize_version_diff ( old_version, ver) ;
517
+
518
+ // Calculate visible width of the colored versions
519
+ let old_visible_width = old_version. len ( ) ;
520
+ let new_visible_width = ver. len ( ) ;
521
+
522
+ // Add padding to maintain alignment
523
+ let old_padding = " " . repeat ( old_len. saturating_sub ( old_visible_width) ) ;
524
+ let new_padding = " " . repeat ( new_len. saturating_sub ( new_visible_width) ) ;
525
+
483
526
println ! (
484
- "{:<package_len$} {:<old_len$} {:<new_len$} {}" ,
485
- format!( "{}/{}" , repo( config, & pkg. pkg. name) , pkg. pkg. name) ,
486
- old_ver( config, & pkg. pkg. name)
487
- . map( |v| v. as_str( ) )
488
- . unwrap_or_default( ) ,
489
- ver,
527
+ "{}{} {}{} {}{} {}" ,
528
+ pkg_str,
529
+ padding,
530
+ old_colored,
531
+ old_padding,
532
+ new_colored,
533
+ new_padding,
490
534
if pkg. make { & yes } else { & no }
491
535
) ;
492
536
}
493
537
}
494
538
Base :: Pkgbuild ( base) => {
495
539
for pkg in & base. pkgs {
540
+ let repo_name = & base. repo ;
541
+ let colored_repo = color_repo ( config. color . enabled , repo_name) ;
542
+ let pkg_str = format ! ( "{}/{}" , colored_repo, pkg. pkg. pkgname) ;
543
+ let visible_width = repo_name. len ( ) + 1 + pkg. pkg . pkgname . len ( ) ;
544
+ let padding = " " . repeat ( package_len. saturating_sub ( visible_width) ) ;
545
+
496
546
let ver = base. srcinfo . version ( ) ;
497
547
let ver = if devel. contains ( & pkg. pkg . pkgname ) {
498
548
"latest-commit"
499
549
} else {
500
550
& ver
501
551
} ;
552
+
553
+ let old_version = old_ver ( config, & pkg. pkg . pkgname )
554
+ . map ( |v| v. as_str ( ) )
555
+ . unwrap_or_default ( ) ;
556
+
557
+ // Colorize the versions
558
+ let ( old_colored, new_colored) = colorize_version_diff ( old_version, ver) ;
559
+
560
+ // Calculate visible width of the colored versions
561
+ let old_visible_width = old_version. len ( ) ;
562
+ let new_visible_width = ver. len ( ) ;
563
+
564
+ // Add padding to maintain alignment
565
+ let old_padding = " " . repeat ( old_len. saturating_sub ( old_visible_width) ) ;
566
+ let new_padding = " " . repeat ( new_len. saturating_sub ( new_visible_width) ) ;
567
+
502
568
println ! (
503
- "{:<package_len$} {:<old_len$} {:<new_len$} {}" ,
504
- format!( "{}/{}" , base. repo, pkg. pkg. pkgname) ,
505
- old_ver( config, & pkg. pkg. pkgname)
506
- . map( |v| v. as_str( ) )
507
- . unwrap_or_default( ) ,
508
- ver,
569
+ "{}{} {}{} {}{} {}" ,
570
+ pkg_str,
571
+ padding,
572
+ old_colored,
573
+ old_padding,
574
+ new_colored,
575
+ new_padding,
509
576
if pkg. make { & yes } else { & no }
510
577
) ;
511
578
}
@@ -516,3 +583,53 @@ pub fn print_install_verbose(config: &Config, actions: &Actions, devel: &HashSet
516
583
517
584
println ! ( ) ;
518
585
}
586
+
587
+ fn colorize_version_diff ( old_ver : & str , new_ver : & str ) -> ( String , String ) {
588
+ if old_ver. is_empty ( ) {
589
+ return (
590
+ String :: new ( ) ,
591
+ Style :: new ( ) . fg ( Color :: Green ) . paint ( new_ver) . to_string ( ) , // all green for new version
592
+ ) ;
593
+ }
594
+
595
+ let mut old_colored = String :: new ( ) ;
596
+ let mut new_colored = String :: new ( ) ;
597
+
598
+ // Split versions into characters
599
+ let old_chars: Vec < char > = old_ver. chars ( ) . collect ( ) ;
600
+ let new_chars: Vec < char > = new_ver. chars ( ) . collect ( ) ;
601
+
602
+ // Find common prefix
603
+ let mut common_len = 0 ;
604
+ for ( a, b) in old_chars. iter ( ) . zip ( new_chars. iter ( ) ) {
605
+ if a == b {
606
+ common_len += 1 ;
607
+ } else {
608
+ break ;
609
+ }
610
+ }
611
+
612
+ // Color the old version (red for different parts)
613
+ old_colored. push_str ( & old_ver[ ..common_len] ) ;
614
+ if common_len < old_ver. len ( ) {
615
+ old_colored. push_str (
616
+ & Style :: new ( )
617
+ . fg ( Color :: Red )
618
+ . paint ( & old_ver[ common_len..] )
619
+ . to_string ( ) ,
620
+ ) ;
621
+ }
622
+
623
+ // Color the new version (green for different parts)
624
+ new_colored. push_str ( & new_ver[ ..common_len] ) ;
625
+ if common_len < new_ver. len ( ) {
626
+ new_colored. push_str (
627
+ & Style :: new ( )
628
+ . fg ( Color :: Green )
629
+ . paint ( & new_ver[ common_len..] )
630
+ . to_string ( ) ,
631
+ ) ;
632
+ }
633
+
634
+ ( old_colored, new_colored)
635
+ }
0 commit comments