Rollup merge of #129134 - lolbinarycat:continue-at, r=Kobzol
bootstrap: improve error recovery flags to curl alternative to #128459 fixes #110178 r? ````@Kobzol````
This commit is contained in:
commit
8e27d4ce42
2 changed files with 34 additions and 1 deletions
|
@ -79,6 +79,11 @@ def get(base, url, path, checksums, verbose=False):
|
|||
eprint("removing", temp_path)
|
||||
os.unlink(temp_path)
|
||||
|
||||
def curl_version():
|
||||
m = re.match(bytes("^curl ([0-9]+)\\.([0-9]+)", "utf8"), require(["curl", "-V"]))
|
||||
if m is None:
|
||||
return (0, 0)
|
||||
return (int(m[1]), int(m[2]))
|
||||
|
||||
def download(path, url, probably_big, verbose):
|
||||
for _ in range(4):
|
||||
|
@ -107,11 +112,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
|
||||
|
|
|
@ -22,6 +22,24 @@ fn try_run(config: &Config, cmd: &mut Command) -> Result<(), ()> {
|
|||
config.try_run(cmd)
|
||||
}
|
||||
|
||||
fn extract_curl_version(out: &[u8]) -> semver::Version {
|
||||
let out = String::from_utf8_lossy(out);
|
||||
// The output should look like this: "curl <major>.<minor>.<patch> ..."
|
||||
out.lines()
|
||||
.next()
|
||||
.and_then(|line| line.split(" ").nth(1))
|
||||
.and_then(|version| semver::Version::parse(version).ok())
|
||||
.unwrap_or(semver::Version::new(1, 0, 0))
|
||||
}
|
||||
|
||||
fn curl_version() -> semver::Version {
|
||||
let mut curl = Command::new("curl");
|
||||
curl.arg("-V");
|
||||
let Ok(out) = curl.output() else { return semver::Version::new(1, 0, 0) };
|
||||
let out = out.stdout;
|
||||
extract_curl_version(&out)
|
||||
}
|
||||
|
||||
/// Generic helpers that are useful anywhere in bootstrap.
|
||||
impl Config {
|
||||
pub fn is_verbose(&self) -> bool {
|
||||
|
@ -220,6 +238,8 @@ impl Config {
|
|||
"30", // timeout if cannot connect within 30 seconds
|
||||
"-o",
|
||||
tempfile.to_str().unwrap(),
|
||||
"--continue-at",
|
||||
"-",
|
||||
"--retry",
|
||||
"3",
|
||||
"-SRf",
|
||||
|
@ -230,6 +250,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() >= semver::Version::new(7, 71, 0) {
|
||||
curl.arg("--retry-all-errors");
|
||||
}
|
||||
curl.arg(url);
|
||||
if !self.check_run(&mut curl) {
|
||||
if self.build.contains("windows-msvc") {
|
||||
|
|
Loading…
Add table
Reference in a new issue