@@ -9,6 +9,8 @@ use std::str::FromStr;
9
9
use anyhow:: { Context , Error , Result , anyhow} ;
10
10
use clap:: { Args , CommandFactory , Parser , Subcommand , ValueEnum , builder:: PossibleValue } ;
11
11
use clap_complete:: Shell ;
12
+ use futures_util:: stream:: StreamExt ;
13
+ use indicatif:: { MultiProgress , ProgressBar , ProgressDrawTarget , ProgressStyle } ;
12
14
use itertools:: Itertools ;
13
15
use tracing:: { info, trace, warn} ;
14
16
use tracing_subscriber:: { EnvFilter , Registry , reload:: Handle } ;
@@ -791,44 +793,67 @@ async fn default_(
791
793
792
794
async fn check_updates ( cfg : & Cfg < ' _ > , opts : CheckOpts ) -> Result < utils:: ExitCode > {
793
795
let mut update_available = false ;
794
-
795
- let mut t = cfg. process . stdout ( ) . terminal ( cfg. process ) ;
796
796
let channels = cfg. list_channels ( ) ?;
797
-
798
- for channel in channels {
799
- let ( name, distributable) = channel;
800
- let current_version = distributable. show_version ( ) ?;
801
- let dist_version = distributable. show_dist_version ( ) . await ?;
802
- let _ = t. attr ( terminalsource:: Attr :: Bold ) ;
803
- write ! ( t. lock( ) , "{name} - " ) ?;
804
- match ( current_version, dist_version) {
805
- ( None , None ) => {
806
- let _ = t. fg ( terminalsource:: Color :: Red ) ;
807
- writeln ! ( t. lock( ) , "Cannot identify installed or update versions" ) ?;
808
- }
809
- ( Some ( cv) , None ) => {
810
- let _ = t. fg ( terminalsource:: Color :: Green ) ;
811
- write ! ( t. lock( ) , "Up to date" ) ?;
812
- let _ = t. reset ( ) ;
813
- writeln ! ( t. lock( ) , " : {cv}" ) ?;
814
- }
815
- ( Some ( cv) , Some ( dv) ) => {
816
- update_available = true ;
817
- let _ = t. fg ( terminalsource:: Color :: Yellow ) ;
818
- write ! ( t. lock( ) , "Update available" ) ?;
819
- let _ = t. reset ( ) ;
820
- writeln ! ( t. lock( ) , " : {cv} -> {dv}" ) ?;
821
- }
822
- ( None , Some ( dv) ) => {
823
- update_available = true ;
824
- let _ = t. fg ( terminalsource:: Color :: Yellow ) ;
825
- write ! ( t. lock( ) , "Update available" ) ?;
826
- let _ = t. reset ( ) ;
827
- writeln ! ( t. lock( ) , " : (Unknown version) -> {dv}" ) ?;
828
- }
829
- }
797
+ let num_channels = channels. len ( ) ;
798
+ if num_channels > 0 {
799
+ let mp = MultiProgress :: with_draw_target ( ProgressDrawTarget :: stdout ( ) ) ;
800
+
801
+ let progress_bars: Vec < _ > = channels
802
+ . iter ( )
803
+ . map ( |( name, _) | {
804
+ let pb = mp. add ( ProgressBar :: new ( 1 ) ) ;
805
+ pb. set_style (
806
+ ProgressStyle :: with_template ( "{msg} {spinner:.green}" )
807
+ . unwrap ( )
808
+ . tick_chars ( "⠁⠂⠄⡀⢀⠠⠐⠈ " ) ,
809
+ ) ;
810
+ pb. set_message ( format ! ( "{} - Checking..." , name) ) ;
811
+ pb. enable_steady_tick ( std:: time:: Duration :: from_millis ( 100 ) ) ;
812
+ pb
813
+ } )
814
+ . collect ( ) ;
815
+
816
+ let channels = tokio_stream:: iter ( channels. into_iter ( ) . zip ( progress_bars) )
817
+ . map ( |( ( name, distributable) , pb) | async move {
818
+ let current_version = distributable. show_version ( ) ?;
819
+ let dist_version = distributable. show_dist_version ( ) . await ?;
820
+ let mut update_a = false ;
821
+
822
+ let ( message, style) = match ( current_version, dist_version) {
823
+ ( None , None ) => {
824
+ let msg =
825
+ format ! ( "{} - Cannot identify installed or update versions" , name) ;
826
+ let style = ProgressStyle :: with_template ( "{msg}" ) . unwrap ( ) ;
827
+ ( msg, style)
828
+ }
829
+ ( Some ( cv) , None ) => {
830
+ let msg = format ! ( "{} - Up to date : {}" , name, cv) ;
831
+ let style = ProgressStyle :: with_template ( "{msg}" ) . unwrap ( ) ;
832
+ ( msg, style)
833
+ }
834
+ ( Some ( cv) , Some ( dv) ) => {
835
+ update_a = true ;
836
+ let msg = format ! ( "{} - Update available : {} -> {}" , name, cv, dv) ;
837
+ let style = ProgressStyle :: with_template ( "{msg}" ) . unwrap ( ) ;
838
+ ( msg, style)
839
+ }
840
+ ( None , Some ( dv) ) => {
841
+ update_a = true ;
842
+ let msg =
843
+ format ! ( "{} - Update available : (Unknown version) -> {}" , name, dv) ;
844
+ let style = ProgressStyle :: with_template ( "{msg}" ) . unwrap ( ) ;
845
+ ( msg, style)
846
+ }
847
+ } ;
848
+ pb. set_style ( style) ;
849
+ pb. finish_with_message ( message) ;
850
+ Ok :: < bool , Error > ( update_a)
851
+ } )
852
+ . buffered ( num_channels)
853
+ . collect :: < Vec < _ > > ( )
854
+ . await ;
855
+ update_available = channels. into_iter ( ) . any ( |r| r. unwrap_or ( false ) ) ;
830
856
}
831
-
832
857
let self_update_mode = cfg. get_self_update_mode ( ) ?;
833
858
// Priority: no-self-update feature > self_update_mode > no-self-update args.
834
859
// Check for update only if rustup does **not** have the no-self-update feature,
0 commit comments