@@ -44,7 +44,6 @@ def eprint(*args, **kwargs):
4444 kwargs ["file" ] = sys .stderr
4545 print (* args , ** kwargs )
4646
47-
4847def 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 ("\n spurious failure, trying again" )
9089 _download (path , url , probably_big , verbose , False )
9190
91+ def has_wget ():
92+ return require (["wget" , "--version" ], exit = False ) is not None
9293
9394def _download (path , url , probably_big , verbose , exception ):
9495 # Try to use curl (potentially available on win32
@@ -100,22 +101,45 @@ 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+ # 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+ )
105121 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+ )
119143 except (subprocess .CalledProcessError , OSError , RuntimeError ):
120144 # see http://serverfault.com/questions/301128/how-to-download
121145 if platform_is_win32 ():
@@ -129,6 +153,7 @@ def _download(path, url, probably_big, verbose, exception):
129153 raise
130154
131155
156+
132157def verify (path , expected , verbose ):
133158 """Check if the sha256 sum of the given path is valid"""
134159 if verbose :
0 commit comments