Skip to content

Commit ec5e74f

Browse files
authored
Rollup merge of rust-lang#65932 - guanqun:download-xz, r=alexcrichton
download .tar.xz if python3 is used fixes rust-lang#65757
2 parents 0f12bad + 0019371 commit ec5e74f

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

src/bootstrap/bootstrap.py

+29-14
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,10 @@ def verify(path, sha_path, verbose):
102102
return verified
103103

104104

105-
def unpack(tarball, dst, verbose=False, match=None):
105+
def unpack(tarball, tarball_suffix, dst, verbose=False, match=None):
106106
"""Unpack the given tarball file"""
107107
print("extracting", tarball)
108-
fname = os.path.basename(tarball).replace(".tar.gz", "")
108+
fname = os.path.basename(tarball).replace(tarball_suffix, "")
109109
with contextlib.closing(tarfile.open(tarball)) as tar:
110110
for member in tar.getnames():
111111
if "/" not in member:
@@ -331,6 +331,7 @@ def __init__(self):
331331
self.use_vendored_sources = ''
332332
self.verbose = False
333333

334+
334335
def download_stage0(self):
335336
"""Fetch the build system for Rust, written in Rust
336337
@@ -344,18 +345,30 @@ def download_stage0(self):
344345
rustc_channel = self.rustc_channel
345346
cargo_channel = self.cargo_channel
346347

348+
def support_xz():
349+
try:
350+
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
351+
temp_path = temp_file.name
352+
with tarfile.open(temp_path, "w:xz") as tar:
353+
pass
354+
return True
355+
except tarfile.CompressionError:
356+
return False
357+
347358
if self.rustc().startswith(self.bin_root()) and \
348359
(not os.path.exists(self.rustc()) or
349360
self.program_out_of_date(self.rustc_stamp())):
350361
if os.path.exists(self.bin_root()):
351362
shutil.rmtree(self.bin_root())
352-
filename = "rust-std-{}-{}.tar.gz".format(
353-
rustc_channel, self.build)
363+
tarball_suffix = '.tar.xz' if support_xz() else '.tar.gz'
364+
filename = "rust-std-{}-{}{}".format(
365+
rustc_channel, self.build, tarball_suffix)
354366
pattern = "rust-std-{}".format(self.build)
355-
self._download_stage0_helper(filename, pattern)
367+
self._download_stage0_helper(filename, pattern, tarball_suffix)
356368

357-
filename = "rustc-{}-{}.tar.gz".format(rustc_channel, self.build)
358-
self._download_stage0_helper(filename, "rustc")
369+
filename = "rustc-{}-{}{}".format(rustc_channel, self.build,
370+
tarball_suffix)
371+
self._download_stage0_helper(filename, "rustc", tarball_suffix)
359372
self.fix_executable("{}/bin/rustc".format(self.bin_root()))
360373
self.fix_executable("{}/bin/rustdoc".format(self.bin_root()))
361374
with output(self.rustc_stamp()) as rust_stamp:
@@ -365,20 +378,22 @@ def download_stage0(self):
365378
# libraries/binaries that are included in rust-std with
366379
# the system MinGW ones.
367380
if "pc-windows-gnu" in self.build:
368-
filename = "rust-mingw-{}-{}.tar.gz".format(
369-
rustc_channel, self.build)
370-
self._download_stage0_helper(filename, "rust-mingw")
381+
filename = "rust-mingw-{}-{}{}".format(
382+
rustc_channel, self.build, tarball_suffix)
383+
self._download_stage0_helper(filename, "rust-mingw", tarball_suffix)
371384

372385
if self.cargo().startswith(self.bin_root()) and \
373386
(not os.path.exists(self.cargo()) or
374387
self.program_out_of_date(self.cargo_stamp())):
375-
filename = "cargo-{}-{}.tar.gz".format(cargo_channel, self.build)
376-
self._download_stage0_helper(filename, "cargo")
388+
tarball_suffix = '.tar.xz' if support_xz() else '.tar.gz'
389+
filename = "cargo-{}-{}{}".format(cargo_channel, self.build,
390+
tarball_suffix)
391+
self._download_stage0_helper(filename, "cargo", tarball_suffix)
377392
self.fix_executable("{}/bin/cargo".format(self.bin_root()))
378393
with output(self.cargo_stamp()) as cargo_stamp:
379394
cargo_stamp.write(self.date)
380395

381-
def _download_stage0_helper(self, filename, pattern):
396+
def _download_stage0_helper(self, filename, pattern, tarball_suffix):
382397
cache_dst = os.path.join(self.build_dir, "cache")
383398
rustc_cache = os.path.join(cache_dst, self.date)
384399
if not os.path.exists(rustc_cache):
@@ -388,7 +403,7 @@ def _download_stage0_helper(self, filename, pattern):
388403
tarball = os.path.join(rustc_cache, filename)
389404
if not os.path.exists(tarball):
390405
get("{}/{}".format(url, filename), tarball, verbose=self.verbose)
391-
unpack(tarball, self.bin_root(), match=pattern, verbose=self.verbose)
406+
unpack(tarball, tarball_suffix, self.bin_root(), match=pattern, verbose=self.verbose)
392407

393408
@staticmethod
394409
def fix_executable(fname):

0 commit comments

Comments
 (0)