From 9a22ef2fd545439245d461291c596c787e6676bd Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Mon, 3 Feb 2025 23:31:34 -0700 Subject: [PATCH] Don't save deleted files (#24171) We now treat new files that have no content as not-dirty. This fixes the git diff view when deleted files are present. It also fixes a long-standing bug where `zed RAEDME` and then closing the tab would prompt for "unsaved changes" when there were none. Release Notes: - Fixed a bug where closing an empty, named, file would warn about unsaved content. --- crates/git_ui/src/project_diff.rs | 4 ++-- crates/language/src/buffer.rs | 17 +++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/crates/git_ui/src/project_diff.rs b/crates/git_ui/src/project_diff.rs index a9dd2bd38809a82fd3701bb958d3866425657da0..8d8b025562880a55cf55d8d93c8071ab2e26be01 100644 --- a/crates/git_ui/src/project_diff.rs +++ b/crates/git_ui/src/project_diff.rs @@ -27,7 +27,7 @@ use workspace::{ use crate::git_panel::GitPanel; -actions!(git, [ShowUncommittedChanges]); +actions!(git, [Diff]); pub(crate) struct ProjectDiff { multibuffer: Entity, @@ -63,7 +63,7 @@ impl ProjectDiff { fn deploy( workspace: &mut Workspace, - _: &ShowUncommittedChanges, + _: &Diff, window: &mut Window, cx: &mut Context, ) { diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index b47e2ba78b18f0aae5a92e1761594d0bd01f374d..dc6399122c92aa3b57c9d3fa52b344d1922fdd3b 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1914,12 +1914,17 @@ impl Buffer { /// Checks if the buffer has unsaved changes. pub fn is_dirty(&self) -> bool { - self.capability != Capability::ReadOnly - && (self.has_conflict - || self.file.as_ref().map_or(false, |file| { - matches!(file.disk_state(), DiskState::New | DiskState::Deleted) - }) - || self.has_unsaved_edits()) + if self.capability == Capability::ReadOnly { + return false; + } + if self.has_conflict || self.has_unsaved_edits() { + return true; + } + match self.file.as_ref().map(|f| f.disk_state()) { + Some(DiskState::New) => !self.is_empty(), + Some(DiskState::Deleted) => true, + _ => false, + } } /// Checks if the buffer and its file have both changed since the buffer