@@ -3,6 +3,7 @@ mod dependency_manager;
33use std:: {
44 cell:: RefCell ,
55 collections:: { HashMap , HashSet } ,
6+ io:: Write ,
67 process:: Command ,
78 rc:: Rc ,
89 time:: Instant ,
@@ -19,7 +20,7 @@ use gleam_core::{
1920 error:: { FileIoAction , FileKind , ShellCommandFailureReason , StandardIoAction } ,
2021 hex:: { self , HEXPM_PUBLIC_KEY } ,
2122 io:: { HttpClient as _, TarUnpacker , WrappedReader } ,
22- manifest:: { self , Base16Checksum , Manifest , ManifestPackage , ManifestPackageSource , Resolved } ,
23+ manifest:: { Base16Checksum , Manifest , ManifestPackage , ManifestPackageSource , Resolved } ,
2324 paths:: ProjectPaths ,
2425 requirement:: Requirement ,
2526} ;
@@ -110,7 +111,7 @@ fn get_manifest_details(paths: &ProjectPaths) -> Result<(PackageConfig, Manifest
110111 Ok ( ( config, manifest) )
111112}
112113
113- fn list_manifest_packages < W : std :: io :: Write > ( mut buffer : W , manifest : Manifest ) -> Result < ( ) > {
114+ fn list_manifest_packages < W : Write > ( mut buffer : W , manifest : Manifest ) -> Result < ( ) > {
114115 manifest
115116 . packages
116117 . into_iter ( )
@@ -121,7 +122,7 @@ fn list_manifest_packages<W: std::io::Write>(mut buffer: W, manifest: Manifest)
121122 } )
122123}
123124
124- fn list_package_and_dependencies_tree < W : std :: io :: Write > (
125+ fn list_package_and_dependencies_tree < W : Write > (
125126 mut buffer : W ,
126127 options : TreeOptions ,
127128 packages : Vec < ManifestPackage > ,
@@ -222,10 +223,8 @@ pub fn outdated(paths: &ProjectPaths) -> Result<()> {
222223
223224 let version_updates = dependency:: check_for_version_updates ( & manifest, & package_fetcher) ;
224225
225-
226- println ! ( "Package\t Current\t Latest" ) ;
227- for ( package_name, ( current_version, latest_version) ) in version_updates {
228- println ! ( "{}\t v{}\t v{}" , package_name, current_version, latest_version) ;
226+ if !version_updates. is_empty ( ) {
227+ print ! ( "{}" , pretty_print_version_updates( version_updates) ) ;
229228 }
230229
231230 Ok ( ( ) )
@@ -461,6 +460,75 @@ fn pretty_print_major_versions_available(versions: dependency::PackageVersionDif
461460 output_string
462461}
463462
463+ fn pretty_print_version_updates ( versions : dependency:: PackageVersionDiffs ) -> String {
464+ let total_lines = versions. len ( ) + 1 ;
465+
466+ let versions = versions
467+ . iter ( )
468+ . map ( |( name, ( v1, v2) ) | ( name, v1. to_string ( ) , v2. to_string ( ) ) )
469+ . sorted ( ) ;
470+
471+ let longest_parts = versions. clone ( ) . fold (
472+ ( 0 , 0 , 0 ) ,
473+ |( max_name, max_curr, max_latest) , ( name, curr, latest) | {
474+ (
475+ max_name. max ( name. len ( ) ) ,
476+ max_curr. max ( curr. len ( ) ) ,
477+ max_latest. max ( latest. len ( ) ) ,
478+ )
479+ } ,
480+ ) ;
481+
482+ let ( name_len, curr_len, latest_len) = longest_parts;
483+ let longest_package_name_length = name_len. max ( 7 ) ;
484+ let longest_current_version_length = ( curr_len + 1 ) . max ( 7 ) ;
485+ let longest_latest_version_length = ( latest_len + 1 ) . max ( 6 ) ;
486+
487+ let mut output_string = String :: with_capacity (
488+ ( longest_package_name_length
489+ + longest_current_version_length
490+ + longest_latest_version_length
491+ + 3 )
492+ * total_lines,
493+ ) ;
494+
495+ let name_padding = " " . repeat ( longest_package_name_length - 7 ) ;
496+ let curr_ver_padding = " " . repeat ( longest_current_version_length - 7 ) ;
497+
498+ output_string. push_str (
499+ & [
500+ "Package" ,
501+ & name_padding,
502+ " Current" ,
503+ & curr_ver_padding,
504+ " Latest\n " ,
505+ ]
506+ . concat ( ) ,
507+ ) ;
508+
509+ for ( name, v1, v2) in versions {
510+ let name_padding = " " . repeat ( longest_package_name_length - name. len ( ) ) ;
511+ let curr_ver_padding =
512+ " " . repeat ( longest_current_version_length - 1 - v1. to_string ( ) . len ( ) ) ;
513+
514+ output_string. push_str (
515+ & [
516+ name,
517+ & name_padding,
518+ " v" ,
519+ & v1. to_string ( ) ,
520+ & curr_ver_padding,
521+ " v" ,
522+ & v2. to_string ( ) ,
523+ "\n " ,
524+ ]
525+ . concat ( ) ,
526+ ) ;
527+ }
528+
529+ output_string
530+ }
531+
464532async fn add_missing_packages < Telem : Telemetry > (
465533 paths : & ProjectPaths ,
466534 fs : Box < ProjectIO > ,
0 commit comments