Skip to content

Commit 61e204f

Browse files
committed
Give a better error message when the CI download fails
1 parent c485ee7 commit 61e204f

File tree

1 file changed

+115
-8
lines changed

1 file changed

+115
-8
lines changed

src/bootstrap/src/core/download.rs

+115-8
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use std::{
66
path::{Path, PathBuf},
77
process::{Command, Stdio},
88
sync::OnceLock,
9+
time::SystemTime,
910
};
1011

11-
use build_helper::ci::CiEnv;
12+
use build_helper::{ci::CiEnv, git, git::GitConfig};
1213
use xz2::bufread::XzDecoder;
1314

1415
use crate::core::config::RustfmtMetadata;
@@ -194,7 +195,7 @@ impl Config {
194195
let _ = try_run(self, patchelf.arg(fname));
195196
}
196197

197-
fn download_file(&self, url: &str, dest_path: &Path, help_on_error: &str) {
198+
fn download_file(&self, url: &str, dest_path: &Path, help_on_error: &str, commit: &String) {
198199
self.verbose(&format!("download {url}"));
199200
// Use a temporary file in case we crash while downloading, to avoid a corrupt download in cache/.
200201
let tempfile = self.tempdir().join(dest_path.file_name().unwrap());
@@ -203,7 +204,7 @@ impl Config {
203204
// protocols without worrying about merge conflicts if we change the HTTP implementation.
204205
match url.split_once("://").map(|(proto, _)| proto) {
205206
Some("http") | Some("https") => {
206-
self.download_http_with_retries(&tempfile, url, help_on_error)
207+
self.download_http_with_retries(&tempfile, url, help_on_error, commit)
207208
}
208209
Some(other) => panic!("unsupported protocol {other} in {url}"),
209210
None => panic!("no protocol in {url}"),
@@ -214,7 +215,13 @@ impl Config {
214215
);
215216
}
216217

217-
fn download_http_with_retries(&self, tempfile: &Path, url: &str, help_on_error: &str) {
218+
fn download_http_with_retries(
219+
&self,
220+
tempfile: &Path,
221+
url: &str,
222+
help_on_error: &str,
223+
commit: &String,
224+
) {
218225
println!("downloading {url}");
219226
// Try curl. If that fails and we are on windows, fallback to PowerShell.
220227
let mut curl = Command::new("curl");
@@ -250,19 +257,114 @@ impl Config {
250257
"(New-Object System.Net.WebClient).DownloadFile('{}', '{}')",
251258
url, tempfile.to_str().expect("invalid UTF-8 not supported with powershell downloads"),
252259
),
253-
])).is_err() {
260+
])).is_ok() {
254261
return;
255262
}
256263
eprintln!("\nspurious failure, trying again");
257264
}
258265
}
259266
if !help_on_error.is_empty() {
260267
eprintln!("{help_on_error}");
268+
Self::check_outdated(commit);
261269
}
262270
crate::exit!(1);
263271
}
264272
}
265273

