From 72438ef5bb03d5883b9909dbd5286c38d701c897 Mon Sep 17 00:00:00 2001 From: Chan Kang Date: Fri, 28 Jun 2024 18:35:37 -0400 Subject: [PATCH] Use asterisk for dependency cycles in `uv pip tree` (#4626) ## Summary Use an asterisk to indicate dependency cycles, along with de-duplicated packages. Purely an aesthetic change. --- crates/uv/src/commands/pip/tree.rs | 23 +++++++++-------------- crates/uv/tests/pip_tree.rs | 8 ++++---- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/crates/uv/src/commands/pip/tree.rs b/crates/uv/src/commands/pip/tree.rs index 464bc2be1..8b80213ee 100644 --- a/crates/uv/src/commands/pip/tree.rs +++ b/crates/uv/src/commands/pip/tree.rs @@ -57,14 +57,12 @@ pub(crate) fn pip_tree( .join("\n"); writeln!(printer.stdout(), "{rendered_tree}").unwrap(); if rendered_tree.contains('*') { - writeln!( - printer.stdout(), - "{}", + let message = if no_dedupe { + "(*) Package tree is a cycle and cannot be shown".italic() + } else { "(*) Package tree already displayed".italic() - )?; - } - if rendered_tree.contains('#') { - writeln!(printer.stdout(), "{}", "(#) Dependency cycle".italic())?; + }; + writeln!(printer.stdout(), "{message}")?; } // Validate that the environment is consistent. @@ -176,13 +174,10 @@ impl<'a> DisplayDependencyGraph<'a> { let is_visited = visited.contains(&package_name); let line = format!("{} v{}", package_name, installed_dist.version()); - if path.contains(&package_name) { - return vec![format!("{} (#)", line)]; - } - - // If the package has been visited and de-duplication is enabled (default), - // skip the traversal. - if is_visited && !self.no_dedupe { + // Skip the traversal if + // 1. the package is in the current traversal path (i.e. a dependency cycle) + // 2. if the package has been visited and de-duplication is enabled (default) + if path.contains(&package_name) || (is_visited && !self.no_dedupe) { return vec![format!("{} (*)", line)]; } diff --git a/crates/uv/tests/pip_tree.rs b/crates/uv/tests/pip_tree.rs index fdaea3f87..7b5a444b9 100644 --- a/crates/uv/tests/pip_tree.rs +++ b/crates/uv/tests/pip_tree.rs @@ -623,8 +623,8 @@ fn cyclic_dependency() { uv-cyclic-dependencies-c v0.1.0 └── uv-cyclic-dependencies-a v0.1.0 └── uv-cyclic-dependencies-b v0.1.0 - └── uv-cyclic-dependencies-a v0.1.0 (#) - (#) Dependency cycle + └── uv-cyclic-dependencies-a v0.1.0 (*) + (*) Package tree already displayed ----- stderr ----- "### @@ -906,8 +906,8 @@ fn no_dedupe_and_cycle() { uv-cyclic-dependencies-c v0.1.0 └── uv-cyclic-dependencies-a v0.1.0 └── uv-cyclic-dependencies-b v0.1.0 - └── uv-cyclic-dependencies-a v0.1.0 (#) - (#) Dependency cycle + └── uv-cyclic-dependencies-a v0.1.0 (*) + (*) Package tree is a cycle and cannot be shown ----- stderr ----- "###