]> git.lizzy.rs Git - rust.git/blob - src/bootstrap/metadata.rs
Rollup merge of #89422 - GuillaumeGomez:doctest-whitespace-name, r=CraftSpider
[rust.git] / src / bootstrap / metadata.rs
1 use std::path::PathBuf;
2 use std::process::Command;
3
4 use build_helper::output;
5 use serde::Deserialize;
6
7 use crate::cache::INTERNER;
8 use crate::{Build, Crate};
9
10 #[derive(Deserialize)]
11 struct Output {
12     packages: Vec<Package>,
13 }
14
15 #[derive(Deserialize)]
16 struct Package {
17     id: String,
18     name: String,
19     source: Option<String>,
20     manifest_path: String,
21     dependencies: Vec<Dependency>,
22 }
23
24 #[derive(Deserialize)]
25 struct Dependency {
26     name: String,
27     source: Option<String>,
28 }
29
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);
33     cargo
34         .arg("metadata")
35         .arg("--format-version")
36         .arg("1")
37         .arg("--no-deps")
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);
46             path.pop();
47             let deps = package
48                 .dependencies
49                 .into_iter()
50                 .filter(|dep| dep.source.is_none())
51                 .map(|dep| INTERNER.intern_string(dep.name))
52                 .collect();
53             build.crates.insert(name, Crate { name, id: package.id, deps, path });
54         }
55     }
56 }