void fetch_packages()

in include/poac/subcmd/install.hpp [80:149]


        void fetch_packages(
                const core::resolver::Backtracked& deps,
                const bool quite,
                const bool verbose)
        {
            namespace exception = core::exception;
            namespace naming = core::naming;
            namespace path = io::file::path;
            namespace tb = io::file::tarball;
            namespace resolver = core::resolver;
            namespace fs = boost::filesystem;

            int exists_count = 0;
            for (const auto& [name, dep] : deps) {
                const auto cache_name = naming::to_cache(dep.source, name, dep.version);
                const auto current_name = naming::to_current(dep.source, name, dep.version);
                const bool is_cached = resolver::cache::resolve(cache_name);

                if (verbose) {
                    std::cout << "NAME: " << name << "\n"
                              << "  VERSION: " <<  dep.version << "\n"
                              << "  SOURCE: " << dep.source << "\n"
                              << "  CACHE_NAME: " << cache_name << "\n"
                              << "  CURRENT_NAME: " << current_name << "\n"
                              << "  IS_CACHED: " << is_cached << "\n"
                              << std::endl;
                }

                if (resolver::current::resolve(current_name)) {
                    ++exists_count;
                    continue;
                }
                else if (is_cached) {
                    const bool res = copy_to_current(cache_name, current_name);
                    if (!quite) {
                        echo_install_status(res, name, dep.version, dep.source);
                    }
                }
                else if (dep.source == "poac" || dep.source == "github") {
                    const auto pkg_dir = path::poac_cache_dir / cache_name;
                    const auto tar_dir = pkg_dir.string() + ".tar.gz";
                    std::string target;
                    std::string host;
                    if (dep.source == "poac") {
                        target = resolver::archive_url(name, dep.version);
                        host = POAC_STORAGE_HOST;
                    }
                    else {
                        target = resolver::github::archive_url(name, dep.version);
                        host = GITHUB_HOST;
                    }

                    io::network::get(target, tar_dir, POAC_STORAGE_HOST);
                    // If res is true, does not execute func. (short-circuit evaluation)
                    bool res = tb::extract_spec_rm(tar_dir, pkg_dir);
                    res = res || copy_to_current(cache_name, current_name);

                    if (!quite) {
                        echo_install_status(res, name, dep.version, dep.source);
                    }
                }
                else {
                    // If called this, it is a bug.
                    throw exception::error("Unexcepted error");
                }
            }
            if (exists_count == static_cast<int>(deps.size())) {
                io::cli::echo(io::cli::to_yellow("WARN: "), "Already installed");
            }
        }