Write to temp file before renaming to the final name
This commit is contained in:
parent
0673cde5a3
commit
e1edc13afb
@ -10,6 +10,7 @@
|
|||||||
use ar_archive_writer::{write_archive_to_stream, ArchiveKind, NewArchiveMember};
|
use ar_archive_writer::{write_archive_to_stream, ArchiveKind, NewArchiveMember};
|
||||||
use object::read::archive::ArchiveFile;
|
use object::read::archive::ArchiveFile;
|
||||||
use object::read::macho::FatArch;
|
use object::read::macho::FatArch;
|
||||||
|
use tempfile::Builder as TempFileBuilder;
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
@ -271,10 +272,27 @@ fn build_inner(self, output: &Path) -> io::Result<bool> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut w = File::create(output)
|
// Write to a temporary file first before atomically renaming to the final name.
|
||||||
.map_err(|err| io_error_context("failed to create archive file", err))?;
|
// This prevents programs (including rustc) from attempting to read a partial archive.
|
||||||
|
// It also enables writing an archive with the same filename as a dependency on Windows as
|
||||||
|
// required by a test.
|
||||||
|
let mut archive_tmpfile = TempFileBuilder::new()
|
||||||
|
.suffix(".temp-archive")
|
||||||
|
.tempfile_in(output.parent().unwrap_or_else(|| Path::new("")))
|
||||||
|
.map_err(|err| io_error_context("couldn't create a temp file", err))?;
|
||||||
|
|
||||||
write_archive_to_stream(&mut w, &entries, true, archive_kind, true, false)?;
|
write_archive_to_stream(
|
||||||
|
archive_tmpfile.as_file_mut(),
|
||||||
|
&entries,
|
||||||
|
true,
|
||||||
|
archive_kind,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
archive_tmpfile
|
||||||
|
.persist(output)
|
||||||
|
.map_err(|err| io_error_context("failed to rename archive file", err.error))?;
|
||||||
|
|
||||||
Ok(!entries.is_empty())
|
Ok(!entries.is_empty())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user