Skip to content

Commit 8a26050

Browse files
committed
feat: include public/private dependency status in cargo metadata output
1 parent 8578718 commit 8a26050

File tree

5 files changed

+41
-10
lines changed

5 files changed

+41
-10
lines changed

src/bin/cargo/commands/read_manifest.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ 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().print_json(
19+
&ws.current()?
20+
.serialized(gctx.cli_unstable(), ws.unstable_features()),
21+
)?;
1922
Ok(())
2023
}

src/cargo/core/dependency.rs

Lines changed: 19 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, Feature, Features, 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,11 @@ impl Dependency {
158164
}
159165
}
160166

161-
pub fn serialized(&self) -> SerializedDependency {
167+
pub fn serialized(
168+
&self,
169+
unstable_flags: &CliUnstable,
170+
features: &Features,
171+
) -> SerializedDependency {
162172
SerializedDependency {
163173
name: self.package_name(),
164174
source: self.source_id(),
@@ -172,6 +182,13 @@ impl Dependency {
172182
registry: self.registry_id().as_ref().map(|sid| sid.url().to_string()),
173183
path: self.source_id().local_path(),
174184
artifact: self.inner.artifact.clone(),
185+
public: if unstable_flags.public_dependency
186+
|| features.is_enabled(Feature::public_dependency())
187+
{
188+
Some(self.inner.public)
189+
} else {
190+
None
191+
},
175192
}
176193
}
177194

src/cargo/core/package.rs

Lines changed: 10 additions & 5 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, Features, Manifest, PackageId, PackageIdSpec, SerializedDependency,
27+
SourceId, Target,
2728
};
2829
use crate::core::{Summary, Workspace};
2930
use crate::sources::source::{MaybePackage, SourceMap};
@@ -190,7 +191,11 @@ 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(
195+
&self,
196+
unstable_flags: &CliUnstable,
197+
cargo_features: &Features,
198+
) -> SerializedPackage {
194199
let summary = self.manifest().summary();
195200
let package_id = summary.package_id();
196201
let manmeta = self.manifest().metadata();
@@ -205,7 +210,7 @@ impl Package {
205210
.cloned()
206211
.collect();
207212
// Convert Vec<FeatureValue> to Vec<InternedString>
208-
let features = summary
213+
let crate_features = summary
209214
.features()
210215
.iter()
211216
.map(|(k, v)| {
@@ -229,10 +234,10 @@ impl Package {
229234
dependencies: summary
230235
.dependencies()
231236
.iter()
232-
.map(Dependency::serialized)
237+
.map(|dep| dep.serialized(unstable_flags, cargo_features))
233238
.collect(),
234239
targets,
235-
features,
240+
features: crate_features,
236241
manifest_path: self.manifest_path().to_path_buf(),
237242
metadata: self.manifest().custom_metadata().cloned(),
238243
authors: manmeta.authors.clone(),

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(), ws.unstable_features()))
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(), ws.unstable_features()))
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
@@ -778,6 +778,7 @@ fn cargo_metadata_public_private_dependencies_enabled() {
778778
"kind": null,
779779
"name": "bar",
780780
"optional": false,
781+
"public": false,
781782
"registry": null,
782783
"rename": null,
783784
"req": "*",
@@ -790,6 +791,7 @@ fn cargo_metadata_public_private_dependencies_enabled() {
790791
"kind": null,
791792
"name": "baz",
792793
"optional": false,
794+
"public": false,
793795
"registry": null,
794796
"rename": null,
795797
"req": "*",
@@ -802,6 +804,7 @@ fn cargo_metadata_public_private_dependencies_enabled() {
802804
"kind": null,
803805
"name": "foobar",
804806
"optional": false,
807+
"public": true,
805808
"registry": null,
806809
"rename": null,
807810
"req": "*",

0 commit comments

Comments
 (0)