Skip to content

Commit 89cd5eb

Browse files
committed
Make file writes concurrent-execution friendly
1 parent 6c358af commit 89cd5eb

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ regex = "1"
3030
serde = { version = "1", features = ["derive"] }
3131
serde_json = "1"
3232
sha-1 = "0.9"
33+
tempfile = "3"
3334
toml = "0.5"
3435

3536
[target.'cfg(windows)'.dependencies]
@@ -40,7 +41,6 @@ atty = "0.2"
4041

4142
[dev-dependencies]
4243
scan-rules = "0.2"
43-
tempfile = "3"
4444

4545
[profile.release]
4646
lto = true

src/main.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use log::{debug, error, info};
2222
use serde::{Deserialize, Serialize};
2323
use std::ffi::OsString;
2424
use std::fs;
25-
use std::io::{Read, Write};
25+
use std::io::{BufWriter, Read, Write};
2626
use std::path::{Path, PathBuf};
2727
use std::process::Command;
2828

@@ -904,12 +904,14 @@ fn write_pkg_metadata<P>(pkg_path: P, meta: &PackageMetadata) -> MainResult<()>
904904
where
905905
P: AsRef<Path>,
906906
{
907-
let meta_path = get_pkg_metadata_path(pkg_path);
907+
let meta_path = get_pkg_metadata_path(&pkg_path);
908908
debug!("meta_path: {:?}", meta_path);
909-
let mut meta_file = fs::File::create(&meta_path)?;
910-
let meta_str = serde_json::to_string(meta).map_err(|err| err.to_string())?;
911-
write!(&mut meta_file, "{}", meta_str)?;
912-
meta_file.flush()?;
909+
let mut temp_file = tempfile::NamedTempFile::new_in(&pkg_path)?;
910+
serde_json::to_writer(BufWriter::new(&temp_file), meta).map_err(|err| err.to_string())?;
911+
temp_file.flush()?;
912+
temp_file
913+
.persist(&meta_path)
914+
.map_err(|err| err.to_string())?;
913915
Ok(())
914916
}
915917

@@ -1141,9 +1143,14 @@ where
11411143
}
11421144

11431145
debug!(".. hashes differ; new_hash: {:?}", new_hash);
1144-
let mut file = fs::File::create(path)?;
1145-
write!(&mut file, "{}", content)?;
1146-
file.flush()?;
1146+
let dir = path
1147+
.as_ref()
1148+
.parent()
1149+
.ok_or("The given path should be a file")?;
1150+
let mut temp_file = tempfile::NamedTempFile::new_in(dir)?;
1151+
temp_file.write_all(content.as_bytes())?;
1152+
temp_file.flush()?;
1153+
temp_file.persist(path).map_err(|e| e.to_string())?;
11471154
Ok(FileOverwrite::Changed { new_hash })
11481155
}
11491156

0 commit comments

Comments
 (0)