Skip to content

Commit fa2c2b0

Browse files
author
Roman Stingler
committed
Add coloring to repo names and version diff
closes Morganamilo#1291
1 parent 398cb5a commit fa2c2b0

File tree

1 file changed

+141
-24
lines changed

1 file changed

+141
-24
lines changed

src/fmt.rs

+141-24
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,11 @@ pub fn color_repo(enabled: bool, name: &str) -> String {
114114
return name.to_string();
115115
}
116116

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()
126122
}
127123

128124
pub fn print_target(targ: &str, quiet: bool) {
@@ -443,13 +439,38 @@ pub fn print_install_verbose(config: &Config, actions: &Actions, devel: &HashSet
443439
});
444440

445441
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(
449449
db.pkg(pkg.pkg.name())
450450
.map(|pkg| pkg.version().as_str())
451451
.unwrap_or(""),
452452
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,
453474
if pkg.make { &yes } else { &no }
454475
);
455476
}
@@ -475,37 +496,83 @@ pub fn print_install_verbose(config: &Config, actions: &Actions, devel: &HashSet
475496
match pkg {
476497
Base::Aur(base) => {
477498
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+
478505
let ver = if devel.contains(&pkg.pkg.name) {
479506
"latest-commit"
480507
} else {
481508
&pkg.pkg.version
482509
};
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+
483526
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,
490534
if pkg.make { &yes } else { &no }
491535
);
492536
}
493537
}
494538
Base::Pkgbuild(base) => {
495539
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+
496546
let ver = base.srcinfo.version();
497547
let ver = if devel.contains(&pkg.pkg.pkgname) {
498548
"latest-commit"
499549
} else {
500550
&ver
501551
};
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+
502568
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,
509576
if pkg.make { &yes } else { &no }
510577
);
511578
}
@@ -516,3 +583,53 @@ pub fn print_install_verbose(config: &Config, actions: &Actions, devel: &HashSet
516583

517584
println!();
518585
}
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

Comments
 (0)