cargo/ops/registry/
yank.rs

1//! Interacts with the registry [yank] and [unyank] API.
2//!
3//! [yank]: https://doc.rust-lang.org/nightly/cargo/reference/registry-web-api.html#yank
4//! [unyank]: https://doc.rust-lang.org/nightly/cargo/reference/registry-web-api.html#unyank
5
6use anyhow::bail;
7use anyhow::Context as _;
8use cargo_credential::Operation;
9use cargo_credential::Secret;
10
11use crate::core::Workspace;
12use crate::util::context::GlobalContext;
13use crate::util::errors::CargoResult;
14use crate::util::important_paths::find_root_manifest_for_wd;
15
16use super::RegistryOrIndex;
17
18pub fn yank(
19    gctx: &GlobalContext,
20    krate: Option<String>,
21    version: Option<String>,
22    token: Option<Secret<String>>,
23    reg_or_index: Option<RegistryOrIndex>,
24    undo: bool,
25) -> CargoResult<()> {
26    let name = match krate {
27        Some(name) => name,
28        None => {
29            let manifest_path = find_root_manifest_for_wd(gctx.cwd())?;
30            let ws = Workspace::new(&manifest_path, gctx)?;
31            ws.current()?.package_id().name().to_string()
32        }
33    };
34    let Some(version) = version else {
35        bail!("a version must be specified to yank")
36    };
37
38    let message = if undo {
39        Operation::Unyank {
40            name: &name,
41            vers: &version,
42        }
43    } else {
44        Operation::Yank {
45            name: &name,
46            vers: &version,
47        }
48    };
49    let source_ids = super::get_source_id(gctx, reg_or_index.as_ref())?;
50    let (mut registry, _) = super::registry(
51        gctx,
52        &source_ids,
53        token.as_ref().map(Secret::as_deref),
54        reg_or_index.as_ref(),
55        true,
56        Some(message),
57    )?;
58
59    let package_spec = format!("{}@{}", name, version);
60    if undo {
61        gctx.shell().status("Unyank", package_spec)?;
62        registry.unyank(&name, &version).with_context(|| {
63            format!(
64                "failed to undo a yank from the registry at {}",
65                registry.host()
66            )
67        })?;
68    } else {
69        gctx.shell().status("Yank", package_spec)?;
70        registry
71            .yank(&name, &version)
72            .with_context(|| format!("failed to yank from the registry at {}", registry.host()))?;
73    }
74
75    Ok(())
76}