# acp: Fix panic with edit file tool \(\#36732\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/d88fd00e87673263eefdbe6fa5b3d582a05f2aee)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: d88fd00e87673263eefdbe6fa5b3d582a05f2aee

Requested commit: d88fd00e87673263eefdbe6fa5b3d582a05f2aee

Commit: d88fd00e87673263eefdbe6fa5b3d582a05f2aee

Tree: 11044d3828a6c12d3ef577f7abdb6b1d4c87ad70

Author: Cole Miller

Committer: GitHub

## Message

```
acp: Fix panic with edit file tool (#36732)

We had a frequent panic when the agent was using our edit file tool. The
root cause was that we were constructing a `BufferDiff` with
`BufferDiff::new`, then calling `set_base_text`, but not waiting for
that asynchronous operation to finish. This means there was a window of
time where the diff's base text was set to the initial value of
`""`--that's not a problem in itself, but it was possible for us to call
`PendingDiff::update` during that window, which calls
`BufferDiff::update_diff`, which calls
`BufferDiffSnapshot::new_with_base_buffer`, which takes two arguments
`base_text` and `base_text_snapshot` that are supposed to represent the
same text. We were getting the first of those arguments from the
`base_text` field of `PendingDiff`, which is set immediately to the
target base text without waiting for `BufferDiff::set_base_text` to run
to completion; and the second from the `BufferDiff` itself, which still
has the empty base text during that window.

As a result of that mismatch, we could end up adding `DeletedHunk` diff
transforms to the multibuffer for the diff card even though the
multibuffer's base text was empty, ultimately leading to a panic very
far away in rendering code.

I've fixed this by adding a new `BufferDiff` constructor for the case
where the buffer contents and the base text are (initially) the same,
like for the diff cards, and so we don't need an async diff calculation.
I also added a debug assertion to catch the basic issue here earlier,
when `BufferDiffSnapshot::new_with_base_buffer` is called with two base
texts that don't match.

Release Notes:

- N/A

---------

Co-authored-by: Conrad <conrad@zed.dev>
```

## Parents

- [f4ba7997a7d7e9da61b98fda8e28542d3e29f518](https://git.cafe/gitcafe/zed/commit/f4ba7997a7d7e9da61b98fda8e28542d3e29f518?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/d88fd00e87673263eefdbe6fa5b3d582a05f2aee?format=markdown)
