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