bootstrap: write texts to a .tmp file first for atomicity
If you are using a hard-linked file as your config.toml, this change will affect the way other instances of the file is modified. The original version would modify all other instances whereas the new version will leave others unchanged, reducing the ref count by one. Signed-off-by: NODA, Kai <nodakai@gmail.com>
This commit is contained in:
parent
fc491526dd
commit
bcb8a06ef7
2 changed files with 13 additions and 5 deletions
|
@ -303,6 +303,14 @@ def default_build_triple():
|
||||||
return "{}-{}".format(cputype, ostype)
|
return "{}-{}".format(cputype, ostype)
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def output(filepath):
|
||||||
|
tmp = filepath + '.tmp'
|
||||||
|
with open(tmp, 'w') as f:
|
||||||
|
yield f
|
||||||
|
os.rename(tmp, filepath)
|
||||||
|
|
||||||
|
|
||||||
class RustBuild(object):
|
class RustBuild(object):
|
||||||
"""Provide all the methods required to build Rust"""
|
"""Provide all the methods required to build Rust"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -346,7 +354,7 @@ class RustBuild(object):
|
||||||
self._download_stage0_helper(filename, "rustc")
|
self._download_stage0_helper(filename, "rustc")
|
||||||
self.fix_executable("{}/bin/rustc".format(self.bin_root()))
|
self.fix_executable("{}/bin/rustc".format(self.bin_root()))
|
||||||
self.fix_executable("{}/bin/rustdoc".format(self.bin_root()))
|
self.fix_executable("{}/bin/rustdoc".format(self.bin_root()))
|
||||||
with open(self.rustc_stamp(), 'w') as rust_stamp:
|
with output(self.rustc_stamp()) as rust_stamp:
|
||||||
rust_stamp.write(self.date)
|
rust_stamp.write(self.date)
|
||||||
|
|
||||||
# This is required so that we don't mix incompatible MinGW
|
# This is required so that we don't mix incompatible MinGW
|
||||||
|
@ -363,7 +371,7 @@ class RustBuild(object):
|
||||||
filename = "cargo-{}-{}.tar.gz".format(cargo_channel, self.build)
|
filename = "cargo-{}-{}.tar.gz".format(cargo_channel, self.build)
|
||||||
self._download_stage0_helper(filename, "cargo")
|
self._download_stage0_helper(filename, "cargo")
|
||||||
self.fix_executable("{}/bin/cargo".format(self.bin_root()))
|
self.fix_executable("{}/bin/cargo".format(self.bin_root()))
|
||||||
with open(self.cargo_stamp(), 'w') as cargo_stamp:
|
with output(self.cargo_stamp()) as cargo_stamp:
|
||||||
cargo_stamp.write(self.date)
|
cargo_stamp.write(self.date)
|
||||||
|
|
||||||
def _download_stage0_helper(self, filename, pattern):
|
def _download_stage0_helper(self, filename, pattern):
|
||||||
|
@ -776,7 +784,7 @@ def bootstrap(help_triggered):
|
||||||
if build.use_vendored_sources:
|
if build.use_vendored_sources:
|
||||||
if not os.path.exists('.cargo'):
|
if not os.path.exists('.cargo'):
|
||||||
os.makedirs('.cargo')
|
os.makedirs('.cargo')
|
||||||
with open('.cargo/config', 'w') as cargo_config:
|
with output('.cargo/config') as cargo_config:
|
||||||
cargo_config.write("""
|
cargo_config.write("""
|
||||||
[source.crates-io]
|
[source.crates-io]
|
||||||
replace-with = 'vendored-sources'
|
replace-with = 'vendored-sources'
|
||||||
|
|
|
@ -432,7 +432,7 @@ for section_key in config:
|
||||||
# order that we read it in.
|
# order that we read it in.
|
||||||
p("")
|
p("")
|
||||||
p("writing `config.toml` in current directory")
|
p("writing `config.toml` in current directory")
|
||||||
with open('config.toml', 'w') as f:
|
with bootstrap.output('config.toml') as f:
|
||||||
for section in section_order:
|
for section in section_order:
|
||||||
if section == 'target':
|
if section == 'target':
|
||||||
for target in targets:
|
for target in targets:
|
||||||
|
@ -442,7 +442,7 @@ with open('config.toml', 'w') as f:
|
||||||
for line in sections[section]:
|
for line in sections[section]:
|
||||||
f.write(line + "\n")
|
f.write(line + "\n")
|
||||||
|
|
||||||
with open('Makefile', 'w') as f:
|
with bootstrap.output('Makefile') as f:
|
||||||
contents = os.path.join(rust_dir, 'src', 'bootstrap', 'mk', 'Makefile.in')
|
contents = os.path.join(rust_dir, 'src', 'bootstrap', 'mk', 'Makefile.in')
|
||||||
contents = open(contents).read()
|
contents = open(contents).read()
|
||||||
contents = contents.replace("$(CFG_SRC_DIR)", rust_dir + '/')
|
contents = contents.replace("$(CFG_SRC_DIR)", rust_dir + '/')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue