Restructure git diff state management to allow viewing buffers with different diff bases (#21258)
This is a pure refactor of our Git diff state management. Buffers are no longer are associated with one single diff (the unstaged changes). Instead, there is an explicit project API for retrieving a buffer's unstaged changes, and the `Editor` view layer is responsible for choosing what diff to associate with a buffer. The reason for this change is that we'll soon want to add multiple "git diff views" to Zed, one of which will show the *uncommitted* changes for a buffer. But that view will need to co-exist with other views of the same buffer, which may want to show the unstaged changes. ### Todo * [x] Get git gutter and git hunks working with new structure * [x] Update editor tests to use new APIs * [x] Update buffer tests * [x] Restructure remoting/collab protocol * [x] Update assertions about staged text in `random_project_collaboration_tests` * [x] Move buffer tests for git diff management to a new spot, using the new APIs Release Notes: - N/A --------- Co-authored-by: Richard <richard@zed.dev> Co-authored-by: Cole <cole@zed.dev> Co-authored-by: Conrad <conrad@zed.dev>
This commit is contained in:
parent
31796171de
commit
a2115e7242
29 changed files with 1832 additions and 1651 deletions
|
@ -78,13 +78,22 @@ async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut Test
|
|||
})
|
||||
.await
|
||||
.unwrap();
|
||||
let change_set = project
|
||||
.update(cx, |project, cx| {
|
||||
project.open_unstaged_changes(buffer.clone(), cx)
|
||||
})
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
change_set.update(cx, |change_set, cx| {
|
||||
assert_eq!(
|
||||
change_set.base_text_string(cx).unwrap(),
|
||||
"fn one() -> usize { 0 }"
|
||||
);
|
||||
});
|
||||
|
||||
buffer.update(cx, |buffer, cx| {
|
||||
assert_eq!(buffer.text(), "fn one() -> usize { 1 }");
|
||||
assert_eq!(
|
||||
buffer.diff_base().unwrap().to_string(),
|
||||
"fn one() -> usize { 0 }"
|
||||
);
|
||||
let ix = buffer.text().find('1').unwrap();
|
||||
buffer.edit([(ix..ix + 1, "100")], None, cx);
|
||||
});
|
||||
|
@ -140,9 +149,9 @@ async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut Test
|
|||
&[(Path::new("src/lib2.rs"), "fn one() -> usize { 100 }".into())],
|
||||
);
|
||||
cx.executor().run_until_parked();
|
||||
buffer.update(cx, |buffer, _| {
|
||||
change_set.update(cx, |change_set, cx| {
|
||||
assert_eq!(
|
||||
buffer.diff_base().unwrap().to_string(),
|
||||
change_set.base_text_string(cx).unwrap(),
|
||||
"fn one() -> usize { 100 }"
|
||||
);
|
||||
});
|
||||
|
@ -213,7 +222,7 @@ async fn test_remote_project_search(cx: &mut TestAppContext, server_cx: &mut Tes
|
|||
// test that the headless server is tracking which buffers we have open correctly.
|
||||
cx.run_until_parked();
|
||||
headless.update(server_cx, |headless, cx| {
|
||||
assert!(!headless.buffer_store.read(cx).shared_buffers().is_empty())
|
||||
assert!(headless.buffer_store.read(cx).has_shared_buffers())
|
||||
});
|
||||
do_search(&project, cx.clone()).await;
|
||||
|
||||
|
@ -222,7 +231,7 @@ async fn test_remote_project_search(cx: &mut TestAppContext, server_cx: &mut Tes
|
|||
});
|
||||
cx.run_until_parked();
|
||||
headless.update(server_cx, |headless, cx| {
|
||||
assert!(headless.buffer_store.read(cx).shared_buffers().is_empty())
|
||||
assert!(!headless.buffer_store.read(cx).has_shared_buffers())
|
||||
});
|
||||
|
||||
do_search(&project, cx.clone()).await;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue