Get unstaged changes when excerpts of new buffers are added (#21619)
This fixes an error on nightly, introduced in https://github.com/zed-industries/zed/pull/21258, where diffs were not shown for buffers that were added to multi-buffers after construction. Release Notes: - N/A
This commit is contained in:
parent
cf4e847c62
commit
f6b5e1734e
1 changed files with 32 additions and 22 deletions
|
@ -2023,28 +2023,7 @@ impl Editor {
|
||||||
|
|
||||||
let mut code_action_providers = Vec::new();
|
let mut code_action_providers = Vec::new();
|
||||||
if let Some(project) = project.clone() {
|
if let Some(project) = project.clone() {
|
||||||
let mut tasks = Vec::new();
|
get_unstaged_changes_for_buffers(&project, buffer.read(cx).all_buffers(), cx);
|
||||||
buffer.update(cx, |multibuffer, cx| {
|
|
||||||
project.update(cx, |project, cx| {
|
|
||||||
multibuffer.for_each_buffer(|buffer| {
|
|
||||||
tasks.push(project.open_unstaged_changes(buffer.clone(), cx))
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
cx.spawn(|this, mut cx| async move {
|
|
||||||
let change_sets = futures::future::join_all(tasks).await;
|
|
||||||
this.update(&mut cx, |this, cx| {
|
|
||||||
for change_set in change_sets {
|
|
||||||
if let Some(change_set) = change_set.log_err() {
|
|
||||||
this.diff_map.add_change_set(change_set, cx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.ok();
|
|
||||||
})
|
|
||||||
.detach();
|
|
||||||
|
|
||||||
code_action_providers.push(Arc::new(project) as Arc<_>);
|
code_action_providers.push(Arc::new(project) as Arc<_>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12646,6 +12625,12 @@ impl Editor {
|
||||||
excerpts,
|
excerpts,
|
||||||
} => {
|
} => {
|
||||||
self.tasks_update_task = Some(self.refresh_runnables(cx));
|
self.tasks_update_task = Some(self.refresh_runnables(cx));
|
||||||
|
let buffer_id = buffer.read(cx).remote_id();
|
||||||
|
if !self.diff_map.diff_bases.contains_key(&buffer_id) {
|
||||||
|
if let Some(project) = &self.project {
|
||||||
|
get_unstaged_changes_for_buffers(project, [buffer.clone()], cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
cx.emit(EditorEvent::ExcerptsAdded {
|
cx.emit(EditorEvent::ExcerptsAdded {
|
||||||
buffer: buffer.clone(),
|
buffer: buffer.clone(),
|
||||||
predecessor: *predecessor,
|
predecessor: *predecessor,
|
||||||
|
@ -13342,6 +13327,31 @@ impl Editor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_unstaged_changes_for_buffers(
|
||||||
|
project: &Model<Project>,
|
||||||
|
buffers: impl IntoIterator<Item = Model<Buffer>>,
|
||||||
|
cx: &mut ViewContext<Editor>,
|
||||||
|
) {
|
||||||
|
let mut tasks = Vec::new();
|
||||||
|
project.update(cx, |project, cx| {
|
||||||
|
for buffer in buffers {
|
||||||
|
tasks.push(project.open_unstaged_changes(buffer.clone(), cx))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
cx.spawn(|this, mut cx| async move {
|
||||||
|
let change_sets = futures::future::join_all(tasks).await;
|
||||||
|
this.update(&mut cx, |this, cx| {
|
||||||
|
for change_set in change_sets {
|
||||||
|
if let Some(change_set) = change_set.log_err() {
|
||||||
|
this.diff_map.add_change_set(change_set, cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
})
|
||||||
|
.detach();
|
||||||
|
}
|
||||||
|
|
||||||
fn char_len_with_expanded_tabs(offset: usize, text: &str, tab_size: NonZeroU32) -> usize {
|
fn char_len_with_expanded_tabs(offset: usize, text: &str, tab_size: NonZeroU32) -> usize {
|
||||||
let tab_size = tab_size.get() as usize;
|
let tab_size = tab_size.get() as usize;
|
||||||
let mut width = offset;
|
let mut width = offset;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue