diff --git a/src/cargo/ops/tree/format/mod.rs b/src/cargo/ops/tree/format/mod.rs index eef9cba1f77..b746fb98488 100644 --- a/src/cargo/ops/tree/format/mod.rs +++ b/src/cargo/ops/tree/format/mod.rs @@ -1,7 +1,9 @@ +use std::fmt; + +use anyhow::{bail, Error}; + use self::parse::{Parser, RawChunk}; use super::{Graph, Node}; -use anyhow::{bail, Error}; -use std::fmt; mod parse; @@ -11,6 +13,7 @@ enum Chunk { License, Repository, Features, + LibName, } pub struct Pattern(Vec); @@ -26,6 +29,7 @@ impl Pattern { RawChunk::Argument("l") => Chunk::License, RawChunk::Argument("r") => Chunk::Repository, RawChunk::Argument("f") => Chunk::Features, + RawChunk::Argument("lib") => Chunk::LibName, RawChunk::Argument(a) => { bail!("unsupported pattern `{}`", a); } @@ -97,6 +101,16 @@ impl<'a> fmt::Display for Display<'a> { Chunk::Features => { write!(fmt, "{}", features.join(","))?; } + Chunk::LibName => { + if let Some(target) = package + .manifest() + .targets() + .iter() + .find(|target| target.is_lib()) + { + write!(fmt, "{}", target.crate_name())?; + } + } } } } diff --git a/src/doc/man/cargo-tree.md b/src/doc/man/cargo-tree.md index e8d4397938b..7a6a8de6b27 100644 --- a/src/doc/man/cargo-tree.md +++ b/src/doc/man/cargo-tree.md @@ -145,6 +145,7 @@ strings will be replaced with the corresponding value: - `{l}` — The package license. - `{r}` — The package repository URL. - `{f}` — Comma-separated list of package features that are enabled. +- `{lib}` — The name, as used in a `use` statement, of the package's library. {{/option}} {{#option "`--prefix` _prefix_" }} diff --git a/src/doc/man/generated_txt/cargo-tree.txt b/src/doc/man/generated_txt/cargo-tree.txt index 3928eca014b..2218d540f3f 100644 --- a/src/doc/man/generated_txt/cargo-tree.txt +++ b/src/doc/man/generated_txt/cargo-tree.txt @@ -138,6 +138,9 @@ OPTIONS o {f} — Comma-separated list of package features that are enabled. + o {lib} — The name, as used in a use statement, of the package's + library. + --prefix prefix Sets how each line is displayed. The prefix value can be one of: diff --git a/src/doc/src/commands/cargo-tree.md b/src/doc/src/commands/cargo-tree.md index 16b82f538fb..bc9a0b15872 100644 --- a/src/doc/src/commands/cargo-tree.md +++ b/src/doc/src/commands/cargo-tree.md @@ -145,6 +145,7 @@ strings will be replaced with the corresponding value:

  • {l} — The package license.
  • {r} — The package repository URL.
  • {f} — Comma-separated list of package features that are enabled.
  • +
  • {lib} — The name, as used in a use statement, of the package's library.
  • diff --git a/src/etc/man/cargo-tree.1 b/src/etc/man/cargo-tree.1 index e2967e7c753..ceefe73ef32 100644 --- a/src/etc/man/cargo-tree.1 +++ b/src/etc/man/cargo-tree.1 @@ -186,6 +186,10 @@ strings will be replaced with the corresponding value: .RS 4 \h'-04'\(bu\h'+02'\fB{f}\fR \[em] Comma\-separated list of package features that are enabled. .RE +.sp +.RS 4 +\h'-04'\(bu\h'+02'\fB{lib}\fR \[em] The name, as used in a \fBuse\fR statement, of the package's library. +.RE .RE .sp \fB\-\-prefix\fR \fIprefix\fR diff --git a/tests/testsuite/tree.rs b/tests/testsuite/tree.rs index acb727b64cf..badfef90505 100644 --- a/tests/testsuite/tree.rs +++ b/tests/testsuite/tree.rs @@ -1009,6 +1009,23 @@ foo v0.1.0 ([..]/foo) #[cargo_test] fn format() { Package::new("dep", "1.0.0").publish(); + Package::new("other-dep", "1.0.0").publish(); + + Package::new("dep_that_is_awesome", "1.0.0") + .file( + "Cargo.toml", + r#" + [package] + name = "dep_that_is_awesome" + version = "1.0.0" + + [lib] + name = "awesome_dep" + "#, + ) + .file("src/lib.rs", "pub struct Straw;") + .publish(); + let p = project() .file( "Cargo.toml", @@ -1021,6 +1038,9 @@ fn format() { [dependencies] dep = {version="1.0", optional=true} + other-dep = {version="1.0", optional=true} + dep_that_is_awesome = {version="1.0", optional=true} + [features] default = ["foo"] @@ -1028,7 +1048,7 @@ fn format() { bar = [] "#, ) - .file("src/lib.rs", "") + .file("src/main.rs", "") .build(); p.cargo("tree --format <<<{p}>>>") @@ -1065,8 +1085,21 @@ Caused by: .arg("{p} [{f}]") .with_stdout( "\ -foo v0.1.0 ([..]/foo) [bar,default,dep,foo] -└── dep v1.0.0 [] +foo v0.1.0 ([..]/foo) [bar,default,dep,dep_that_is_awesome,foo,other-dep] +├── dep v1.0.0 [] +├── dep_that_is_awesome v1.0.0 [] +└── other-dep v1.0.0 [] +", + ) + .run(); + + p.cargo("tree") + .arg("--features=other-dep,dep_that_is_awesome") + .arg("--format={lib}") + .with_stdout( + " +├── awesome_dep +└── other_dep ", ) .run();