From 9b6e11e9b0f63e10260e186c11c28f6fc2a4a54c Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 27 Feb 2025 16:35:00 -0600 Subject: [PATCH] feat(tree): Color lines by dependency type --- src/cargo/ops/tree/mod.rs | 47 +++++++--- .../testsuite/cargo_tree/dupe/stdout.term.svg | 8 +- .../cargo_tree/edge_kind/stdout.term.svg | 87 ++++++++++--------- 3 files changed, 85 insertions(+), 57 deletions(-) diff --git a/src/cargo/ops/tree/mod.rs b/src/cargo/ops/tree/mod.rs index c7ad41c81..25745223d 100644 --- a/src/cargo/ops/tree/mod.rs +++ b/src/cargo/ops/tree/mod.rs @@ -300,7 +300,7 @@ fn print_node<'a>( no_dedupe: bool, display_depth: DisplayDepth, visited_deps: &mut HashSet, - levels_continue: &mut Vec, + levels_continue: &mut Vec<(anstyle::Style, bool)>, print_stack: &mut Vec, ) { let new = no_dedupe || visited_deps.insert(node_index); @@ -308,10 +308,10 @@ fn print_node<'a>( match prefix { Prefix::Depth => drop_print!(ws.gctx(), "{}", levels_continue.len()), Prefix::Indent => { - if let Some((last_continues, rest)) = levels_continue.split_last() { - for continues in rest { + if let Some(((last_style, last_continues), rest)) = levels_continue.split_last() { + for (style, continues) in rest { let c = if *continues { symbols.down } else { " " }; - drop_print!(ws.gctx(), "{} ", c); + drop_print!(ws.gctx(), "{style}{c}{style:#} "); } let c = if *last_continues { @@ -319,7 +319,12 @@ fn print_node<'a>( } else { symbols.ell }; - drop_print!(ws.gctx(), "{0}{1}{1} ", c, symbols.right); + drop_print!( + ws.gctx(), + "{last_style}{0}{1}{1}{last_style:#} ", + c, + symbols.right + ); } } Prefix::None => {} @@ -379,7 +384,7 @@ fn print_dependencies<'a>( no_dedupe: bool, display_depth: DisplayDepth, visited_deps: &mut HashSet, - levels_continue: &mut Vec, + levels_continue: &mut Vec<(anstyle::Style, bool)>, print_stack: &mut Vec, kind: &EdgeKind, ) { @@ -390,19 +395,23 @@ fn print_dependencies<'a>( let name = match kind { EdgeKind::Dep(DepKind::Normal) => None, - EdgeKind::Dep(DepKind::Build) => Some("[build-dependencies]"), - EdgeKind::Dep(DepKind::Development) => Some("[dev-dependencies]"), + EdgeKind::Dep(DepKind::Build) => { + Some(color_print::cstr!("[build-dependencies]")) + } + EdgeKind::Dep(DepKind::Development) => { + Some(color_print::cstr!("[dev-dependencies]")) + } EdgeKind::Feature => None, }; if let Prefix::Indent = prefix { if let Some(name) = name { - for continues in &**levels_continue { + for (style, continues) in &**levels_continue { let c = if *continues { symbols.down } else { " " }; - drop_print!(ws.gctx(), "{} ", c); + drop_print!(ws.gctx(), "{style}{c}{style:#} "); } - drop_println!(ws.gctx(), "{}", name); + drop_println!(ws.gctx(), "{name}"); } } @@ -433,7 +442,8 @@ fn print_dependencies<'a>( .peekable(); while let Some(dependency) = it.next() { - levels_continue.push(it.peek().is_some()); + let style = edge_line_color(dependency.kind()); + levels_continue.push((style, it.peek().is_some())); print_node( ws, graph, @@ -451,3 +461,16 @@ fn print_dependencies<'a>( levels_continue.pop(); } } + +fn edge_line_color(kind: EdgeKind) -> anstyle::Style { + match kind { + EdgeKind::Dep(DepKind::Normal) => anstyle::Style::new() | anstyle::Effects::DIMMED, + EdgeKind::Dep(DepKind::Build) => { + anstyle::AnsiColor::Blue.on_default() | anstyle::Effects::BOLD + } + EdgeKind::Dep(DepKind::Development) => { + anstyle::AnsiColor::Cyan.on_default() | anstyle::Effects::BOLD + } + EdgeKind::Feature => anstyle::AnsiColor::Magenta.on_default() | anstyle::Effects::DIMMED, + } +} diff --git a/tests/testsuite/cargo_tree/dupe/stdout.term.svg b/tests/testsuite/cargo_tree/dupe/stdout.term.svg index f05087707..979f56201 100644 --- a/tests/testsuite/cargo_tree/dupe/stdout.term.svg +++ b/tests/testsuite/cargo_tree/dupe/stdout.term.svg @@ -20,13 +20,13 @@ foo v0.1.0 ([ROOT]/foo) - ├── a v1.0.0 + ├── a v1.0.0 - │ └── b v1.0.0 + └── b v1.0.0 - │ └── c v1.0.0 + └── c v1.0.0 - └── b v1.0.0 (*) + └── b v1.0.0 (*) diff --git a/tests/testsuite/cargo_tree/edge_kind/stdout.term.svg b/tests/testsuite/cargo_tree/edge_kind/stdout.term.svg index bd9b16b07..d72bb497c 100644 --- a/tests/testsuite/cargo_tree/edge_kind/stdout.term.svg +++ b/tests/testsuite/cargo_tree/edge_kind/stdout.term.svg @@ -2,10 +2,15 @@