bpt 0.1.6

Bedrock Linux package manager
use crate::{
    cli::*, collection::*, color::Color, constant::*, error::*, file::*, io::*, metadata::*,
};

pub fn fetch(flags: CommonFlags, pkgs: Vec<PartId>) -> Result<String, Err> {
    let bpt_conf = &BptConf::from_root_path(&flags.root_dir)?;
    let pubkeys = &PublicKeys::from_common_flags(&flags)?;
    let netutil = &NetUtil::new(bpt_conf, flags.netutil_stderr);
    let query_credentials = QueryCredentials::new(bpt_conf);
    let mut pkgcache = Cache::from_root_path(&flags.root_dir, PKG_CACHE, "package cache")?;
    let repository_pkgs = &RepositoryPkgs::from_root_path(&flags.root_dir, pubkeys)?;

    let mut resolved = Vec::new();
    for partid in &pkgs {
        let pkginfo = repository_pkgs
            .best_pkg_match(partid, &bpt_conf.general.default_archs)
            .ok_or_else(|| Err::UnableToLocateAvailablePkg(partid.clone()))?;
        resolved.push(pkginfo);
    }

    if flags.dry_run {
        for pkginfo in &resolved {
            println!(
                "{}Would{} fetch {}",
                Color::Warn,
                Color::Default,
                pkginfo.repopath.color()
            );
        }
        return Ok(format!("Dry ran fetch of {} package(s)", pkgs.len()));
    }

    let mut first = None;
    for pkginfo in resolved {
        let pkg = pkginfo.repopath.as_pkg_path_url()?.open(
            netutil,
            &mut pkgcache,
            pubkeys,
            Some(&flags.out_dir),
            Some(&query_credentials),
        )?;

        let filename = pkg.pkgid().canonical_filename();
        let path = flags.out_dir.join(&filename);
        pkg.link(&path)?;

        first = first.or(Some(filename));
    }

    if pkgs.len() == 1
        && let Some(first) = first
    {
        Ok(format!("Fetched {}", first))
    } else {
        Ok(format!("Fetched all {} packages", pkgs.len()))
    }
}