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();