Skip to main content

zoi_cli/cmd/
pin.rs

1//! Pinning packages to specific versions.
2
3use anyhow::Result;
4use colored::Colorize;
5
6use crate::pkg::{pin, resolve};
7
8/// Pins a package to a specific version.
9///
10/// This prevents the package from being updated to a newer version during
11/// general upgrades.
12///
13/// # Errors
14///
15/// Returns an error if the package cannot be resolved or if the pinned packages
16/// file cannot be read or written.
17pub fn run(source: &str, version: &str) -> Result<()> {
18    let (pkg, _, _, _, _registry_handle, _, _) =
19        resolve::resolve_package_and_version(source, None, false, false)?;
20    let mut pinned_packages = pin::get_pinned_packages()?;
21
22    if pinned_packages.iter().any(|p| p.source == pkg.name) {
23        println!(
24            "Package '{}' is already pinned. Unpin it first to change the \
25             version.",
26            pkg.name
27        );
28        return Ok(());
29    }
30
31    let new_pin = pin::PinnedPackage {
32        source: pkg.name.clone(),
33        version: version.to_string()
34    };
35    pinned_packages.push(new_pin);
36    pin::write_pinned_packages(&pinned_packages)?;
37
38    println!("Pinned {}@{}", pkg.name.green(), version.yellow());
39    Ok(())
40}