274+
fn check_outdated(commit: &String) {
275+
let check_outdated_msg = || {
276+
if !commit.is_empty() {
277+
let build_date: String = Command::new("git")
278+
.arg("show")
279+
.arg("-s")
280+
.arg("--format=%ar")
281+
.arg(commit)
282+
.output()
283+
.unwrap()
284+
.stdout
285+
.into_iter()
286+
.map(|c| c as char)
287+
.collect();
288+
if build_date.is_empty() {
289+
eprintln!("NOTE: trying to download builds for {}", commit);
290+
} else {
291+
eprintln!(
292+
"NOTE: trying to download builds for {}, but it is from {}",
293+
commit, build_date
294+
);
295+
}
296+
} else {
297+
eprintln!("NOTE: you seem to have an outdated version of rust source");
298+
}
299+
};
300+
301+
let user: String = Command::new("git")
302+
.arg("config")
303+
.arg("user.name")
304+
.output()
305+
.expect("Failed to get git user.name")
306+
.stdout
307+
.into_iter()
308+
.map(|c| c as char)
309+
.collect();
310+
let upstream = git::get_rust_lang_rust_remote(
311+
&GitConfig { git_repository: "rust-lang/rust.git", nightly_branch: "" },
312+
None,
313+
);
314+
match upstream {
315+
Ok(upstream) => {
316+
let log: String = Command::new("git")
317+
.arg("log")
318+
.arg("--pretty=short")
319+
.arg(format!("{}/master..HEAD", upstream))
320+
.output()
321+
.expect("Failed to get git log")
322+
.stdout
323+
.into_iter()
324+
.map(|c| c as char)
325+
.collect();
326+
for s in log.split("\n") {
327+
if s.contains("Author:") {
328+
if !s.contains(&format!("Author: {}", user.replace("\n", ""))) {
329+
check_outdated_msg();
330+
return;
331+
}
332+
}
333+
}
334+
}
335+
Err(e) => eprintln!("{}", e),
336+
}
337+
let last_commit: String = Command::new("git")
338+
.arg("show")
339+
.arg("-s")
340+
.arg("--date=short")
341+
.arg("--format=%ct")
342+
.arg("origin/master")
343+
.output()
344+
.expect("Failed to get git log")
345+
.stdout
346+
.into_iter()
347+
.map(|c| c as char)
348+
.collect();
349+
match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
350+
Ok(n) => {
351+
let replaced = last_commit.replace("\n", "");
352+
let diff = n.as_secs() - replaced.parse::<u64>().unwrap();
353+
if diff >= 165 * 24 * 60 * 60 {
354+
// origin/master is more than 165 days out of date, CI builds disappear in 168 days
355+
eprintln!(
356+
"NOTE: origin/master is {} days out of date, CI builds disappear in 168 days.",
357+
diff / (24 * 60 * 60)
358+
);
359+
eprintln!("HELP: Consider updating your fork of the rust sources");
360+
return;
361+
}
362+
}
363+
Err(_) => panic!("SystemTime before UNIX EPOCH!"),
364+
}
365+
return;
366+
}
367+
266368
fn unpack(&self, tarball: &Path, dst: &Path, pattern: &str) {
267369
eprintln!("extracting {} to {}", tarball.display(), dst.display());
268370
if !dst.exists() {
@@ -492,7 +594,7 @@ impl Config {
492594
let extra_components = ["cargo"];
493595

494596
let download_beta_component = |config: &Config, filename, prefix: &_, date: &_| {
495-
config.download_component(DownloadSource::Dist, filename, prefix, date, "stage0")
597+
config.download_component(DownloadSource::Dist, filename, prefix, date, "stage0");
496598
};
497599

498600
self.download_toolchain(
@@ -648,7 +750,7 @@ HELP: if trying to compile an old commit of rustc, disable `download-rustc` in c
648750
download-rustc = false
649751
";
650752
}
651-
self.download_file(&format!("{base_url}/{url}"), &tarball, help_on_error);
753+
self.download_file(&format!("{base_url}/{url}"), &tarball, help_on_error, &key.to_string());
652754
if let Some(sha256) = checksum {
653755
if !self.verify(&tarball, sha256) {
654756
panic!("failed to verify {}", tarball.display());
@@ -726,7 +828,12 @@ download-rustc = false
726828
[llvm]
727829
download-ci-llvm = false
728830
";
729-
self.download_file(&format!("{base}/{llvm_sha}/{filename}"), &tarball, help_on_error);
831+
self.download_file(
832+
&format!("{base}/{llvm_sha}/{filename}"),
833+
&tarball,
834+
help_on_error,
835+
&llvm_sha.to_string(),
836+
);
730837
}
731838
let llvm_root = self.ci_llvm_root();
732839
self.unpack(&tarball, &llvm_root, "rust-dev");

0 commit comments

Comments
 (0)