with open(tmp, 'w') as f:
yield f
try:
- os.remove(filepath) # PermissionError/OSError on Win32 if in use
- os.rename(tmp, filepath)
+ if os.path.exists(filepath):
+ os.remove(filepath) # PermissionError/OSError on Win32 if in use
except OSError:
shutil.copy2(tmp, filepath)
os.remove(tmp)
+ return
+ os.rename(tmp, filepath)
class RustBuild(object):
if self.rustc().startswith(self.bin_root()) and \
(not os.path.exists(self.rustc()) or
- self.program_out_of_date(self.rustc_stamp())):
+ self.program_out_of_date(self.rustc_stamp(), self.date)):
if os.path.exists(self.bin_root()):
shutil.rmtree(self.bin_root())
tarball_suffix = '.tar.xz' if support_xz() else '.tar.gz'
self.fix_bin_or_dylib("{}/bin/rustfmt".format(self.bin_root()))
self.fix_bin_or_dylib("{}/bin/cargo-fmt".format(self.bin_root()))
with output(self.rustfmt_stamp()) as rustfmt_stamp:
- rustfmt_stamp.write(self.date + self.rustfmt_channel)
+ rustfmt_stamp.write(self.rustfmt_channel)
if self.downloading_llvm():
# We want the most recent LLVM submodule update to avoid downloading
for binary in ["llvm-config", "FileCheck"]:
self.fix_bin_or_dylib("{}/bin/{}".format(self.llvm_root(), binary))
with output(self.llvm_stamp()) as llvm_stamp:
- llvm_stamp.write(self.date + llvm_sha + str(llvm_assertions))
+ llvm_stamp.write(llvm_sha + str(llvm_assertions))
def downloading_llvm(self):
opt = self.get_toml('download-ci-llvm', 'llvm')
url = "https://ci-artifacts.rust-lang.org/rustc-builds/{}".format(llvm_sha)
if llvm_assertions:
url = url.replace('rustc-builds', 'rustc-builds-alt')
- tarball_suffix = '.tar.xz' if support_xz() else '.tar.gz'
+ # ci-artifacts are only stored as .xz, not .gz
+ if not support_xz():
+ print("error: XZ support is required to download LLVM")
+ print("help: consider disabling `download-ci-llvm` or using python3")
+ exit(1)
+ tarball_suffix = '.tar.xz'
filename = "rust-dev-nightly-" + self.build + tarball_suffix
tarball = os.path.join(rustc_cache, filename)
if not os.path.exists(tarball):
return os.path.join(self.llvm_root(), '.llvm-stamp')
- def program_out_of_date(self, stamp_path, extra=""):
+ def program_out_of_date(self, stamp_path, key):
"""Check if the given program stamp is out of date"""
if not os.path.exists(stamp_path) or self.clean:
return True
with open(stamp_path, 'r') as stamp:
- return (self.date + extra) != stamp.read()
+ return key != stamp.read()
def bin_root(self):
"""Return the binary root directory