Skip to content

Commit cb9fc00

Browse files
support multiple target crates, publish parse
1 parent d283483 commit cb9fc00

File tree

1 file changed

+61
-21
lines changed

1 file changed

+61
-21
lines changed

src/main.rs

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,25 @@ fn main() {
3232
download_src(&tmpdir, &commit);
3333
}
3434

35-
println!("learning about the dependency graph");
36-
let metadata = Command::new("cargo")
37-
.arg("+nightly")
38-
.current_dir(dst.join("src/libsyntax"))
39-
.arg("metadata")
40-
.arg("--format-version=1")
41-
.output()
42-
.expect("failed to execute cargo");
43-
if !metadata.status.success() {
44-
panic!("failed to run rustc: {:?}", metadata);
45-
}
46-
let output = str::from_utf8(&metadata.stdout).unwrap();
47-
let output: Metadata = serde_json::from_str(output).unwrap();
48-
49-
let syntax = output
50-
.packages
51-
.iter()
52-
.find(|p| p.name == "syntax")
53-
.expect("failed to find libsyntax");
35+
let target_crates = vec![
36+
RustcApCrate {
37+
name: "syntax",
38+
dir: "src/libsyntax",
39+
},
40+
RustcApCrate {
41+
name: "rustc_parse",
42+
dir: "src/librustc_parse",
43+
},
44+
];
5445

46+
println!("learning about the dependency graph");
47+
let rustc_packages = get_rustc_packages(&target_crates, &dst);
5548
let mut crates = Vec::new();
56-
fill(&output, &syntax, &mut crates, &mut HashSet::new());
49+
let mut seen = HashSet::new();
50+
51+
for RustcPackageInfo { package, metadata } in rustc_packages.iter() {
52+
fill(&metadata, &package, &mut crates, &mut seen);
53+
}
5754

5855
let version_to_publish = get_version_to_publish(&crates);
5956
println!("going to publish {}", version_to_publish);
@@ -127,6 +124,39 @@ fn download_src(dst: &Path, commit: &str) {
127124
File::create(&root.join(".ok")).unwrap();
128125
}
129126

127+
fn get_rustc_packages(target_crates: &[RustcApCrate], dst: &Path) -> Vec<RustcPackageInfo> {
128+
let mut packages = Vec::new();
129+
130+
for RustcApCrate { name, dir } in target_crates.iter() {
131+
let metadata = Command::new("cargo")
132+
.arg("+nightly")
133+
.current_dir(dst.join(dir))
134+
.arg("metadata")
135+
.arg("--format-version=1")
136+
.output()
137+
.expect("failed to execute cargo");
138+
if !metadata.status.success() {
139+
panic!("failed to run rustc: {:?}", metadata);
140+
}
141+
let output = str::from_utf8(&metadata.stdout).unwrap();
142+
let output: Metadata = serde_json::from_str(output).unwrap();
143+
144+
let rustc_package = output
145+
.packages
146+
.iter()
147+
.find(|p| p.name == *name)
148+
.expect(&format!("failed to find {}", &name))
149+
.clone();
150+
151+
packages.push(RustcPackageInfo {
152+
package: rustc_package,
153+
metadata: output,
154+
})
155+
}
156+
157+
packages
158+
}
159+
130160
fn fill<'a>(
131161
output: &'a Metadata,
132162
pkg: &'a Package,
@@ -157,7 +187,7 @@ struct Metadata {
157187
resolve: Resolve,
158188
}
159189

160-
#[derive(Deserialize)]
190+
#[derive(Deserialize, Clone)]
161191
struct Package {
162192
id: String,
163193
name: String,
@@ -176,6 +206,16 @@ struct ResolveNode {
176206
dependencies: Vec<String>,
177207
}
178208

209+
struct RustcApCrate<'a> {
210+
name: &'a str,
211+
dir: &'a str,
212+
}
213+
214+
struct RustcPackageInfo {
215+
package: Package,
216+
metadata: Metadata,
217+
}
218+
179219
fn get_version_to_publish(crates: &[&Package]) -> semver::Version {
180220
let mut cur = crates.iter().map(|p| get_current_version(p)).max().unwrap();
181221
cur.major += 1;

0 commit comments

Comments
 (0)