Skip to content

Commit 6753ea1

Browse files
vshakitskiylpil
authored andcommitted
pretty print version updates
1 parent 2a6175c commit 6753ea1

File tree

1 file changed

+75
-7
lines changed

1 file changed

+75
-7
lines changed

compiler-cli/src/dependencies.rs

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod dependency_manager;
33
use 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\tCurrent\tLatest");
227-
for (package_name, (current_version, latest_version)) in version_updates {
228-
println!("{}\tv{}\tv{}", 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+
464532
async fn add_missing_packages<Telem: Telemetry>(
465533
paths: &ProjectPaths,
466534
fs: Box<ProjectIO>,

0 commit comments

Comments
 (0)