Skip to content

Commit 3952e2d

Browse files
committed
feat(tree): Add --depth public impl
1 parent 224222e commit 3952e2d

File tree

4 files changed

+36
-21
lines changed

4 files changed

+36
-21
lines changed

src/cargo/ops/tree/graph.rs

+18-1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ impl Node {
7878
pub struct Edge {
7979
kind: EdgeKind,
8080
node: NodeId,
81+
public: bool,
8182
}
8283

8384
impl Edge {
@@ -88,6 +89,10 @@ impl Edge {
8889
pub fn node(&self) -> NodeId {
8990
self.node
9091
}
92+
93+
pub fn public(&self) -> bool {
94+
self.public
95+
}
9196
}
9297

9398
/// The kind of edge, for separating dependencies into different sections.
@@ -105,7 +110,7 @@ pub enum EdgeKind {
105110
///
106111
/// The value is a `Vec` because each edge kind can have multiple outgoing
107112
/// edges. For example, package "foo" can have multiple normal dependencies.
108-
#[derive(Clone)]
113+
#[derive(Clone, Debug)]
109114
struct Edges(HashMap<EdgeKind, Vec<Edge>>);
110115

111116
impl Edges {
@@ -135,6 +140,7 @@ impl Edges {
135140
}
136141

137142
/// A graph of dependencies.
143+
#[derive(Debug)]
138144
pub struct Graph<'a> {
139145
nodes: Vec<Node>,
140146
/// The indexes of `edges` correspond to the `nodes`. That is, `edges[0]`
@@ -268,6 +274,7 @@ impl<'a> Graph<'a> {
268274
let new_edge = Edge {
269275
kind: edge.kind(),
270276
node: new_to_index,
277+
public: edge.public(),
271278
};
272279
new_graph.edges_mut(new_from).add_edge(new_edge);
273280
}
@@ -290,6 +297,7 @@ impl<'a> Graph<'a> {
290297
let new_edge = Edge {
291298
kind: edge.kind(),
292299
node: NodeId::new(from_idx, self.nodes[from_idx].name()),
300+
public: edge.public(),
293301
};
294302
new_edges[edge.node().index].add_edge(new_edge);
295303
}
@@ -514,6 +522,7 @@ fn add_pkg(
514522
let new_edge = Edge {
515523
kind: EdgeKind::Dep(dep.kind()),
516524
node: dep_index,
525+
public: dep.is_public(),
517526
};
518527
if opts.graph_features {
519528
// Add the dependency node with feature nodes in-between.
@@ -577,12 +586,14 @@ fn add_feature(
577586
let from_edge = Edge {
578587
kind: to.kind(),
579588
node: node_index,
589+
public: to.public(),
580590
};
581591
graph.edges_mut(from).add_edge(from_edge);
582592
}
583593
let to_edge = Edge {
584594
kind: EdgeKind::Feature,
585595
node: to.node(),
596+
public: true,
586597
};
587598
graph.edges_mut(node_index).add_edge(to_edge);
588599
(missing, node_index)
@@ -620,6 +631,7 @@ fn add_cli_features(
620631
let feature_edge = Edge {
621632
kind: EdgeKind::Feature,
622633
node: package_index,
634+
public: true,
623635
};
624636
let index = add_feature(graph, feature, None, feature_edge).1;
625637
graph.cli_features.insert(index);
@@ -654,13 +666,15 @@ fn add_cli_features(
654666
let feature_edge = Edge {
655667
kind: EdgeKind::Feature,
656668
node: package_index,
669+
public: true,
657670
};
658671
let index = add_feature(graph, dep_name, None, feature_edge).1;
659672
graph.cli_features.insert(index);
660673
}
661674
let dep_edge = Edge {
662675
kind: EdgeKind::Feature,
663676
node: dep_index,
677+
public: true,
664678
};
665679
let index = add_feature(graph, dep_feature, None, dep_edge).1;
666680
graph.cli_features.insert(index);
@@ -721,6 +735,7 @@ fn add_feature_rec(
721735
let feature_edge = Edge {
722736
kind: EdgeKind::Feature,
723737
node: package_index,
738+
public: true,
724739
};
725740
let (missing, feat_index) = add_feature(graph, *dep_name, Some(from), feature_edge);
726741
// Don't recursive if the edge already exists to deal with cycles.
@@ -771,12 +786,14 @@ fn add_feature_rec(
771786
let feature_edge = Edge {
772787
kind: EdgeKind::Feature,
773788
node: package_index,
789+
public: true,
774790
};
775791
add_feature(graph, *dep_name, Some(from), feature_edge);
776792
}
777793
let dep_edge = Edge {
778794
kind: EdgeKind::Feature,
779795
node: dep_index,
796+
public: true,
780797
};
781798
let (missing, feat_index) =
782799
add_feature(graph, *dep_feature, Some(from), dep_edge);

src/cargo/ops/tree/mod.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -419,14 +419,14 @@ fn print_dependencies<'a>(
419419
}
420420
}
421421

422-
let (max_display_depth, filter_non_workspace_member) = match display_depth {
423-
DisplayDepth::MaxDisplayDepth(max) => (max, false),
424-
DisplayDepth::Workspace => (u32::MAX, true),
422+
let (max_display_depth, filter_non_workspace_member, filter_private) = match display_depth {
423+
DisplayDepth::MaxDisplayDepth(max) => (max, false, false),
424+
DisplayDepth::Workspace => (u32::MAX, true, false),
425425
DisplayDepth::Public => {
426426
if !ws.gctx().cli_unstable().unstable_options {
427427
anyhow::bail!("`--depth public` requires `-Zunstable-options`")
428428
}
429-
(u32::MAX, false)
429+
(u32::MAX, false, true)
430430
}
431431
};
432432

@@ -444,9 +444,17 @@ fn print_dependencies<'a>(
444444
if filter_non_workspace_member && !ws.is_member_id(*package_id) {
445445
return false;
446446
}
447+
if filter_private && !dep.public() {
448+
return false;
449+
}
447450
!pkgs_to_prune.iter().any(|spec| spec.matches(*package_id))
448451
}
449-
_ => true,
452+
Node::Feature { .. } => {
453+
if filter_private && !dep.public() {
454+
return false;
455+
}
456+
true
457+
}
450458
}
451459
})
452460
.peekable();

tests/testsuite/cargo_tree/deps.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -1987,7 +1987,6 @@ left-pub v0.1.0 ([ROOT]/foo/left-pub)
19871987
.masquerade_as_nightly_cargo(&["public-dependency", "depth-public"])
19881988
.with_stdout_data(str![[r#"
19891989
right-priv v0.1.0 ([ROOT]/foo/right-priv)
1990-
└── dep v0.1.0 ([ROOT]/foo/dep)
19911990
19921991
"#]])
19931992
.run();
@@ -2000,7 +1999,6 @@ diamond v0.1.0 ([ROOT]/foo/diamond)
20001999
├── left-pub v0.1.0 ([ROOT]/foo/left-pub)
20012000
│ └── dep v0.1.0 ([ROOT]/foo/dep)
20022001
└── right-priv v0.1.0 ([ROOT]/foo/right-priv)
2003-
└── dep v0.1.0 ([ROOT]/foo/dep)
20042002
20052003
"#]])
20062004
.run();
@@ -2015,7 +2013,6 @@ diamond v0.1.0 ([ROOT]/foo/diamond)
20152013
├── left-pub v0.1.0 ([ROOT]/foo/left-pub)
20162014
│ └── dep v0.1.0 ([ROOT]/foo/dep)
20172015
└── right-priv v0.1.0 ([ROOT]/foo/right-priv)
2018-
└── dep v0.1.0 ([ROOT]/foo/dep)
20192016
20202017
left-pub v0.1.0 ([ROOT]/foo/left-pub) (*)
20212018
@@ -2029,9 +2026,7 @@ right-priv v0.1.0 ([ROOT]/foo/right-priv) (*)
20292026
.masquerade_as_nightly_cargo(&["public-dependency", "depth-public"])
20302027
.with_stdout_data(str![[r#"
20312028
dep v0.1.0 ([ROOT]/foo/dep)
2032-
├── left-pub v0.1.0 ([ROOT]/foo/left-pub)
2033-
│ └── diamond v0.1.0 ([ROOT]/foo/diamond)
2034-
└── right-priv v0.1.0 ([ROOT]/foo/right-priv)
2029+
└── left-pub v0.1.0 ([ROOT]/foo/left-pub)
20352030
└── diamond v0.1.0 ([ROOT]/foo/diamond)
20362031
20372032
"#]])

tests/testsuite/cargo_tree/features.rs

+4-9
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,6 @@ fn depth_public_no_features() {
379379
.masquerade_as_nightly_cargo(&["public-dependency", "depth-public"])
380380
.with_stdout_data(str![[r#"
381381
foo v0.1.0 ([ROOT]/foo)
382-
├── priv-defaultdep feature "default"
383-
│ └── priv-defaultdep v1.0.0
384382
└── pub-defaultdep feature "default"
385383
└── pub-defaultdep v1.0.0
386384
@@ -432,10 +430,6 @@ fn depth_public_transitive_features() {
432430
foo v0.1.0 ([ROOT]/foo)
433431
├── priv-defaultdep feature "default"
434432
│ ├── priv-defaultdep v1.0.0
435-
│ │ └── optdep feature "default"
436-
│ │ ├── optdep v1.0.0
437-
│ │ └── optdep feature "f"
438-
│ │ └── optdep v1.0.0
439433
│ └── priv-defaultdep feature "f1"
440434
│ ├── priv-defaultdep v1.0.0 (*)
441435
│ └── priv-defaultdep feature "f2"
@@ -444,7 +438,10 @@ foo v0.1.0 ([ROOT]/foo)
444438
│ └── priv-defaultdep v1.0.0 (*)
445439
└── pub-defaultdep feature "default"
446440
├── pub-defaultdep v1.0.0
447-
│ └── optdep feature "default" (*)
441+
│ └── optdep feature "default"
442+
│ ├── optdep v1.0.0
443+
│ └── optdep feature "f"
444+
│ └── optdep v1.0.0
448445
└── pub-defaultdep feature "f1"
449446
├── pub-defaultdep v1.0.0 (*)
450447
└── pub-defaultdep feature "f2"
@@ -510,8 +507,6 @@ foo v0.1.0 ([ROOT]/foo)
510507
.masquerade_as_nightly_cargo(&["public-dependency", "depth-public"])
511508
.with_stdout_data(str![[r#"
512509
foo v0.1.0 ([ROOT]/foo)
513-
└── priv feature "default"
514-
└── priv v1.0.0
515510
516511
"#]])
517512
.run();

0 commit comments

Comments
 (0)