Skip to content

Commit

Permalink
bootstrap: improve error recovery flags to curl
Browse files Browse the repository at this point in the history
alternative to rust-lang#128459

fixes rust-lang#110178
  • Loading branch information
binarycat committed Aug 15, 2024
1 parent 899eb03 commit ac8a698
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/bootstrap/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ def get(base, url, path, checksums, verbose=False):
eprint("removing", temp_path)
os.unlink(temp_path)

def curl_version():
return re.match("^curl ([0-9]+\\.[0-9]+)", run(["curl", "-V"]))[1]

def download(path, url, probably_big, verbose):
for _ in range(4):
Expand Down Expand Up @@ -107,11 +109,15 @@ def _download(path, url, probably_big, verbose, exception):
# If curl is not present on Win32, we should not sys.exit
# but raise `CalledProcessError` or `OSError` instead
require(["curl", "--version"], exception=platform_is_win32())
run(["curl", option,
extra_flags = []
if curl_version() > 7.70:
extra_flags = [ "--retry-all-errors" ]
run(["curl", option] + extra_flags + [
"-L", # Follow redirect.
"-y", "30", "-Y", "10", # timeout if speed is < 10 bytes/sec for > 30 seconds
"--connect-timeout", "30", # timeout if cannot connect within 30 seconds
"-o", path,
"--continue-at", "-",
"--retry", "3", "-SRf", url],
verbose=verbose,
exception=True, # Will raise RuntimeError on failure
Expand Down
15 changes: 15 additions & 0 deletions src/bootstrap/src/core/download.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,15 @@ fn try_run(config: &Config, cmd: &mut Command) -> Result<(), ()> {
config.try_run(cmd)
}

fn curl_version() -> f32 {
let mut curl = Command::new("curl");
curl.arg("-V");
let Ok(out) = curl.output() else { return 0.0 };
let out = out.stdout;
let Some(i) = out[5..].iter().position(|&x| x == b' ') else { return 0.0 };
std::str::from_utf8(&out[5..i + 5]).unwrap().parse().unwrap_or(0.0)
}

/// Generic helpers that are useful anywhere in bootstrap.
impl Config {
pub fn is_verbose(&self) -> bool {
Expand Down Expand Up @@ -219,6 +228,8 @@ impl Config {
"30", // timeout if cannot connect within 30 seconds
"-o",
tempfile.to_str().unwrap(),
"--continue-at",
"-",
"--retry",
"3",
"-SRf",
Expand All @@ -229,6 +240,10 @@ impl Config {
} else {
curl.arg("--progress-bar");
}
// --retry-all-errors was added in 7.71.0, don't use it if curl is old.
if curl_version() > 7.70 {
curl.arg("--retry-all-errors");
}
curl.arg(url);
if !self.check_run(&mut curl) {
if self.build.contains("windows-msvc") {
Expand Down

0 comments on commit ac8a698

Please sign in to comment.