Radish alpha
r
Radicle CI broker
Radicle
Git (anonymous pull)
Log in to clone via SSH
fix: update status page atomically
Lars Wirzenius committed 2 years ago
commit d96861408c0dbf59622228e4b795ffe231a449be
parent 43b434faddfa9aecd0dc18c108b66428c25f132c
1 file changed +10 -2
modified src/status.rs
@@ -33,9 +33,10 @@ impl Default for StatusData {

impl StatusData {
    fn write(&self, filename: &Path) -> Result<(), StatusError> {
+
        let tmp = filename.with_extension("update");
        let s = serde_json::to_string_pretty(&self).map_err(StatusError::serialize)?;
-
        std::fs::write(filename, s.as_bytes())
-
            .map_err(|e| StatusError::status_write(filename, e))?;
+
        std::fs::write(&tmp, s.as_bytes()).map_err(|e| StatusError::status_write(filename, e))?;
+
        std::fs::rename(&tmp, filename).map_err(|e| StatusError::status_rename(filename, e))?;
        Ok(())
    }
}
@@ -103,6 +104,9 @@ pub enum StatusError {

    #[error("failed to write status to file {0}")]
    StatusWrite(PathBuf, #[source] std::io::Error),
+

+
    #[error("failed to rename status to file {0}")]
+
    StatusRename(PathBuf, #[source] std::io::Error),
}

impl StatusError {
@@ -117,4 +121,8 @@ impl StatusError {
    fn status_write(filename: &Path, err: std::io::Error) -> Self {
        Self::StatusWrite(filename.into(), err)
    }
+

+
    fn status_rename(filename: &Path, err: std::io::Error) -> Self {
+
        Self::StatusRename(filename.into(), err)
+
    }
}