Highlight merge conflicts and provide for resolving them (#28065)
TODO: - [x] Make it work in the project diff: - [x] Support non-singleton buffers - [x] Adjust excerpt boundaries to show full conflicts - [x] Write tests for conflict-related events and state management - [x] Prevent hunk buttons from appearing inside conflicts - [x] Make sure it works over SSH, collab - [x] Allow separate theming of markers Bonus: - [ ] Count of conflicts in toolbar - [ ] Keyboard-driven navigation and resolution - [ ] ~~Inlay hints to contextualize "ours"/"theirs"~~ Release Notes: - Implemented initial support for resolving merge conflicts. --------- Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
This commit is contained in:
parent
ef54b58346
commit
724c935196
24 changed files with 1626 additions and 184 deletions
|
@ -95,6 +95,7 @@ pub enum Event {
|
|||
},
|
||||
ExcerptsRemoved {
|
||||
ids: Vec<ExcerptId>,
|
||||
removed_buffer_ids: Vec<BufferId>,
|
||||
},
|
||||
ExcerptsExpanded {
|
||||
ids: Vec<ExcerptId>,
|
||||
|
@ -2021,7 +2022,12 @@ impl MultiBuffer {
|
|||
pub fn clear(&mut self, cx: &mut Context<Self>) {
|
||||
self.sync(cx);
|
||||
let ids = self.excerpt_ids();
|
||||
self.buffers.borrow_mut().clear();
|
||||
let removed_buffer_ids = self
|
||||
.buffers
|
||||
.borrow_mut()
|
||||
.drain()
|
||||
.map(|(id, _)| id)
|
||||
.collect();
|
||||
self.excerpts_by_path.clear();
|
||||
self.paths_by_excerpt.clear();
|
||||
let mut snapshot = self.snapshot.borrow_mut();
|
||||
|
@ -2046,7 +2052,10 @@ impl MultiBuffer {
|
|||
singleton_buffer_edited: false,
|
||||
edited_buffer: None,
|
||||
});
|
||||
cx.emit(Event::ExcerptsRemoved { ids });
|
||||
cx.emit(Event::ExcerptsRemoved {
|
||||
ids,
|
||||
removed_buffer_ids,
|
||||
});
|
||||
cx.notify();
|
||||
}
|
||||
|
||||
|
@ -2310,9 +2319,9 @@ impl MultiBuffer {
|
|||
new_excerpts.append(suffix, &());
|
||||
drop(cursor);
|
||||
snapshot.excerpts = new_excerpts;
|
||||
for buffer_id in removed_buffer_ids {
|
||||
self.diffs.remove(&buffer_id);
|
||||
snapshot.diffs.remove(&buffer_id);
|
||||
for buffer_id in &removed_buffer_ids {
|
||||
self.diffs.remove(buffer_id);
|
||||
snapshot.diffs.remove(buffer_id);
|
||||
}
|
||||
|
||||
if changed_trailing_excerpt {
|
||||
|
@ -2325,7 +2334,10 @@ impl MultiBuffer {
|
|||
singleton_buffer_edited: false,
|
||||
edited_buffer: None,
|
||||
});
|
||||
cx.emit(Event::ExcerptsRemoved { ids });
|
||||
cx.emit(Event::ExcerptsRemoved {
|
||||
ids,
|
||||
removed_buffer_ids,
|
||||
});
|
||||
cx.notify();
|
||||
}
|
||||
|
||||
|
|
|
@ -635,7 +635,7 @@ fn test_excerpt_events(cx: &mut App) {
|
|||
predecessor,
|
||||
excerpts,
|
||||
} => follower.insert_excerpts_with_ids_after(predecessor, buffer, excerpts, cx),
|
||||
Event::ExcerptsRemoved { ids } => follower.remove_excerpts(ids, cx),
|
||||
Event::ExcerptsRemoved { ids, .. } => follower.remove_excerpts(ids, cx),
|
||||
Event::Edited { .. } => {
|
||||
*follower_edit_event_count.write() += 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue