From 4259ed78b973e68060356b857779bdcf96afda87 Mon Sep 17 00:00:00 2001 From: Adil Hanney Date: Tue, 10 Feb 2026 19:25:03 +0000 Subject: [PATCH] tweak: write to temp file first --- cosmic-theme/src/output/gtk4_output.rs | 16 +++++++++++++--- cosmic-theme/src/output/qt_output.rs | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/cosmic-theme/src/output/gtk4_output.rs b/cosmic-theme/src/output/gtk4_output.rs index 1ad28c27..eede6ad4 100644 --- a/cosmic-theme/src/output/gtk4_output.rs +++ b/cosmic-theme/src/output/gtk4_output.rs @@ -163,9 +163,19 @@ impl Theme { std::fs::create_dir_all(&config_dir).map_err(OutputError::Io)?; } - let mut file = File::create(config_dir.join(name)).map_err(OutputError::Io)?; - file.write_all(css_str.as_bytes()) - .map_err(OutputError::Io)?; + let file_path = config_dir.join(name); + let tmp_file_path = config_dir.join(name + "~"); + + // Write to tmp_file_path first, then move it to file_path + let mut tmp_file = File::create(tmp_file_path).map_err(OutputError::Io)?; + let res = tmp_file + .write_all(css_str.as_bytes()) + .and_then(|| tmp_file.flush()?) + .and_then(|| std::fs::rename(tmp_file_path, file_path)?); + if let Err(e) = res { + _ = std::fs::remove_file(tmp_file); + return Err(OutputError::Io(e)); + } Ok(()) } diff --git a/cosmic-theme/src/output/qt_output.rs b/cosmic-theme/src/output/qt_output.rs index 92cf81c3..02e8111a 100644 --- a/cosmic-theme/src/output/qt_output.rs +++ b/cosmic-theme/src/output/qt_output.rs @@ -206,8 +206,19 @@ contrast=4 std::fs::create_dir_all(&data_dir).map_err(OutputError::Io)?; } - let mut file = File::create(data_dir.join(file_name)).map_err(OutputError::Io)?; - file.write_all(colors.as_bytes()).map_err(OutputError::Io)?; + let file_path = data_dir.join(file_name); + let tmp_file_path = data_dir.join(file_name + "~"); + + // Write to tmp_file_path first, then move it to file_path + let mut tmp_file = File::create(tmp_file_path).map_err(OutputError::Io)?; + let res = tmp_file + .write_all(colors.as_bytes()) + .and_then(|| tmp_file.flush()?) + .and_then(|| std::fs::rename(tmp_file_path, file_path)?); + if let Err(e) = res { + _ = std::fs::remove_file(tmp_file); + return Err(OutputError::Io(e)); + } Ok(()) }