Skip to content

Commit ba7f5d6

Browse files
committed
feat: include public/private dependency status in cargo metadata output
1 parent 1e2e019 commit ba7f5d6

File tree

5 files changed

+25
-8
lines changed

5 files changed

+25
-8
lines changed

src/bin/cargo/commands/read_manifest.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Deprecated, use `<cyan,bold>cargo metadata --no-deps</>` instead.\
1515

1616
pub fn exec(gctx: &mut GlobalContext, args: &ArgMatches) -> CliResult {
1717
let ws = args.workspace(gctx)?;
18-
gctx.shell().print_json(&ws.current()?.serialized())?;
18+
gctx.shell()
19+
.print_json(&ws.current()?.serialized(gctx.cli_unstable()))?;
1920
Ok(())
2021
}

src/cargo/core/dependency.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::sync::Arc;
99
use tracing::trace;
1010

1111
use crate::core::compiler::{CompileKind, CompileTarget};
12-
use crate::core::{PackageId, SourceId, Summary};
12+
use crate::core::{CliUnstable, PackageId, SourceId, Summary};
1313
use crate::util::errors::CargoResult;
1414
use crate::util::interning::InternedString;
1515
use crate::util::OptVersionReq;
@@ -72,6 +72,12 @@ pub struct SerializedDependency {
7272
/// The file system path for a local path dependency.
7373
#[serde(skip_serializing_if = "Option::is_none")]
7474
path: Option<PathBuf>,
75+
76+
/// `public` flag is unset if `-Zpublic-dependency` is not enabled
77+
///
78+
/// Once that feature is stabilized, `public` will not need to be `Option`
79+
#[serde(skip_serializing_if = "Option::is_none")]
80+
public: Option<bool>,
7581
}
7682

7783
#[derive(PartialEq, Eq, Hash, Ord, PartialOrd, Clone, Debug, Copy)]
@@ -158,7 +164,7 @@ impl Dependency {
158164
}
159165
}
160166

161-
pub fn serialized(&self) -> SerializedDependency {
167+
pub fn serialized(&self, unstable_flags: &CliUnstable) -> SerializedDependency {
162168
SerializedDependency {
163169
name: self.package_name(),
164170
source: self.source_id(),
@@ -172,6 +178,9 @@ impl Dependency {
172178
registry: self.registry_id().as_ref().map(|sid| sid.url().to_string()),
173179
path: self.source_id().local_path(),
174180
artifact: self.inner.artifact.clone(),
181+
public: unstable_flags
182+
.public_dependency
183+
.then_some(self.inner.public),
175184
}
176185
}
177186

src/cargo/core/package.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ use crate::core::dependency::DepKind;
2323
use crate::core::resolver::features::ForceAllTargets;
2424
use crate::core::resolver::{HasDevUnits, Resolve};
2525
use crate::core::{
26-
Dependency, Manifest, PackageId, PackageIdSpec, SerializedDependency, SourceId, Target,
26+
CliUnstable, Dependency, Manifest, PackageId, PackageIdSpec, SerializedDependency, SourceId,
27+
Target,
2728
};
2829
use crate::core::{Summary, Workspace};
2930
use crate::sources::source::{MaybePackage, SourceMap};
@@ -190,7 +191,7 @@ impl Package {
190191
self.targets().iter().any(|t| t.is_example() || t.is_bin())
191192
}
192193

193-
pub fn serialized(&self) -> SerializedPackage {
194+
pub fn serialized(&self, unstable_flags: &CliUnstable) -> SerializedPackage {
194195
let summary = self.manifest().summary();
195196
let package_id = summary.package_id();
196197
let manmeta = self.manifest().metadata();
@@ -229,7 +230,7 @@ impl Package {
229230
dependencies: summary
230231
.dependencies()
231232
.iter()
232-
.map(Dependency::serialized)
233+
.map(|dep| dep.serialized(unstable_flags))
233234
.collect(),
234235
targets,
235236
features,

src/cargo/ops/cargo_output_metadata.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ pub fn output_metadata(ws: &Workspace<'_>, opt: &OutputMetadataOptions) -> Cargo
3333
);
3434
}
3535
let (packages, resolve) = if opt.no_deps {
36-
let packages = ws.members().map(|pkg| pkg.serialized()).collect();
36+
let packages = ws
37+
.members()
38+
.map(|pkg| pkg.serialized(ws.gctx().cli_unstable()))
39+
.collect();
3740
(packages, None)
3841
} else {
3942
let (packages, resolve) = build_resolve_graph(ws, opt)?;
@@ -178,7 +181,7 @@ fn build_resolve_graph(
178181
let actual_packages = package_map
179182
.into_iter()
180183
.filter_map(|(pkg_id, pkg)| node_map.get(&pkg_id).map(|_| pkg))
181-
.map(|pkg| pkg.serialized())
184+
.map(|pkg| pkg.serialized(ws.gctx().cli_unstable()))
182185
.collect();
183186

184187
let mr = MetadataResolve {

tests/testsuite/metadata.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,7 @@ fn cargo_metadata_public_private_dependencies_enabled() {
928928
"kind": null,
929929
"name": "bar",
930930
"optional": false,
931+
"public": false,
931932
"registry": null,
932933
"rename": null,
933934
"req": "*",
@@ -940,6 +941,7 @@ fn cargo_metadata_public_private_dependencies_enabled() {
940941
"kind": null,
941942
"name": "baz",
942943
"optional": false,
944+
"public": false,
943945
"registry": null,
944946
"rename": null,
945947
"req": "*",
@@ -952,6 +954,7 @@ fn cargo_metadata_public_private_dependencies_enabled() {
952954
"kind": null,
953955
"name": "foobar",
954956
"optional": false,
957+
"public": true,
955958
"registry": null,
956959
"rename": null,
957960
"req": "*",

0 commit comments

Comments
 (0)