[&](dds::repository repo) { | [&](dds::repository repo) { | ||||
// Download dependencies | // Download dependencies | ||||
auto deps = repo.solve(man.dependencies, cat); | auto deps = repo.solve(man.dependencies, cat); | ||||
dds::get_all(deps, repo, cat); | |||||
for (const dds::package_id& pk : deps) { | for (const dds::package_id& pk : deps) { | ||||
auto exists = !!repo.find(pk); | |||||
if (!exists) { | |||||
spdlog::info("Download dependency: {}", pk.to_string()); | |||||
auto opt_pkg = cat.get(pk); | |||||
assert(opt_pkg); | |||||
auto tsd = dds::get_package_sdist(*opt_pkg); | |||||
repo.add_sdist(tsd.sdist, dds::if_exists::throw_exc); | |||||
} | |||||
auto sdist_ptr = repo.find(pk); | auto sdist_ptr = repo.find(pk); | ||||
assert(sdist_ptr); | assert(sdist_ptr); | ||||
dds::sdist_build_params deps_params; | dds::sdist_build_params deps_params; | ||||
// Download dependencies | // Download dependencies | ||||
spdlog::info("Loading {} dependencies", all_deps.size()); | spdlog::info("Loading {} dependencies", all_deps.size()); | ||||
auto deps = repo.solve(all_deps, cat); | auto deps = repo.solve(all_deps, cat); | ||||
dds::get_all(deps, repo, cat); | |||||
for (const dds::package_id& pk : deps) { | for (const dds::package_id& pk : deps) { | ||||
auto exists = !!repo.find(pk); | |||||
if (!exists) { | |||||
spdlog::info("Download dependency: {}", pk.to_string()); | |||||
auto opt_pkg = cat.get(pk); | |||||
assert(opt_pkg); | |||||
auto tsd = dds::get_package_sdist(*opt_pkg); | |||||
repo.add_sdist(tsd.sdist, dds::if_exists::throw_exc); | |||||
} | |||||
auto sdist_ptr = repo.find(pk); | auto sdist_ptr = repo.find(pk); | ||||
assert(sdist_ptr); | assert(sdist_ptr); | ||||
dds::sdist_build_params deps_params; | dds::sdist_build_params deps_params; |
#include <dds/catalog/catalog.hpp> | #include <dds/catalog/catalog.hpp> | ||||
#include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
#include <dds/repo/repo.hpp> | |||||
#include <dds/util/parallel.hpp> | |||||
#include <neo/assert.hpp> | #include <neo/assert.hpp> | ||||
#include <nlohmann/json.hpp> | #include <nlohmann/json.hpp> | ||||
#include <range/v3/algorithm/any_of.hpp> | #include <range/v3/algorithm/any_of.hpp> | ||||
#include <range/v3/distance.hpp> | #include <range/v3/distance.hpp> | ||||
#include <range/v3/numeric/accumulate.hpp> | #include <range/v3/numeric/accumulate.hpp> | ||||
#include <range/v3/view/filter.hpp> | |||||
#include <range/v3/view/transform.hpp> | |||||
#include <spdlog/spdlog.h> | #include <spdlog/spdlog.h> | ||||
using namespace dds; | using namespace dds; | ||||
tsd.sdist.manifest.pkg_id.to_string()); | tsd.sdist.manifest.pkg_id.to_string()); | ||||
} | } | ||||
return tsd; | return tsd; | ||||
} | |||||
} | |||||
void dds::get_all(const std::vector<package_id>& pkgs, repository& repo, const catalog& cat) { | |||||
std::mutex repo_mut; | |||||
auto absent_pkg_infos = pkgs // | |||||
| ranges::views::filter([&](auto pk) { | |||||
std::scoped_lock lk{repo_mut}; | |||||
return !repo.find(pk); | |||||
}) | |||||
| ranges::views::transform([&](auto id) { | |||||
auto info = cat.get(id); | |||||
neo_assert(invariant, | |||||
info.has_value(), | |||||
"No catalog entry for package id?", | |||||
id.to_string()); | |||||
return *info; | |||||
}); | |||||
auto okay = parallel_run(absent_pkg_infos, 8, [&](package_info inf) { | |||||
spdlog::info("Download package: {}", inf.ident.to_string()); | |||||
auto tsd = get_package_sdist(inf); | |||||
std::scoped_lock lk{repo_mut}; | |||||
repo.add_sdist(tsd.sdist, if_exists::throw_exc); | |||||
}); | |||||
if (!okay) { | |||||
throw_external_error<errc::dependency_resolve_failure>("Downloading of packages failed."); | |||||
} | |||||
} |
namespace dds { | namespace dds { | ||||
class repository; | |||||
class catalog; | |||||
struct package_info; | struct package_info; | ||||
struct temporary_sdist { | struct temporary_sdist { | ||||
temporary_sdist get_package_sdist(const package_info&); | temporary_sdist get_package_sdist(const package_info&); | ||||
} // namespace dds | |||||
void get_all(const std::vector<package_id>& pkgs, dds::repository& repo, const catalog& cat); | |||||
} // namespace dds |
void sdist_export_file(path_ref out_root, path_ref in_root, path_ref filepath) { | void sdist_export_file(path_ref out_root, path_ref in_root, path_ref filepath) { | ||||
auto relpath = fs::relative(filepath, in_root); | auto relpath = fs::relative(filepath, in_root); | ||||
spdlog::info("Export file {}", relpath.string()); | |||||
spdlog::debug("Export file {}", relpath.string()); | |||||
auto dest = out_root / relpath; | auto dest = out_root / relpath; | ||||
fs::create_directories(dest.parent_path()); | fs::create_directories(dest.parent_path()); | ||||
fs::copy(filepath, dest); | fs::copy(filepath, dest); |