1 use std::path::PathBuf;
2 use std::process::Command;
4 use build_helper::output;
5 use serde::Deserialize;
7 use crate::cache::INTERNER;
8 use crate::{Build, Crate};
10 #[derive(Deserialize)]
12 packages: Vec<Package>,
15 #[derive(Deserialize)]
19 source: Option<String>,
20 manifest_path: String,
21 dependencies: Vec<Dependency>,
24 #[derive(Deserialize)]
27 source: Option<String>,
30 pub fn build(build: &mut Build) {
31 // Run `cargo metadata` to figure out what crates we're testing.
32 let mut cargo = Command::new(&build.initial_cargo);
35 .arg("--format-version")
38 .arg("--manifest-path")
39 .arg(build.src.join("Cargo.toml"));
40 let output = output(&mut cargo);
41 let output: Output = serde_json::from_str(&output).unwrap();
42 for package in output.packages {
43 if package.source.is_none() {
44 let name = INTERNER.intern_string(package.name);
45 let mut path = PathBuf::from(package.manifest_path);
50 .filter(|dep| dep.source.is_none())
51 .map(|dep| INTERNER.intern_string(dep.name))
53 build.crates.insert(name, Crate { name, id: package.id, deps, path });