| @@ -623,15 +623,8 @@ struct cli_build { | |||
| [&](dds::repository repo) { | |||
| // Download dependencies | |||
| auto deps = repo.solve(man.dependencies, cat); | |||
| dds::get_all(deps, repo, cat); | |||
| 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); | |||
| assert(sdist_ptr); | |||
| dds::sdist_build_params deps_params; | |||
| @@ -717,15 +710,8 @@ struct cli_build_deps { | |||
| // Download dependencies | |||
| spdlog::info("Loading {} dependencies", all_deps.size()); | |||
| auto deps = repo.solve(all_deps, cat); | |||
| dds::get_all(deps, repo, cat); | |||
| 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); | |||
| assert(sdist_ptr); | |||
| dds::sdist_build_params deps_params; | |||
| @@ -2,6 +2,8 @@ | |||
| #include <dds/catalog/catalog.hpp> | |||
| #include <dds/error/errors.hpp> | |||
| #include <dds/repo/repo.hpp> | |||
| #include <dds/util/parallel.hpp> | |||
| #include <neo/assert.hpp> | |||
| #include <nlohmann/json.hpp> | |||
| @@ -9,6 +11,8 @@ | |||
| #include <range/v3/algorithm/any_of.hpp> | |||
| #include <range/v3/distance.hpp> | |||
| #include <range/v3/numeric/accumulate.hpp> | |||
| #include <range/v3/view/filter.hpp> | |||
| #include <range/v3/view/transform.hpp> | |||
| #include <spdlog/spdlog.h> | |||
| using namespace dds; | |||
| @@ -75,4 +79,33 @@ temporary_sdist dds::get_package_sdist(const package_info& pkg) { | |||
| tsd.sdist.manifest.pkg_id.to_string()); | |||
| } | |||
| 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."); | |||
| } | |||
| } | |||
| @@ -5,6 +5,8 @@ | |||
| namespace dds { | |||
| class repository; | |||
| class catalog; | |||
| struct package_info; | |||
| struct temporary_sdist { | |||
| @@ -14,4 +16,6 @@ struct temporary_sdist { | |||
| 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 | |||
| @@ -18,7 +18,7 @@ namespace { | |||
| void sdist_export_file(path_ref out_root, path_ref in_root, path_ref filepath) { | |||
| auto relpath = fs::relative(filepath, in_root); | |||
| spdlog::info("Export file {}", relpath.string()); | |||
| spdlog::debug("Export file {}", relpath.string()); | |||
| auto dest = out_root / relpath; | |||
| fs::create_directories(dest.parent_path()); | |||
| fs::copy(filepath, dest); | |||