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");
}
}