Diff view: Fold excerpts of deleted files by default (#25436)

Release Notes:

- N/A
This commit is contained in:
João Marcos 2025-02-24 12:52:13 -03:00 committed by GitHub
parent 2b28b5969f
commit d1302a7a08
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 5 deletions

View file

@ -11,7 +11,7 @@ use editor::{
}; };
use feature_flags::FeatureFlagViewExt; use feature_flags::FeatureFlagViewExt;
use futures::StreamExt; use futures::StreamExt;
use git::{Commit, StageAll, StageAndNext, ToggleStaged, UnstageAll}; use git::{status::FileStatus, Commit, StageAll, StageAndNext, ToggleStaged, UnstageAll};
use gpui::{ use gpui::{
actions, Action, AnyElement, AnyView, App, AppContext as _, AsyncWindowContext, Entity, actions, Action, AnyElement, AnyView, App, AppContext as _, AsyncWindowContext, Entity,
EventEmitter, FocusHandle, Focusable, Render, Subscription, Task, WeakEntity, EventEmitter, FocusHandle, Focusable, Render, Subscription, Task, WeakEntity,
@ -51,6 +51,7 @@ struct DiffBuffer {
path_key: PathKey, path_key: PathKey,
buffer: Entity<Buffer>, buffer: Entity<Buffer>,
diff: Entity<BufferDiff>, diff: Entity<BufferDiff>,
file_status: FileStatus,
} }
const CONFLICT_NAMESPACE: &'static str = "0"; const CONFLICT_NAMESPACE: &'static str = "0";
@ -351,6 +352,7 @@ impl ProjectDiff {
path_key, path_key,
buffer, buffer,
diff: changes, diff: changes,
file_status: entry.status,
}) })
})); }));
} }
@ -383,15 +385,22 @@ impl ProjectDiff {
.collect::<Vec<_>>() .collect::<Vec<_>>()
}; };
self.multibuffer.update(cx, |multibuffer, cx| { let is_excerpt_newly_added = self.multibuffer.update(cx, |multibuffer, cx| {
multibuffer.set_excerpts_for_path( multibuffer.set_excerpts_for_path(
path_key.clone(), path_key.clone(),
buffer, buffer,
diff_hunk_ranges, diff_hunk_ranges,
editor::DEFAULT_MULTIBUFFER_CONTEXT, editor::DEFAULT_MULTIBUFFER_CONTEXT,
cx, cx,
); )
}); });
if is_excerpt_newly_added && diff_buffer.file_status.is_deleted() {
self.editor.update(cx, |editor, cx| {
editor.fold_buffer(snapshot.text.remote_id(), cx)
});
}
if self.multibuffer.read(cx).is_empty() if self.multibuffer.read(cx).is_empty()
&& self && self
.editor .editor

View file

@ -1448,7 +1448,7 @@ impl MultiBuffer {
excerpt.range.context.start, excerpt.range.context.start,
)) ))
} }
/// Sets excerpts, returns `true` if at least one new excerpt was added.
pub fn set_excerpts_for_path( pub fn set_excerpts_for_path(
&mut self, &mut self,
path: PathKey, path: PathKey,
@ -1456,7 +1456,7 @@ impl MultiBuffer {
ranges: Vec<Range<Point>>, ranges: Vec<Range<Point>>,
context_line_count: u32, context_line_count: u32,
cx: &mut Context<Self>, cx: &mut Context<Self>,
) { ) -> bool {
let buffer_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot()); let buffer_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot());
let mut insert_after = self let mut insert_after = self
@ -1475,6 +1475,7 @@ impl MultiBuffer {
let mut new_excerpt_ids = Vec::new(); let mut new_excerpt_ids = Vec::new();
let mut to_remove = Vec::new(); let mut to_remove = Vec::new();
let mut to_insert = Vec::new(); let mut to_insert = Vec::new();
let mut added_a_new_excerpt = false;
let snapshot = self.snapshot(cx); let snapshot = self.snapshot(cx);
let mut excerpts_cursor = snapshot.excerpts.cursor::<Option<&Locator>>(&()); let mut excerpts_cursor = snapshot.excerpts.cursor::<Option<&Locator>>(&());
@ -1489,6 +1490,7 @@ impl MultiBuffer {
continue; continue;
} }
(Some(_), None) => { (Some(_), None) => {
added_a_new_excerpt = true;
to_insert.push(new_iter.next().unwrap()); to_insert.push(new_iter.next().unwrap());
continue; continue;
} }
@ -1552,6 +1554,8 @@ impl MultiBuffer {
} else { } else {
self.buffers_by_path.insert(path, new_excerpt_ids); self.buffers_by_path.insert(path, new_excerpt_ids);
} }
added_a_new_excerpt
} }
pub fn paths(&self) -> impl Iterator<Item = PathKey> + '_ { pub fn paths(&self) -> impl Iterator<Item = PathKey> + '_ {