@@ -44,7 +44,6 @@ def eprint(*args, **kwargs):
44
44
kwargs ["file" ] = sys .stderr
45
45
print (* args , ** kwargs )
46
46
47
-
48
47
def get (base , url , path , checksums , verbose = False ):
49
48
with tempfile .NamedTemporaryFile (delete = False ) as temp_file :
50
49
temp_path = temp_file .name
@@ -89,6 +88,8 @@ def download(path, url, probably_big, verbose):
89
88
eprint ("\n spurious failure, trying again" )
90
89
_download (path , url , probably_big , verbose , False )
91
90
91
+ def has_wget ():
92
+ return require (["wget" , "--version" ], exit = False ) is not None
92
93
93
94
def _download (path , url , probably_big , verbose , exception ):
94
95
# Try to use curl (potentially available on win32
@@ -100,22 +101,45 @@ def _download(path, url, probably_big, verbose, exception):
100
101
eprint ("downloading {}" .format (url ))
101
102
102
103
try :
103
- if (probably_big or verbose ) and "GITHUB_ACTIONS" not in os .environ :
104
- option = "-#"
104
+ if has_wget ():
105
+ # options should be kept in sync with
106
+ # src/bootstrap/src/core/download.rs
107
+ # for consistancy
108
+ # these flags should also be as close as possible to the behavior
109
+ # of curl (except for wget's superior handling of surious network
110
+ # errors)
111
+ # curl's -R and -f are wget's default behavior.
112
+ run (["wget" ,
113
+ "--connect-timeout=30" ,
114
+ "--read-timeout=30" ,
115
+ "--tries=3" ,
116
+ "--show-progress" ,
117
+ "-O" , path , url ],
118
+ verbose = verbose ,
119
+ exception = True ,
120
+ )
105
121
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
- )
122
+ if (probably_big or verbose ) and "GITHUB_ACTIONS" not in os .environ :
123
+ option = "-#"
124
+ else :
125
+ option = "-s"
126
+ # If curl is not present on Win32, we should not sys.exit
127
+ # but raise `CalledProcessError` or `OSError` instead
128
+ require (["curl" , "--version" ], exception = platform_is_win32 ())
129
+ run (["curl" , option ,
130
+ "-L" , # Follow redirect.
131
+ # timeout if speed is < 10 bytes/sec for > 30 seconds
132
+ "-y" , "30" , "-Y" , "10" ,
133
+ # timeout if cannot connect within 30 seconds
134
+ "--connect-timeout" , "30" ,
135
+ "-o" , path ,
136
+ # -S: show errors, even if -s is specified
137
+ # -R: set timestamp of downloaded file to that of the server
138
+ # -f: fail on http error
139
+ "--retry" , "3" , "-SRf" , url ],
140
+ verbose = verbose ,
141
+ exception = True , # Will raise RuntimeError on failure
142
+ )
119
143
except (subprocess .CalledProcessError , OSError , RuntimeError ):
120
144
# see http://serverfault.com/questions/301128/how-to-download
121
145
if platform_is_win32 ():
@@ -129,6 +153,7 @@ def _download(path, url, probably_big, verbose, exception):
129
153
raise
130
154
131
155
156
+
132
157
def verify (path , expected , verbose ):
133
158
"""Check if the sha256 sum of the given path is valid"""
134
159
if verbose :
0 commit comments