cargo-sideload 0.8.1

Tools for working with private Cargo registries
use std::fs::canonicalize;

use cargo::{
    core::{source::Source, Verbosity, Workspace},
    util::config::Config as CargoConfig,
};

use crate::{args::CargoSideloadOutdatedArgs, utils};

pub fn outdated(args: CargoSideloadOutdatedArgs) -> anyhow::Result<()> {
    let cargo_config = CargoConfig::default()?;
    if args.common.quiet {
        cargo_config.shell().set_verbosity(Verbosity::Quiet);
    }

    let manifest_path = canonicalize(args.common.path.join("Cargo.toml"))?;
    let workspace = Workspace::new(&manifest_path, &cargo_config)?;

    let mut registry = utils::create_registry(&cargo_config, &args.common.registry)?;
    let packages = utils::workspace_packages(&cargo_config, &args.common, &workspace)?;

    utils::update_index(&cargo_config, &mut registry)?;

    let mut has_outdated_packages = false;

    let _package_cache_lock = cargo_config.acquire_package_cache_lock()?;

    for package_id in packages {
        // Check if the package is yanked
        if registry.is_yanked(package_id)? {
            println!("{} {} -> yanked", package_id.name(), package_id.version());
            has_outdated_packages = true;
            continue;
        }

        // Check if the version number is behind the latest
        let summaries = utils::package_summaries(&cargo_config, &mut registry, &package_id.name())?;
        let latest_version_summary = utils::latest_version(&summaries);

        match latest_version_summary {
            Some(latest) => {
                if package_id.version() < latest.version() {
                    has_outdated_packages = true;
                    println!(
                        "{} {} -> {}",
                        package_id.name(),
                        package_id.version(),
                        latest.version()
                    );
                }
            }
            None => println!("Package {} not found", package_id.name()),
        }
    }

    if args.error && has_outdated_packages {
        anyhow::bail!("Found outdated packages");
    }

    Ok(())
}