uv_installer/
uninstall.rs1use uv_distribution_types::{InstalledDist, InstalledDistKind, InstalledEggInfoFile};
2use uv_install_wheel::Layout;
3
4pub async fn uninstall(
6 dist: &InstalledDist,
7 layout: &Layout,
8) -> Result<uv_install_wheel::Uninstall, UninstallError> {
9 let uninstall = tokio::task::spawn_blocking({
10 let dist = dist.clone();
11 let layout = layout.clone();
12 move || match dist.kind {
13 InstalledDistKind::Registry(_) | InstalledDistKind::Url(_) => Ok(
14 uv_install_wheel::uninstall_wheel(dist.install_path(), &dist, &layout)?,
15 ),
16 InstalledDistKind::EggInfoDirectory(_) => Ok(uv_install_wheel::uninstall_egg(
17 dist.install_path(),
18 &dist,
19 &layout,
20 )?),
21 InstalledDistKind::LegacyEditable(dist) => {
22 Ok(uv_install_wheel::uninstall_legacy_editable(&dist.egg_link)?)
23 }
24 InstalledDistKind::EggInfoFile(dist) => Err(UninstallError::Distutils(dist)),
25 }
26 })
27 .await??;
28
29 Ok(uninstall)
30}
31
32#[derive(thiserror::Error, Debug)]
33pub enum UninstallError {
34 #[error(
35 "Unable to uninstall `{0}`. distutils-installed distributions do not include the metadata required to uninstall safely."
36 )]
37 Distutils(InstalledEggInfoFile),
38 #[error(transparent)]
39 Uninstall(#[from] uv_install_wheel::Error),
40 #[error(transparent)]
41 Join(#[from] tokio::task::JoinError),
42}