assistant: Undo workflow step when buffer is discarded (#16465)
This fixes a weird bug:
1. Use `/workflow` in assistant
2. Have it generate a step that modifies a file
3. Either (a) select the step in the assistant and have it auto-insert
newlines (b) select "Transform" to have the step applied
4. Close the modified file in the editor ("Discard")
5. Re-open the file
6. BUG: the changes made by assistant are still there!
The reason for the bug is that the assistant keeps references to buffers
and they're not closed/reloaded when closed/reopened.
To fix the bug we now rollback the applied workflow steps when
discarding a buffer.
(This does *not* yet fix the issue where a workflow step inserts a new
buffer into the project/worktree that does not show up on the file
system yet but in `/file` and hangs around until Zed is closed.)
Release Notes:
- N/A
Co-authored-by: Bennet <bennet@zed.dev>
This commit is contained in:
@@ -184,6 +184,7 @@ pub trait Item: FocusableView + EventEmitter<Self::Event> {
|
||||
fn to_item_events(_event: &Self::Event, _f: impl FnMut(ItemEvent)) {}
|
||||
|
||||
fn deactivated(&mut self, _: &mut ViewContext<Self>) {}
|
||||
fn discarded(&self, _project: Model<Project>, _cx: &mut ViewContext<Self>) {}
|
||||
fn workspace_deactivated(&mut self, _: &mut ViewContext<Self>) {}
|
||||
fn navigate(&mut self, _: Box<dyn Any>, _: &mut ViewContext<Self>) -> bool {
|
||||
false
|
||||
@@ -394,6 +395,7 @@ pub trait ItemHandle: 'static + Send {
|
||||
cx: &mut ViewContext<Workspace>,
|
||||
);
|
||||
fn deactivated(&self, cx: &mut WindowContext);
|
||||
fn discarded(&self, project: Model<Project>, cx: &mut WindowContext);
|
||||
fn workspace_deactivated(&self, cx: &mut WindowContext);
|
||||
fn navigate(&self, data: Box<dyn Any>, cx: &mut WindowContext) -> bool;
|
||||
fn item_id(&self) -> EntityId;
|
||||
@@ -735,6 +737,10 @@ impl<T: Item> ItemHandle for View<T> {
|
||||
});
|
||||
}
|
||||
|
||||
fn discarded(&self, project: Model<Project>, cx: &mut WindowContext) {
|
||||
self.update(cx, |this, cx| this.discarded(project, cx));
|
||||
}
|
||||
|
||||
fn deactivated(&self, cx: &mut WindowContext) {
|
||||
self.update(cx, |this, cx| this.deactivated(cx));
|
||||
}
|
||||
|
||||
@@ -1500,8 +1500,13 @@ impl Pane {
|
||||
})?;
|
||||
match answer {
|
||||
Ok(0) => {}
|
||||
Ok(1) => return Ok(true), // Don't save this file
|
||||
_ => return Ok(false), // Cancel
|
||||
Ok(1) => {
|
||||
// Don't save this file
|
||||
pane.update(cx, |_, cx| item.discarded(project, cx))
|
||||
.log_err();
|
||||
return Ok(true);
|
||||
}
|
||||
_ => return Ok(false), // Cancel
|
||||
}
|
||||
} else {
|
||||
return Ok(false);
|
||||
|
||||
Reference in New Issue
Block a user