Skip to content

Commit c8263c2

Browse files
committed
make bootstrap use wget if available
this improves reliability when downloading over unreliable connections.
1 parent 0b5eb7b commit c8263c2

File tree

2 files changed

+38
-18
lines changed

2 files changed

+38
-18
lines changed

src/bootstrap/bootstrap.py

+25-16
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ def eprint(*args, **kwargs):
4444
kwargs["file"] = sys.stderr
4545
print(*args, **kwargs)
4646

47-
4847
def get(base, url, path, checksums, verbose=False):
4948
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
5049
temp_path = temp_file.name
@@ -89,6 +88,8 @@ def download(path, url, probably_big, verbose):
8988
eprint("\nspurious failure, trying again")
9089
_download(path, url, probably_big, verbose, False)
9190

91+
def has_wget():
92+
require(["wget", "--version"], exit=False) != None
9293

9394
def _download(path, url, probably_big, verbose, exception):
9495
# Try to use curl (potentially available on win32
@@ -100,22 +101,29 @@ def _download(path, url, probably_big, verbose, exception):
100101
eprint("downloading {}".format(url))
101102

102103
try:
103-
if (probably_big or verbose) and "GITHUB_ACTIONS" not in os.environ:
104-
option = "-#"
104+
if has_wget():
105+
eprint("using wget!!");
106+
run(["wget", "--show-progress", "-O", path, "url"],
107+
verbose=verbose,
108+
exception=True,
109+
)
105110
else:
106-
option = "-s"
107-
# If curl is not present on Win32, we should not sys.exit
108-
# but raise `CalledProcessError` or `OSError` instead
109-
require(["curl", "--version"], exception=platform_is_win32())
110-
run(["curl", option,
111-
"-L", # Follow redirect.
112-
"-y", "30", "-Y", "10", # timeout if speed is < 10 bytes/sec for > 30 seconds
113-
"--connect-timeout", "30", # timeout if cannot connect within 30 seconds
114-
"-o", path,
115-
"--retry", "3", "-SRf", url],
116-
verbose=verbose,
117-
exception=True, # Will raise RuntimeError on failure
118-
)
111+
if (probably_big or verbose) and "GITHUB_ACTIONS" not in os.environ:
112+
option = "-#"
113+
else:
114+
option = "-s"
115+
# If curl is not present on Win32, we should not sys.exit
116+
# but raise `CalledProcessError` or `OSError` instead
117+
require(["curl", "--version"], exception=platform_is_win32())
118+
run(["curl", option,
119+
"-L", # Follow redirect.
120+
"-y", "30", "-Y", "10", # timeout if speed is < 10 bytes/sec for > 30 seconds
121+
"--connect-timeout", "30", # timeout if cannot connect within 30 seconds
122+
"-o", path,
123+
"--retry", "3", "-SRf", url],
124+
verbose=verbose,
125+
exception=True, # Will raise RuntimeError on failure
126+
)
119127
except (subprocess.CalledProcessError, OSError, RuntimeError):
120128
# see http://serverfault.com/questions/301128/how-to-download
121129
if platform_is_win32():
@@ -129,6 +137,7 @@ def _download(path, url, probably_big, verbose, exception):
129137
raise
130138

131139

140+
132141
def verify(path, expected, verbose):
133142
"""Check if the sha256 sum of the given path is valid"""
134143
if verbose:

src/bootstrap/src/core/download.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ impl Config {
210210
println!("downloading {url}");
211211
// Try curl. If that fails and we are on windows, fallback to PowerShell.
212212
let mut curl = command("curl");
213+
// build the arguments for curl and wget simultaneously
214+
let mut wget = command("wget");
213215
curl.args([
214216
"-y",
215217
"30",
@@ -223,14 +225,21 @@ impl Config {
223225
"3",
224226
"-SRf",
225227
]);
228+
wget.args([
229+
"-O",
230+
tempfile.to_str().unwrap(),
231+
]);
226232
// Don't print progress in CI; the \r wrapping looks bad and downloads don't take long enough for progress to be useful.
227233
if CiEnv::is_ci() {
228234
curl.arg("-s");
229235
} else {
230236
curl.arg("--progress-bar");
237+
wget.arg("--show-progress");
231238
}
232239
curl.arg(url);
233-
if !self.check_run(&mut curl) {
240+
wget.arg(url);
241+
curl.mark_as_executed();
242+
if !(self.check_run(&mut wget) || self.check_run(&mut curl)) {
234243
if self.build.contains("windows-msvc") {
235244
eprintln!("Fallback to PowerShell");
236245
for _ in 0..3 {
@@ -346,7 +355,9 @@ impl Config {
346355
println!(
347356
"invalid checksum: \n\
348357
found: {checksum}\n\
349-
expected: {expected}",
358+
expected: {expected}\n\
359+
path: {}",
360+
path.display(),
350361
);
351362
}
352363

0 commit comments

Comments
 (0)