Canonicalize settings to avoid overwriting symlinks (#7632)

Release Notes:

- Fixed theme selector overwriting settings file symlinks
([#4469](https://github.com/zed-industries/zed/issues/4469)).
This commit is contained in:
Matt Bond 2024-02-09 15:31:14 -05:00 committed by GitHub
parent 2b383b854a
commit 2b39a9512a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,9 +1,9 @@
use crate::{settings_store::SettingsStore, Settings};
use anyhow::Result;
use anyhow::{Context, Result};
use fs::Fs;
use futures::{channel::mpsc, StreamExt};
use gpui::{AppContext, BackgroundExecutor};
use std::{io::ErrorKind, path::PathBuf, str, sync::Arc, time::Duration};
use std::{io::ErrorKind, path::PathBuf, sync::Arc, time::Duration};
use util::{paths, ResultExt};
pub const EMPTY_THEME_NAME: &'static str = "empty-theme";
@ -115,7 +115,14 @@ pub fn update_settings_file<T: Settings>(
let new_text = cx.read_global(|store: &SettingsStore, _cx| {
store.new_text_for_update::<T>(old_text, update)
})?;
fs.atomic_write(paths::SETTINGS.clone(), new_text).await?;
let initial_path = paths::SETTINGS.as_path();
let resolved_path = fs
.canonicalize(initial_path)
.await
.with_context(|| format!("Failed to canonicalize settings path {:?}", initial_path))?;
fs.atomic_write(resolved_path.clone(), new_text)
.await
.with_context(|| format!("Failed to write settings to file {:?}", resolved_path))?;
anyhow::Ok(())
})
.detach_and_log_err(cx);