Skip to main content

uv_installer/
uninstall.rs

1use uv_distribution_types::{InstalledDist, InstalledDistKind, InstalledEggInfoFile};
2use uv_install_wheel::Layout;
3
4/// Uninstall a package from the specified Python environment.
5pub 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}