From 7cbc365da8b904dc3e2c39a1fb75b17b98debd11 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Mon, 17 May 2021 00:49:12 +0800 Subject: [PATCH 1/4] feat: new `--depth` option for `cargo tree` --- src/bin/cargo/commands/tree.rs | 2 ++ src/cargo/ops/tree/mod.rs | 37 +++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/bin/cargo/commands/tree.rs b/src/bin/cargo/commands/tree.rs index e6a1f21b2f6..ea244ec1866 100644 --- a/src/bin/cargo/commands/tree.rs +++ b/src/bin/cargo/commands/tree.rs @@ -55,6 +55,7 @@ pub fn cli() -> App { ) .short("i"), ) + .arg(opt("depth", "Maximum display depth of the dependency tree").value_name("DEPTH")) // Deprecated, use --prefix=none instead. .arg(Arg::with_name("no-indent").long("no-indent").hidden(true)) // Deprecated, use --prefix=depth instead. @@ -201,6 +202,7 @@ subtree of the package given to -p.\n\ charset, format: args.value_of("format").unwrap().to_string(), graph_features, + max_display_depth: args.value_of_u32("depth")?.unwrap_or(u32::MAX), }; tree::build_and_print(&ws, &opts)?; diff --git a/src/cargo/ops/tree/mod.rs b/src/cargo/ops/tree/mod.rs index 3f7d6517439..7b7ac9cda1e 100644 --- a/src/cargo/ops/tree/mod.rs +++ b/src/cargo/ops/tree/mod.rs @@ -43,6 +43,8 @@ pub struct TreeOptions { pub format: String, /// Includes features in the tree as separate nodes. pub graph_features: bool, + /// Maximum display depth of the dependency tree. + pub max_display_depth: u32, } #[derive(PartialEq)] @@ -241,6 +243,7 @@ fn print( symbols, opts.prefix, opts.no_dedupe, + opts.max_display_depth, &mut visited_deps, &mut levels_continue, &mut print_stack, @@ -259,6 +262,7 @@ fn print_node<'a>( symbols: &Symbols, prefix: Prefix, no_dedupe: bool, + max_display_depth: u32, visited_deps: &mut HashSet, levels_continue: &mut Vec, print_stack: &mut Vec, @@ -316,6 +320,7 @@ fn print_node<'a>( symbols, prefix, no_dedupe, + max_display_depth, visited_deps, levels_continue, print_stack, @@ -334,6 +339,7 @@ fn print_dependencies<'a>( symbols: &Symbols, prefix: Prefix, no_dedupe: bool, + max_display_depth: u32, visited_deps: &mut HashSet, levels_continue: &mut Vec, print_stack: &mut Vec, @@ -364,19 +370,22 @@ fn print_dependencies<'a>( let mut it = deps.iter().peekable(); while let Some(dependency) = it.next() { - levels_continue.push(it.peek().is_some()); - print_node( - config, - graph, - *dependency, - format, - symbols, - prefix, - no_dedupe, - visited_deps, - levels_continue, - print_stack, - ); - levels_continue.pop(); + if levels_continue.len() + 1 <= max_display_depth as usize { + levels_continue.push(it.peek().is_some()); + print_node( + config, + graph, + *dependency, + format, + symbols, + prefix, + no_dedupe, + max_display_depth, + visited_deps, + levels_continue, + print_stack, + ); + levels_continue.pop(); + } } } From 62d811d9f79f35a8e6f266c872bf98d943ada468 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Wed, 19 May 2021 08:52:45 +0800 Subject: [PATCH 2/4] test(cargo-tree): `--depth` option --- tests/testsuite/tree.rs | 93 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/tests/testsuite/tree.rs b/tests/testsuite/tree.rs index bd515b49af4..690a1289ec7 100644 --- a/tests/testsuite/tree.rs +++ b/tests/testsuite/tree.rs @@ -1479,3 +1479,96 @@ b v0.1.0 ([..]/foo/b) ) .run(); } + +#[cargo_test] +fn depth_limit() { + let p = make_simple_proj(); + + p.cargo("tree --depth 0") + .with_stdout( + "\ +foo v0.1.0 ([..]/foo) +[build-dependencies] +[dev-dependencies] +", + ) + .run(); + + p.cargo("tree --depth 1") + .with_stdout( + "\ +foo v0.1.0 ([..]/foo) +├── a v1.0.0 +└── c v1.0.0 +[build-dependencies] +└── bdep v1.0.0 +[dev-dependencies] +└── devdep v1.0.0 +", + ) + .run(); + + p.cargo("tree --depth 2") + .with_stdout( + "\ +foo v0.1.0 ([..]/foo) +├── a v1.0.0 +│ └── b v1.0.0 +└── c v1.0.0 +[build-dependencies] +└── bdep v1.0.0 + └── b v1.0.0 (*) +[dev-dependencies] +└── devdep v1.0.0 + └── b v1.0.0 (*) +", + ) + .run(); + + // specify a package + p.cargo("tree -p bdep --depth 1") + .with_stdout( + "\ +bdep v1.0.0 +└── b v1.0.0 +", + ) + .run(); + + // different prefix + p.cargo("tree --depth 1 --prefix depth") + .with_stdout( + "\ +0foo v0.1.0 ([..]/foo) +1a v1.0.0 +1c v1.0.0 +1bdep v1.0.0 +1devdep v1.0.0 +", + ) + .run(); + + // with edge-kinds + p.cargo("tree --depth 1 -e no-dev") + .with_stdout( + "\ +foo v0.1.0 ([..]/foo) +├── a v1.0.0 +└── c v1.0.0 +[build-dependencies] +└── bdep v1.0.0 +", + ) + .run(); + + // invert + p.cargo("tree --depth 1 --invert c") + .with_stdout( + "\ +c v1.0.0 +├── b v1.0.0 +└── foo v0.1.0 ([..]/foo) +", + ) + .run(); +} From d8334d5a6d938f957ef46afd08d88824d2e7ba20 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Wed, 19 May 2021 09:24:52 +0800 Subject: [PATCH 3/4] doc(cargo-tree): add `--depth` option --- src/doc/man/cargo-tree.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/doc/man/cargo-tree.md b/src/doc/man/cargo-tree.md index 789de41716d..acc2b8f659b 100644 --- a/src/doc/man/cargo-tree.md +++ b/src/doc/man/cargo-tree.md @@ -71,6 +71,11 @@ flag can be used to display the package's reverse dependencies only with the subtree of the package given to `-p`. {{/option}} +{{#option "`--depth` _depth_" }} +Maximum display depth of the dependency tree. A depth of 1 displays the direct +dependencies, for example. +{{/option}} + {{#option "`--no-dedupe`" }} Do not de-duplicate repeated dependencies. Usually, when a package has already displayed its dependencies, further occurrences will not re-display its From 40791da11f1794d60e83a58b4ab7af63ab98bb6f Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Wed, 19 May 2021 09:25:23 +0800 Subject: [PATCH 4/4] doc: generated via build-man.sh --- src/doc/man/generated_txt/cargo-tree.txt | 4 ++++ src/doc/src/commands/cargo-tree.md | 5 +++++ src/etc/man/cargo-tree.1 | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/src/doc/man/generated_txt/cargo-tree.txt b/src/doc/man/generated_txt/cargo-tree.txt index 7002a408b9e..b9a29e022ae 100644 --- a/src/doc/man/generated_txt/cargo-tree.txt +++ b/src/doc/man/generated_txt/cargo-tree.txt @@ -59,6 +59,10 @@ OPTIONS package's reverse dependencies only with the subtree of the package given to -p. + --depth depth + Maximum display depth of the dependency tree. A depth of 1 displays + the direct dependencies, for example. + --no-dedupe Do not de-duplicate repeated dependencies. Usually, when a package has already displayed its dependencies, further occurrences will not diff --git a/src/doc/src/commands/cargo-tree.md b/src/doc/src/commands/cargo-tree.md index ff50f50227c..5441aa8b30a 100644 --- a/src/doc/src/commands/cargo-tree.md +++ b/src/doc/src/commands/cargo-tree.md @@ -71,6 +71,11 @@ flag can be used to display the package's reverse dependencies only with the subtree of the package given to -p. +
--depth depth
+
Maximum display depth of the dependency tree. A depth of 1 displays the direct +dependencies, for example.
+ +
--no-dedupe
Do not de-duplicate repeated dependencies. Usually, when a package has already displayed its dependencies, further occurrences will not re-display its diff --git a/src/etc/man/cargo-tree.1 b/src/etc/man/cargo-tree.1 index dc315ad8403..4e3ecbaddd1 100644 --- a/src/etc/man/cargo-tree.1 +++ b/src/etc/man/cargo-tree.1 @@ -69,6 +69,12 @@ flag can be used to display the package's reverse dependencies only with the subtree of the package given to \fB\-p\fR\&. .RE .sp +\fB\-\-depth\fR \fIdepth\fR +.RS 4 +Maximum display depth of the dependency tree. A depth of 1 displays the direct +dependencies, for example. +.RE +.sp \fB\-\-no\-dedupe\fR .RS 4 Do not de\-duplicate repeated dependencies. Usually, when a package has already