Skip to content

Commit 9445005

Browse files
maxbrunsfeldas-cii
andauthored
Don't consider empty deleted files to be dirty or conflicting (#27701)
When a file is deleted outside of Zed, but it doesn't have any unsaved changes, it shouldn't be considered "dirty" (prompting you before you close it). Release Notes: - Fixed an bug where unchanged buffers were marked as conflicting if their files were deleted outside of Zed. --------- Co-authored-by: Antonio <[email protected]>
1 parent 5c0adde commit 9445005

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

crates/language/src/buffer.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1950,13 +1950,14 @@ impl Buffer {
19501950
if self.capability == Capability::ReadOnly {
19511951
return false;
19521952
}
1953-
if self.has_conflict || self.has_unsaved_edits() {
1953+
if self.has_conflict {
19541954
return true;
19551955
}
19561956
match self.file.as_ref().map(|f| f.disk_state()) {
1957-
Some(DiskState::New) => !self.is_empty(),
1958-
Some(DiskState::Deleted) => true,
1959-
_ => false,
1957+
Some(DiskState::New) | Some(DiskState::Deleted) => {
1958+
!self.is_empty() && self.has_unsaved_edits()
1959+
}
1960+
_ => self.has_unsaved_edits(),
19601961
}
19611962
}
19621963

@@ -1977,7 +1978,7 @@ impl Buffer {
19771978
}
19781979
None => true,
19791980
},
1980-
DiskState::Deleted => true,
1981+
DiskState::Deleted => false,
19811982
}
19821983
}
19831984

crates/project/src/project_tests.rs

+37-6
Original file line numberDiff line numberDiff line change
@@ -3884,7 +3884,7 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
38843884
]
38853885
);
38863886

3887-
// When a file is deleted, the buffer is considered dirty.
3887+
// When a file is deleted, it is not considered dirty.
38883888
let events = Arc::new(Mutex::new(Vec::new()));
38893889
let buffer2 = project
38903890
.update(cx, |p, cx| p.open_local_buffer(path!("/dir/file2"), cx))
@@ -3893,7 +3893,10 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
38933893
buffer2.update(cx, |_, cx| {
38943894
cx.subscribe(&buffer2, {
38953895
let events = events.clone();
3896-
move |_, _, event, _| events.lock().push(event.clone())
3896+
move |_, _, event, _| match event {
3897+
BufferEvent::Operation { .. } => {}
3898+
_ => events.lock().push(event.clone()),
3899+
}
38973900
})
38983901
.detach();
38993902
});
@@ -3902,12 +3905,37 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
39023905
.await
39033906
.unwrap();
39043907
cx.executor().run_until_parked();
3905-
buffer2.update(cx, |buffer, _| assert!(buffer.is_dirty()));
3908+
buffer2.update(cx, |buffer, _| assert!(!buffer.is_dirty()));
3909+
assert_eq!(
3910+
mem::take(&mut *events.lock()),
3911+
&[language::BufferEvent::FileHandleChanged]
3912+
);
3913+
3914+
// Buffer becomes dirty when edited.
3915+
buffer2.update(cx, |buffer, cx| {
3916+
buffer.edit([(2..3, "")], None, cx);
3917+
assert_eq!(buffer.is_dirty(), true);
3918+
});
3919+
assert_eq!(
3920+
mem::take(&mut *events.lock()),
3921+
&[
3922+
language::BufferEvent::Edited,
3923+
language::BufferEvent::DirtyChanged
3924+
]
3925+
);
3926+
3927+
// Buffer becomes clean again when all of its content is removed, because
3928+
// the file was deleted.
3929+
buffer2.update(cx, |buffer, cx| {
3930+
buffer.edit([(0..2, "")], None, cx);
3931+
assert_eq!(buffer.is_empty(), true);
3932+
assert_eq!(buffer.is_dirty(), false);
3933+
});
39063934
assert_eq!(
39073935
*events.lock(),
39083936
&[
3909-
language::BufferEvent::DirtyChanged,
3910-
language::BufferEvent::FileHandleChanged
3937+
language::BufferEvent::Edited,
3938+
language::BufferEvent::DirtyChanged
39113939
]
39123940
);
39133941

@@ -3920,7 +3948,10 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
39203948
buffer3.update(cx, |_, cx| {
39213949
cx.subscribe(&buffer3, {
39223950
let events = events.clone();
3923-
move |_, _, event, _| events.lock().push(event.clone())
3951+
move |_, _, event, _| match event {
3952+
BufferEvent::Operation { .. } => {}
3953+
_ => events.lock().push(event.clone()),
3954+
}
39243955
})
39253956
.detach();
39263957
});

0 commit comments

Comments
 (0)