diff options
author | Luca Casonato <lucacasonato@yahoo.com> | 2020-12-18 19:30:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-18 19:30:49 +0100 |
commit | b9165e9482465293aad99aff66bee6b64f739eb6 (patch) | |
tree | e51c490a6e02b5c84b9914986e8bee3510700d7a /cli/fs_util.rs | |
parent | 37fd0836d01011640356d6ff83b29d39df83b03e (diff) |
fix: atomically write files to $DENO_DIR (#8822)
Diffstat (limited to 'cli/fs_util.rs')
-rw-r--r-- | cli/fs_util.rs | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/cli/fs_util.rs b/cli/fs_util.rs index 217476c01..f13558e36 100644 --- a/cli/fs_util.rs +++ b/cli/fs_util.rs @@ -2,12 +2,28 @@ use deno_core::error::AnyError; pub use deno_core::normalize_path; +use deno_runtime::deno_crypto::rand; use std::env::current_dir; use std::fs::OpenOptions; use std::io::{Error, Write}; use std::path::{Path, PathBuf}; use walkdir::WalkDir; +pub fn atomic_write_file<T: AsRef<[u8]>>( + filename: &Path, + data: T, + mode: u32, +) -> std::io::Result<()> { + let rand: String = (0..4) + .map(|_| format!("{:02x}", rand::random::<u8>())) + .collect(); + let extension = format!("{}.tmp", rand); + let tmp_file = filename.with_extension(extension); + write_file(&tmp_file, data, mode)?; + std::fs::rename(tmp_file, filename)?; + Ok(()) +} + pub fn write_file<T: AsRef<[u8]>>( filename: &Path, data: T, |