From 9f72e05c4056ff6514660276e3e33e8757c674d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B0=8F=E7=99=BD?= <364772080@qq.com> Date: Fri, 28 Mar 2025 13:52:48 +0800 Subject: [PATCH] windows: Fix extension uninstall (#18467) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #18153 When calling `uninstall_extension`, the `work_dir` associated with this `extension` doesn't have its corresponding `FileHandle` properly closed, preventing the deletion of the `work_dir`. As seen in the image below, after installing the `toml` extension, `zed.exe` holds two `Handle`s for the folder `C:\Users\36477\AppData\Local\Zed\extensions\work\toml`. ![Screenshot 2024-09-27 171149](https://github.com/user-attachments/assets/f75f3f6f-9a62-43b5-9450-73ee1ed8e7f9) Therefore, after deleting `extension_dir` and then calling `this.update(...)`, `zed.exe` releases these two `Handles`, and only then can the folder `C:\Users\36477\AppData\Local\Zed\extensions\work\toml` be deleted. See the corresponding file handles are closed after calling `this.update(...)`: ![Screenshot 2024-09-28 132823](https://github.com/user-attachments/assets/476e0494-850a-4af5-b351-899e60ae98f7) However, if there is a running server of the extension, the error will persist. At this point, I haven’t found a direct way to terminate all running servers of the extension. Since this feature might affect the `LspStore` structure, I paused my work here. See when `toml` extension is running, we can not delete `C:\Users\36477\AppData\Local\Zed\extensions\work\toml` since `C:\Users\36477\AppData\Local\Zed\extensions\work\toml\taplo.exe` is still running: ![Screenshot 2024-09-28 134709](https://github.com/user-attachments/assets/6801d6e2-2a44-4103-8570-467c507e6e20) cc @ConradIrwin You're the expert in this area—what are your thoughts? Release Notes: - N/A --- crates/extension_host/src/extension_host.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/crates/extension_host/src/extension_host.rs b/crates/extension_host/src/extension_host.rs index 36f1f2960c..2bc1862b6f 100644 --- a/crates/extension_host/src/extension_host.rs +++ b/crates/extension_host/src/extension_host.rs @@ -837,15 +837,6 @@ impl ExtensionStore { } }); - fs.remove_dir( - &work_dir, - RemoveOptions { - recursive: true, - ignore_if_not_exists: true, - }, - ) - .await?; - fs.remove_dir( &extension_dir, RemoveOptions { @@ -855,7 +846,19 @@ impl ExtensionStore { ) .await?; + // todo(windows) + // Stop the server here. this.update(cx, |this, cx| this.reload(None, cx))?.await; + + fs.remove_dir( + &work_dir, + RemoveOptions { + recursive: true, + ignore_if_not_exists: true, + }, + ) + .await?; + anyhow::Ok(()) }) .detach_and_log_err(cx)