Skip to content

Commit dbab595

Browse files
generate-copyright: use cargo-metadata
1 parent 56f8479 commit dbab595

File tree

3 files changed

+20
-62
lines changed

3 files changed

+20
-62
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,6 +1406,7 @@ name = "generate-copyright"
14061406
version = "0.1.0"
14071407
dependencies = [
14081408
"anyhow",
1409+
"cargo_metadata 0.18.1",
14091410
"serde",
14101411
"serde_json",
14111412
"tempfile",

src/tools/generate-copyright/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ serde = { version = "1.0.147", features = ["derive"] }
1212
serde_json = "1.0.85"
1313
thiserror = "1"
1414
tempfile = "3"
15+
cargo_metadata = "0.18.1"

src/tools/generate-copyright/src/cargo_metadata.rs

Lines changed: 18 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,10 @@ use std::path::Path;
77
/// Describes how this module can fail
88
#[derive(Debug, thiserror::Error)]
99
pub enum Error {
10-
#[error("Failed to run cargo metadata: {0:?}")]
11-
LaunchingMetadata(#[from] std::io::Error),
12-
#[error("Failed get output from cargo metadata: {0:?}")]
13-
GettingMetadata(String),
14-
#[error("Failed parse JSON output from cargo metadata: {0:?}")]
15-
ParsingJson(#[from] serde_json::Error),
16-
#[error("Failed find expected JSON element {0} in output from cargo metadata")]
17-
MissingJsonElement(&'static str),
18-
#[error("Failed find expected JSON element {0} in output from cargo metadata for package {1}")]
19-
MissingJsonElementForPackage(String, String),
10+
#[error("I/O Error: {0:?}")]
11+
Io(#[from] std::io::Error),
12+
#[error("Failed get output from cargo-metadata: {0:?}")]
13+
GettingMetadata(#[from] cargo_metadata::Error),
2014
#[error("Failed to run cargo vendor: {0:?}")]
2115
LaunchingVendor(std::io::Error),
2216
#[error("Failed to complete cargo vendor")]
@@ -88,71 +82,33 @@ pub fn get_metadata(
8882
if manifest_path.file_name() != Some(OsStr::new("Cargo.toml")) {
8983
panic!("cargo_manifest::get requires a path to a Cargo.toml file");
9084
}
91-
let metadata_json = get_metadata_json(cargo, manifest_path)?;
92-
let packages = metadata_json["packages"]
93-
.as_array()
94-
.ok_or_else(|| Error::MissingJsonElement("packages array"))?;
95-
for package in packages {
96-
let package =
97-
package.as_object().ok_or_else(|| Error::MissingJsonElement("package object"))?;
98-
let manifest_path = package
99-
.get("manifest_path")
100-
.and_then(|v| v.as_str())
101-
.map(Path::new)
102-
.ok_or_else(|| Error::MissingJsonElement("package.manifest_path"))?;
85+
let metadata = cargo_metadata::MetadataCommand::new()
86+
.cargo_path(cargo)
87+
.env("RUSTC_BOOTSTRAP", "1")
88+
.manifest_path(manifest_path)
89+
.exec()?;
90+
for package in metadata.packages {
91+
let manifest_path = package.manifest_path.as_path();
10392
if manifest_path.starts_with(root_path) {
10493
// it's an in-tree dependency and reuse covers it
10594
continue;
10695
}
10796
// otherwise it's an out-of-tree dependency
108-
let get_string = |field_name: &str, package_name: &str| {
109-
package.get(field_name).and_then(|v| v.as_str()).ok_or_else(|| {
110-
Error::MissingJsonElementForPackage(
111-
format!("package.{field_name}"),
112-
package_name.to_owned(),
113-
)
114-
})
115-
};
116-
let name = get_string("name", "unknown")?;
117-
let license = get_string("license", name)?;
118-
let version = get_string("version", name)?;
119-
let authors_list = package
120-
.get("authors")
121-
.and_then(|v| v.as_array())
122-
.ok_or_else(|| Error::MissingJsonElement("package.authors"))?;
123-
let authors: Vec<String> =
124-
authors_list.iter().filter_map(|v| v.as_str()).map(|s| s.to_owned()).collect();
125-
let package = Package { name: name.to_owned(), version: version.to_owned() };
97+
let package_id = Package { name: package.name, version: package.version.to_string() };
12698
output.insert(
127-
package.clone(),
128-
PackageMetadata { license: license.to_owned(), authors, notices: BTreeMap::new() },
99+
package_id,
100+
PackageMetadata {
101+
license: package.license.unwrap_or_else(|| String::from("Unspecified")),
102+
authors: package.authors,
103+
notices: BTreeMap::new(),
104+
},
129105
);
130106
}
131107
}
132108

133109
Ok(output)
134110
}
135111

136-
/// Get cargo-metdata for a package, as JSON
137-
fn get_metadata_json(cargo: &Path, manifest_path: &Path) -> Result<serde_json::Value, Error> {
138-
let metadata_output = std::process::Command::new(cargo)
139-
.arg("metadata")
140-
.arg("--format-version=1")
141-
.arg("--all-features")
142-
.arg("--manifest-path")
143-
.arg(manifest_path)
144-
.env("RUSTC_BOOTSTRAP", "1")
145-
.output()
146-
.map_err(Error::LaunchingMetadata)?;
147-
if !metadata_output.status.success() {
148-
return Err(Error::GettingMetadata(
149-
String::from_utf8(metadata_output.stderr).expect("UTF-8 output from cargo"),
150-
));
151-
}
152-
let json = serde_json::from_slice(&metadata_output.stdout)?;
153-
Ok(json)
154-
}
155-
156112
/// Run cargo-vendor, fetching into the given dir
157113
fn run_cargo_vendor(cargo: &Path, dest: &Path, manifest_paths: &[&Path]) -> Result<(), Error> {
158114
let mut vendor_command = std::process::Command::new(cargo);

0 commit comments

Comments
 (0)