From ffbbcc5d5a89dc0858cc733b5bfbb451a54a248f Mon Sep 17 00:00:00 2001 From: AntoinePrv Date: Tue, 28 Nov 2023 13:53:13 +0100 Subject: [PATCH 1/5] Remove some ChannelContext::context --- libmamba/include/mamba/api/info.hpp | 4 +- libmamba/include/mamba/api/install.hpp | 2 + libmamba/include/mamba/api/list.hpp | 3 +- libmamba/include/mamba/api/remove.hpp | 3 + libmamba/include/mamba/api/update.hpp | 8 +- libmamba/include/mamba/core/pool.hpp | 2 +- libmamba/src/api/create.cpp | 3 +- libmamba/src/api/info.cpp | 7 +- libmamba/src/api/install.cpp | 24 +++--- libmamba/src/api/list.cpp | 6 +- libmamba/src/api/remove.cpp | 11 ++- libmamba/src/api/repoquery.cpp | 9 +-- libmamba/src/api/update.cpp | 2 +- libmamba/src/core/pool.cpp | 23 +++--- libmamba/src/core/subdirdata.cpp | 4 +- libmamba/src/core/transaction.cpp | 4 +- libmamba/tests/src/core/test_env_lockfile.cpp | 2 +- .../src/core/test_satisfiability_error.cpp | 80 +++++++++++-------- libmambapy/src/libmambapy/bindings/legacy.cpp | 5 +- micromamba/src/install.cpp | 1 - micromamba/src/server.cpp | 2 +- micromamba/src/umamba.hpp | 5 ++ micromamba/src/update.cpp | 2 +- 23 files changed, 117 insertions(+), 95 deletions(-) diff --git a/libmamba/include/mamba/api/info.hpp b/libmamba/include/mamba/api/info.hpp index 3c141f10f0..998f38f909 100644 --- a/libmamba/include/mamba/api/info.hpp +++ b/libmamba/include/mamba/api/info.hpp @@ -8,12 +8,12 @@ #define MAMBA_API_INFO_HPP #include -#include namespace mamba { class ChannelContext; class Configuration; + class Context; void info(Configuration& config); @@ -21,7 +21,7 @@ namespace mamba namespace detail { - void print_info(ChannelContext& channel_context, const Configuration& config); + void print_info(Context& ctx, ChannelContext& channel_context, const Configuration& config); } } diff --git a/libmamba/include/mamba/api/install.hpp b/libmamba/include/mamba/api/install.hpp index 77f1ee3ff4..0299e831cd 100644 --- a/libmamba/include/mamba/api/install.hpp +++ b/libmamba/include/mamba/api/install.hpp @@ -40,12 +40,14 @@ namespace mamba ); void install_explicit_specs( + Context& ctx, ChannelContext& channel_context, const std::vector& specs, bool create_env = false, bool remove_prefix_on_failure = false ); void install_lockfile_specs( + Context& ctx, ChannelContext& channel_context, const std::string& lockfile_specs, const std::vector& categories, diff --git a/libmamba/include/mamba/api/list.hpp b/libmamba/include/mamba/api/list.hpp index 04f7e520fc..fd055df2a5 100644 --- a/libmamba/include/mamba/api/list.hpp +++ b/libmamba/include/mamba/api/list.hpp @@ -13,12 +13,13 @@ namespace mamba { class ChannelContext; class Configuration; + class Context; void list(Configuration& config, const std::string& regex); namespace detail { - void list_packages(std::string regex, ChannelContext& channel_context); + void list_packages(const Context& ctx, std::string regex, ChannelContext& channel_context); struct formatted_pkg; diff --git a/libmamba/include/mamba/api/remove.hpp b/libmamba/include/mamba/api/remove.hpp index ad5330fc48..c77a2fc117 100644 --- a/libmamba/include/mamba/api/remove.hpp +++ b/libmamba/include/mamba/api/remove.hpp @@ -14,13 +14,16 @@ namespace mamba { + class Context; class ChannelContext; + class Configuration; void remove(Configuration& config, int flags = MAMBA_REMOVE_PRUNE); namespace detail { void remove_specs( + Context& ctx, ChannelContext& channel_context, const std::vector& specs, bool prune, diff --git a/libmamba/include/mamba/api/update.hpp b/libmamba/include/mamba/api/update.hpp index ee45122057..680b18d68a 100644 --- a/libmamba/include/mamba/api/update.hpp +++ b/libmamba/include/mamba/api/update.hpp @@ -7,15 +7,11 @@ #ifndef MAMBA_API_UPDATE_HPP #define MAMBA_API_UPDATE_HPP -#include -#include - -#include "mamba/core/query.hpp" -#include "mamba/fs/filesystem.hpp" - namespace mamba { + class Configuration; + void update( Configuration& config, bool update_all = false, diff --git a/libmamba/include/mamba/core/pool.hpp b/libmamba/include/mamba/core/pool.hpp index 3a3fb3f258..bcc4247b51 100644 --- a/libmamba/include/mamba/core/pool.hpp +++ b/libmamba/include/mamba/core/pool.hpp @@ -37,7 +37,7 @@ namespace mamba { public: - MPool(ChannelContext& channel_context); + MPool(Context& ctx, ChannelContext& channel_context); ~MPool(); void set_debuglevel(); diff --git a/libmamba/src/api/create.cpp b/libmamba/src/api/create.cpp index eebd1e7872..c95e2acc40 100644 --- a/libmamba/src/api/create.cpp +++ b/libmamba/src/api/create.cpp @@ -82,6 +82,7 @@ namespace mamba { const auto lockfile_path = ctx.env_lockfile.value(); install_lockfile_specs( + ctx, channel_context, lockfile_path, config.at("categories").value>(), @@ -93,7 +94,7 @@ namespace mamba { if (use_explicit) { - install_explicit_specs(channel_context, create_specs, true, remove_prefix_on_failure); + install_explicit_specs(ctx, channel_context, create_specs, true, remove_prefix_on_failure); } else { diff --git a/libmamba/src/api/info.cpp b/libmamba/src/api/info.cpp index 7290477c83..7379696fec 100644 --- a/libmamba/src/api/info.cpp +++ b/libmamba/src/api/info.cpp @@ -32,7 +32,7 @@ namespace mamba config.load(); auto channel_context = ChannelContext::make_conda_compatible(config.context()); - detail::print_info(channel_context, config); + detail::print_info(config.context(), channel_context, config); config.operation_teardown(); } @@ -88,10 +88,9 @@ namespace mamba Console::instance().json_write(items_map); } - void print_info(ChannelContext& channel_context, const Configuration& config) + void print_info(Context& ctx, ChannelContext& channel_context, const Configuration& config) { - assert(&channel_context.context() == &config.context()); - const auto& ctx = config.context(); + assert(&ctx == &config.context()); std::vector> items; items.push_back({ "libmamba version", version() }); diff --git a/libmamba/src/api/install.cpp b/libmamba/src/api/install.cpp index cd1d13c88d..5b416a651a 100644 --- a/libmamba/src/api/install.cpp +++ b/libmamba/src/api/install.cpp @@ -381,6 +381,8 @@ namespace mamba void install(Configuration& config) { + auto& ctx = config.context(); + config.at("create_base").set_value(true); config.at("use_target_prefix_fallback").set_value(true); config.at("target_prefix_checks") @@ -401,6 +403,7 @@ namespace mamba const auto lockfile_path = context.env_lockfile.value(); LOG_DEBUG << "Lockfile: " << lockfile_path; install_lockfile_specs( + ctx, channel_context, lockfile_path, config.at("categories").value>(), @@ -411,7 +414,7 @@ namespace mamba { if (use_explicit) { - install_explicit_specs(channel_context, install_specs, false); + install_explicit_specs(ctx, channel_context, install_specs, false); } else { @@ -475,7 +478,7 @@ namespace mamba LOG_WARNING << "No 'channels' specified"; } - MPool pool{ channel_context }; + MPool pool{ ctx, channel_context }; // functions implied in 'and_then' coding-styles must return the same type // which limits this syntax /*auto exp_prefix_data = load_channels(pool, package_caches, is_retry) @@ -636,19 +639,19 @@ namespace mamba } } - namespace detail + namespace { // TransactionFunc: (MPool& pool, MultiPackageCache& package_caches) -> MTransaction template void install_explicit_with_transaction( + Context& ctx, ChannelContext& channel_context, TransactionFunc create_transaction, bool create_env, bool remove_prefix_on_failure ) { - MPool pool{ channel_context }; - auto& ctx = channel_context.context(); + MPool pool{ ctx, channel_context }; auto exp_prefix_data = PrefixData::create(ctx.prefix_params.target_prefix, channel_context); if (!exp_prefix_data) { @@ -707,13 +710,15 @@ namespace mamba } void install_explicit_specs( + Context& ctx, ChannelContext& channel_context, const std::vector& specs, bool create_env, bool remove_prefix_on_failure ) { - detail::install_explicit_with_transaction( + install_explicit_with_transaction( + ctx, channel_context, [&](auto& pool, auto& pkg_caches, auto& others) { return create_explicit_transaction_from_urls(pool, specs, pkg_caches, others); }, @@ -723,9 +728,9 @@ namespace mamba } void install_lockfile_specs( + Context& ctx, ChannelContext& channel_context, const std::string& lockfile, - const std::vector& categories, bool create_env, bool remove_prefix_on_failure @@ -739,7 +744,7 @@ namespace mamba LOG_INFO << "Downloading lockfile"; tmp_lock_file = std::make_unique(); DownloadRequest request("Environment Lockfile", lockfile, tmp_lock_file->path()); - DownloadResult res = download(std::move(request), channel_context.context()); + DownloadResult res = download(std::move(request), ctx); if (!res || res.value().transfer.http_status != 200) { @@ -755,7 +760,8 @@ namespace mamba file = lockfile; } - detail::install_explicit_with_transaction( + install_explicit_with_transaction( + ctx, channel_context, [&](auto& pool, auto& pkg_caches, auto& others) { return create_explicit_transaction_from_lockfile(pool, file, categories, pkg_caches, others); diff --git a/libmamba/src/api/list.cpp b/libmamba/src/api/list.cpp index e274d42877..6a48ca0c94 100644 --- a/libmamba/src/api/list.cpp +++ b/libmamba/src/api/list.cpp @@ -26,7 +26,7 @@ namespace mamba config.load(); auto channel_context = ChannelContext::make_conda_compatible(config.context()); - detail::list_packages(regex, channel_context); + detail::list_packages(config.context(), regex, channel_context); } namespace detail @@ -41,10 +41,8 @@ namespace mamba return a.name < b.name; } - void list_packages(std::string regex, ChannelContext& channel_context) + void list_packages(const Context& ctx, std::string regex, ChannelContext& channel_context) { - auto& ctx = channel_context.context(); - auto sprefix_data = PrefixData::create(ctx.prefix_params.target_prefix, channel_context); if (!sprefix_data) { diff --git a/libmamba/src/api/remove.cpp b/libmamba/src/api/remove.cpp index 0832ee663d..e975fbf54b 100644 --- a/libmamba/src/api/remove.cpp +++ b/libmamba/src/api/remove.cpp @@ -19,12 +19,12 @@ namespace mamba { void remove(Configuration& config, int flags) { + auto& ctx = config.context(); + bool prune = flags & MAMBA_REMOVE_PRUNE; bool force = flags & MAMBA_REMOVE_FORCE; bool remove_all = flags & MAMBA_REMOVE_ALL; - auto& ctx = config.context(); - config.at("use_target_prefix_fallback").set_value(true); config.at("target_prefix_checks") .set_value( @@ -54,7 +54,7 @@ namespace mamba if (!remove_specs.empty()) { - detail::remove_specs(channel_context, remove_specs, prune, force); + detail::remove_specs(ctx, channel_context, remove_specs, prune, force); } else { @@ -65,14 +65,13 @@ namespace mamba namespace detail { void remove_specs( + Context& ctx, ChannelContext& channel_context, const std::vector& specs, bool prune, bool force ) { - auto& ctx = channel_context.context(); - if (ctx.prefix_params.target_prefix.empty()) { LOG_ERROR << "No active target prefix."; @@ -87,7 +86,7 @@ namespace mamba } PrefixData& prefix_data = exp_prefix_data.value(); - MPool pool{ channel_context }; + MPool pool{ ctx, channel_context }; MRepo(pool, prefix_data); const fs::u8path pkgs_dirs(ctx.prefix_params.root_prefix / "pkgs"); diff --git a/libmamba/src/api/repoquery.cpp b/libmamba/src/api/repoquery.cpp index dd85349966..5501d0b056 100644 --- a/libmamba/src/api/repoquery.cpp +++ b/libmamba/src/api/repoquery.cpp @@ -21,17 +21,16 @@ namespace mamba { namespace { - auto repoquery_init(Configuration& config, QueryResultFormat format, bool use_local) + auto + repoquery_init(Context& ctx, Configuration& config, QueryResultFormat format, bool use_local) { - auto& ctx = config.context(); - config.at("use_target_prefix_fallback").set_value(true); config.at("target_prefix_checks") .set_value(MAMBA_ALLOW_EXISTING_PREFIX | MAMBA_ALLOW_MISSING_PREFIX); config.load(); auto channel_context = ChannelContext::make_conda_compatible(ctx); - MPool pool{ channel_context }; + MPool pool{ ctx, channel_context }; // bool installed = (type == QueryType::kDepends) || (type == QueryType::kWhoneeds); MultiPackageCache package_caches(ctx.pkgs_dirs, ctx.validation_params); @@ -84,7 +83,7 @@ namespace mamba ) { auto& ctx = config.context(); - auto pool = repoquery_init(config, format, use_local); + auto pool = repoquery_init(ctx, config, format, use_local); Query q(pool); if (type == QueryType::Search) diff --git a/libmamba/src/api/update.cpp b/libmamba/src/api/update.cpp index debb26c39e..94cecc2cb1 100644 --- a/libmamba/src/api/update.cpp +++ b/libmamba/src/api/update.cpp @@ -46,7 +46,7 @@ namespace mamba int solver_flag = SOLVER_UPDATE; - MPool pool{ channel_context }; + MPool pool{ ctx, channel_context }; MultiPackageCache package_caches(ctx.pkgs_dirs, ctx.validation_params); auto exp_loaded = load_channels(pool, package_caches, 0); diff --git a/libmamba/src/core/pool.cpp b/libmamba/src/core/pool.cpp index 2cc207269e..e87e663302 100644 --- a/libmamba/src/core/pool.cpp +++ b/libmamba/src/core/pool.cpp @@ -30,17 +30,19 @@ namespace mamba { struct MPool::MPoolData { - MPoolData(ChannelContext& cc) - : channel_context(cc) + MPoolData(Context& ctx, ChannelContext& cc) + : context(ctx) + , channel_context(cc) { } solv::ObjPool pool = {}; + Context& context; ChannelContext& channel_context; }; - MPool::MPool(ChannelContext& channel_context) - : m_data(std::make_shared(channel_context)) + MPool::MPool(Context& ctx, ChannelContext& channel_context) + : m_data(std::make_shared(ctx, channel_context)) { pool().set_disttype(DISTTYPE_CONDA); set_debuglevel(); @@ -55,7 +57,7 @@ namespace mamba const Context& MPool::context() const { - return channel_context().context(); + return m_data->context; } solv::ObjPool& MPool::pool() @@ -72,13 +74,12 @@ namespace mamba { // ensure that debug logging goes to stderr as to not interfere with stdout json output pool().raw()->debugmask |= SOLV_DEBUG_TO_STDERR; - const auto& context = channel_context().context(); - if (context.output_params.verbosity > 2) + const auto& ctx = context(); + if (ctx.output_params.verbosity > 2) { - pool_setdebuglevel(pool().raw(), context.output_params.verbosity - 1); + pool_setdebuglevel(pool().raw(), ctx.output_params.verbosity - 1); pool().set_debug_callback( - [logger = spdlog::get("libsolv"), - &context](::Pool*, int type, std::string_view msg) noexcept + [logger = spdlog::get("libsolv"), &ctx](::Pool*, int type, std::string_view msg) noexcept { if (msg.size() == 0 || msg.back() != '\n') { @@ -94,7 +95,7 @@ namespace mamba { logger->warn(log); } - else if (context.output_params.verbosity > 2) + else if (ctx.output_params.verbosity > 2) { logger->info(log); } diff --git a/libmamba/src/core/subdirdata.cpp b/libmamba/src/core/subdirdata.cpp index f60e9af05b..3aa47be508 100644 --- a/libmamba/src/core/subdirdata.cpp +++ b/libmamba/src/core/subdirdata.cpp @@ -578,7 +578,7 @@ namespace mamba LOG_INFO << "Searching index cache file for repo '" << m_repodata_url << "'"; file_time_point now = fs::file_time_type::clock::now(); - const Context& context = channel_context.context(); + const Context& context = *p_context; const auto cache_paths = without_duplicates(caches.paths()); for (const fs::u8path& cache_path : cache_paths) @@ -656,7 +656,7 @@ namespace mamba void MSubdirData::update_metadata_zst(ChannelContext& channel_context, const specs::Channel& channel) { - const Context& context = channel_context.context(); + const Context& context = *p_context; if (!context.offline || forbid_cache(m_repodata_url)) { m_metadata.set_zst(m_metadata.has_zst() || channel_context.has_zst(channel)); diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index c0c4d8d1ce..d1ad8b829a 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -838,7 +838,7 @@ namespace mamba { FetcherList fetchers; auto& channel_context = pool.channel_context(); - auto& ctx = channel_context.context(); + auto& ctx = pool.context(); if (ctx.experimental && ctx.validation_params.verify_artifacts) { @@ -1009,7 +1009,7 @@ namespace mamba bool MTransaction::fetch_extract_packages() { - auto& ctx = m_pool.channel_context().context(); + auto& ctx = m_pool.context(); PackageFetcherSemaphore::set_max(ctx.threads_params.extract_threads); FetcherList fetchers = build_fetchers(m_pool, m_solution, m_multi_cache); diff --git a/libmamba/tests/src/core/test_env_lockfile.cpp b/libmamba/tests/src/core/test_env_lockfile.cpp index 7f258fa88b..81d83bbfd4 100644 --- a/libmamba/tests/src/core/test_env_lockfile.cpp +++ b/libmamba/tests/src/core/test_env_lockfile.cpp @@ -140,7 +140,7 @@ namespace mamba const fs::u8path lockfile_path{ mambatests::test_data_dir / "env_lockfile/good_multiple_categories-lock.yaml" }; auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); - MPool pool{ channel_context }; + MPool pool{ ctx, channel_context }; mamba::MultiPackageCache pkg_cache({ "/tmp/" }, ctx.validation_params); ctx.platform = "linux-64"; diff --git a/libmamba/tests/src/core/test_satisfiability_error.cpp b/libmamba/tests/src/core/test_satisfiability_error.cpp index 3ff6414dc9..1e2042ae1d 100644 --- a/libmamba/tests/src/core/test_satisfiability_error.cpp +++ b/libmamba/tests/src/core/test_satisfiability_error.cpp @@ -5,7 +5,6 @@ // The full license is in the file LICENSE, distributed with this software. #include -#include #include #include @@ -143,6 +142,7 @@ namespace */ template auto create_problem( + Context& ctx, ChannelContext& channel_context, const PkgRange& packages, const std::vector& specs @@ -153,7 +153,7 @@ namespace ); const auto repodata_f = create_repodata_json(tmp_dir.path, packages); - auto pool = MPool{ channel_context }; + auto pool = MPool{ ctx, channel_context }; MRepo(pool, "some-name", repodata_f, RepoMetadata{ /* .url= */ "some-url" }); auto solver = MSolver( std::move(pool), @@ -167,16 +167,19 @@ namespace TEST_CASE("Test create_problem utility") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); - auto solver = create_problem(channel_context, std::array{ mkpkg("foo", "0.1.0", {}) }, { "foo" }); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); + auto solver = create_problem(ctx, channel_context, std::array{ mkpkg("foo", "0.1.0", {}) }, { "foo" }); const auto solved = solver.try_solve(); REQUIRE(solved); } TEST_CASE("Test empty specs") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); auto solver = create_problem( + ctx, channel_context, std::array{ mkpkg("foo", "0.1.0", {}), mkpkg("", "", {}) }, { "foo" } @@ -187,9 +190,10 @@ TEST_CASE("Test empty specs") namespace { - auto create_basic_conflict(ChannelContext& channel_context) -> MSolver + auto create_basic_conflict(Context& ctx, ChannelContext& channel_context) -> MSolver { return create_problem( + ctx, channel_context, std::array{ mkpkg("A", "0.1.0"), @@ -206,9 +210,10 @@ namespace * The example given by Natalie Weizenbaum * (credits https://nex3.medium.com/pubgrub-2fb6470504f). */ - auto create_pubgrub(ChannelContext& channel_context) -> MSolver + auto create_pubgrub(Context& ctx, ChannelContext& channel_context) -> MSolver { return create_problem( + ctx, channel_context, std::array{ mkpkg("menu", "1.5.0", { "dropdown=2.*" }), @@ -232,7 +237,8 @@ namespace ); } - auto create_pubgrub_hard_(ChannelContext& channel_context, bool missing_package) -> MSolver + auto create_pubgrub_hard_(Context& ctx, ChannelContext& channel_context, bool missing_package) + -> MSolver { auto packages = std::vector{ mkpkg("menu", "2.1.0", { "dropdown>=2.1", "emoji" }), @@ -282,6 +288,7 @@ namespace packages.push_back(mkpkg("dropdown", "2.9.0", { "libicons>10.0" })); } return create_problem( + ctx, channel_context, packages, { "menu", "pyicons=1.*", "intl=5.*", "intl-mod", "pretty>=1.0" } @@ -291,17 +298,17 @@ namespace /** * A harder version of ``create_pubgrub``. */ - auto create_pubgrub_hard(ChannelContext& channel_context) -> MSolver + auto create_pubgrub_hard(Context& ctx, ChannelContext& channel_context) -> MSolver { - return create_pubgrub_hard_(channel_context, false); + return create_pubgrub_hard_(ctx, channel_context, false); } /** * The hard version of the alternate PubGrub with missing packages. */ - auto create_pubgrub_missing(ChannelContext& channel_context) -> MSolver + auto create_pubgrub_missing(Context& ctx, ChannelContext& channel_context) -> MSolver { - return create_pubgrub_hard_(channel_context, true); + return create_pubgrub_hard_(ctx, channel_context, true); } template @@ -360,6 +367,7 @@ namespace * Create a solver and a pool of a conflict from conda-forge packages. */ auto create_conda_forge( + Context& ctx, ChannelContext& channel_context, std::vector&& specs, const std::vector& virtual_packages = { mkpkg("__glibc", "2.17.0") }, @@ -376,17 +384,14 @@ namespace PrefixData::create(tmp_dir.path / "prefix", channel_context) ); prefix_data.add_packages(virtual_packages); - auto pool = MPool{ channel_context }; + auto pool = MPool{ ctx, channel_context }; auto repo = MRepo{ pool, prefix_data }; repo.set_installed(); - auto cache = MultiPackageCache( - { tmp_dir.path / "cache" }, - channel_context.context().validation_params - ); + auto cache = MultiPackageCache({ tmp_dir.path / "cache" }, ctx.validation_params); create_cache_dir(cache.first_writable_path()); - bool prev_progress_bars_value = channel_context.context().graphics_params.no_progress_bars; + bool prev_progress_bars_value = ctx.graphics_params.no_progress_bars; mambatests::context().graphics_params.no_progress_bars = true; load_channels(pool, cache, make_platform_channels(std::move(channels), platforms)); mambatests::context().graphics_params.no_progress_bars = prev_progress_bars_value; @@ -403,63 +408,67 @@ namespace TEST_CASE("Test create_conda_forge utility") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); - auto solver = create_conda_forge(channel_context, { "xtensor>=0.7" }); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); + auto solver = create_conda_forge(ctx, channel_context, { "xtensor>=0.7" }); const auto solved = solver.try_solve(); REQUIRE(solved); } namespace { - auto create_pytorch_cpu(ChannelContext& channel_context) -> MSolver + auto create_pytorch_cpu(Context& ctx, ChannelContext& channel_context) -> MSolver { - return create_conda_forge(channel_context, { "python=2.7", "pytorch=1.12" }); + return create_conda_forge(ctx, channel_context, { "python=2.7", "pytorch=1.12" }); } - auto create_pytorch_cuda(ChannelContext& channel_context) -> MSolver + auto create_pytorch_cuda(Context& ctx, ChannelContext& channel_context) -> MSolver { return create_conda_forge( + ctx, channel_context, { "python=2.7", "pytorch=1.12" }, { mkpkg("__glibc", "2.17.0"), mkpkg("__cuda", "10.2.0") } ); } - auto create_cudatoolkit(ChannelContext& channel_context) -> MSolver + auto create_cudatoolkit(Context& ctx, ChannelContext& channel_context) -> MSolver { return create_conda_forge( + ctx, channel_context, { "python=3.7", "cudatoolkit=11.1", "cudnn=8.0", "pytorch=1.8", "torchvision=0.9=*py37_cu111*" }, { mkpkg("__glibc", "2.17.0"), mkpkg("__cuda", "11.1") } ); } - auto create_jpeg9b(ChannelContext& channel_context) -> MSolver + auto create_jpeg9b(Context& ctx, ChannelContext& channel_context) -> MSolver { - return create_conda_forge(channel_context, { "python=3.7", "jpeg=9b" }); + return create_conda_forge(ctx, channel_context, { "python=3.7", "jpeg=9b" }); } - auto create_r_base(ChannelContext& channel_context) -> MSolver + auto create_r_base(Context& ctx, ChannelContext& channel_context) -> MSolver { return create_conda_forge( + ctx, channel_context, { "r-base=3.5.* ", "pandas=0", "numpy<1.20.0", "matplotlib=2", "r-matchit=4.*" } ); } - auto create_scip(ChannelContext& channel_context) -> MSolver + auto create_scip(Context& ctx, ChannelContext& channel_context) -> MSolver { - return create_conda_forge(channel_context, { "scip=8.*", "pyscipopt<4.0" }); + return create_conda_forge(ctx, channel_context, { "scip=8.*", "pyscipopt<4.0" }); } - auto create_double_python(ChannelContext& channel_context) -> MSolver + auto create_double_python(Context& ctx, ChannelContext& channel_context) -> MSolver { - return create_conda_forge(channel_context, { "python=3.9.*", "python=3.10.*" }); + return create_conda_forge(ctx, channel_context, { "python=3.9.*", "python=3.10.*" }); } - auto create_numba(ChannelContext& channel_context) -> MSolver + auto create_numba(Context& ctx, ChannelContext& channel_context) -> MSolver { - return create_conda_forge(channel_context, { "python=3.11", "numba<0.56" }); + return create_conda_forge(ctx, channel_context, { "python=3.11", "numba<0.56" }); } template @@ -534,12 +543,13 @@ TEST_CASE("Create problem graph") for (const auto& [name, factory] : issues) { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); // Somehow the capture does not work directly on ``name`` std::string_view name_copy = name; CAPTURE(name_copy); - auto solver = factory(channel_context); + auto solver = factory(ctx, channel_context); const auto solved = solver.try_solve(); REQUIRE_FALSE(solved); const auto pbs_init = solver.problems_graph(); diff --git a/libmambapy/src/libmambapy/bindings/legacy.cpp b/libmambapy/src/libmambapy/bindings/legacy.cpp index 3dd910b9d3..bf506236af 100644 --- a/libmambapy/src/libmambapy/bindings/legacy.cpp +++ b/libmambapy/src/libmambapy/bindings/legacy.cpp @@ -305,7 +305,10 @@ bind_submodule_impl(pybind11::module_ m) .def("conda_build_form", &MatchSpec::conda_build_form); py::class_(m, "Pool") - .def(py::init<>([] { return MPool{ mambapy::singletons.channel_context() }; })) + .def(py::init<>( + [] + { return MPool{ mambapy::singletons.context(), mambapy::singletons.channel_context() }; } + )) .def("set_debuglevel", &MPool::set_debuglevel) .def("create_whatprovides", &MPool::create_whatprovides) .def("select_solvables", &MPool::select_solvables, py::arg("id"), py::arg("sorted") = false) diff --git a/micromamba/src/install.cpp b/micromamba/src/install.cpp index 47ab3689af..62d1c9e217 100644 --- a/micromamba/src/install.cpp +++ b/micromamba/src/install.cpp @@ -1,6 +1,5 @@ #include "mamba/api/configuration.hpp" #include "mamba/api/install.hpp" -#include "mamba/core/channel_context.hpp" #include "common_options.hpp" diff --git a/micromamba/src/server.cpp b/micromamba/src/server.cpp index dfd77b81de..d8899e836a 100644 --- a/micromamba/src/server.cpp +++ b/micromamba/src/server.cpp @@ -40,7 +40,7 @@ load_pool( ) { ctx.channels = channels; - mamba::MPool pool{ channel_context }; + mamba::MPool pool{ ctx, channel_context }; auto exp_load = load_channels(pool, package_caches, false); if (!exp_load) { diff --git a/micromamba/src/umamba.hpp b/micromamba/src/umamba.hpp index 402f37ebb3..d9d03eeeb8 100644 --- a/micromamba/src/umamba.hpp +++ b/micromamba/src/umamba.hpp @@ -9,6 +9,11 @@ #include +namespace mamba +{ + class Configuration; +} + void set_clean_command(CLI::App* subcom, mamba::Configuration& config); diff --git a/micromamba/src/update.cpp b/micromamba/src/update.cpp index bf6003228d..65fe042b36 100644 --- a/micromamba/src/update.cpp +++ b/micromamba/src/update.cpp @@ -38,7 +38,7 @@ update_self(Configuration& config, const std::optional& version) ctx.prefix_params.target_prefix = ctx.prefix_params.root_prefix; auto channel_context = ChannelContext::make_conda_compatible(ctx); - mamba::MPool pool{ channel_context }; + mamba::MPool pool{ ctx, channel_context }; mamba::MultiPackageCache package_caches(ctx.pkgs_dirs, ctx.validation_params); auto exp_loaded = load_channels(pool, package_caches, 0); From c46f6a85a0b4c953cc7e45c763e2a856e695d3ad Mon Sep 17 00:00:00 2001 From: AntoinePrv Date: Tue, 28 Nov 2023 14:05:22 +0100 Subject: [PATCH 2/5] Explicit Context capture in SubdirData --- libmamba/include/mamba/api/channel_loader.hpp | 13 ++++++++++++- libmamba/include/mamba/core/subdirdata.hpp | 2 ++ libmamba/src/api/channel_loader.cpp | 7 +++---- libmamba/src/api/install.cpp | 2 +- libmamba/src/api/repoquery.cpp | 2 +- libmamba/src/api/update.cpp | 2 +- libmamba/src/core/subdirdata.cpp | 6 ++++-- .../tests/src/core/test_satisfiability_error.cpp | 10 ++++++---- libmambapy/src/libmambapy/bindings/legacy.cpp | 4 +++- micromamba/src/server.cpp | 2 +- micromamba/src/update.cpp | 2 +- 11 files changed, 35 insertions(+), 17 deletions(-) diff --git a/libmamba/include/mamba/api/channel_loader.hpp b/libmamba/include/mamba/api/channel_loader.hpp index 5cc5b97ae9..24f53019e4 100644 --- a/libmamba/include/mamba/api/channel_loader.hpp +++ b/libmamba/include/mamba/api/channel_loader.hpp @@ -1,10 +1,21 @@ +// Copyright (c) 2019, QuantStack and Mamba Contributors +// +// Distributed under the terms of the BSD 3-Clause License. +// +// The full license is in the file LICENSE, distributed with this software. + +#ifndef MAMBA_API_CHANNEL_LOADER_HPP +#define MAMBA_API_CHANNEL_LOADER_HPP + #include "mamba/core/error_handling.hpp" namespace mamba { + class Context; class MPool; class MultiPackageCache; expected_t - load_channels(MPool& pool, MultiPackageCache& package_caches, int is_retry); + load_channels(Context& ctx, MPool& pool, MultiPackageCache& package_caches, int is_retry); } +#endif diff --git a/libmamba/include/mamba/core/subdirdata.hpp b/libmamba/include/mamba/core/subdirdata.hpp index c32178f2e3..738669d96b 100644 --- a/libmamba/include/mamba/core/subdirdata.hpp +++ b/libmamba/include/mamba/core/subdirdata.hpp @@ -102,6 +102,7 @@ namespace mamba public: static expected_t create( + Context& ctx, ChannelContext& channel_context, const specs::Channel& channel, const std::string& platform, @@ -137,6 +138,7 @@ namespace mamba private: MSubdirData( + Context& ctx, ChannelContext& channel_context, const specs::Channel& channel, const std::string& platform, diff --git a/libmamba/src/api/channel_loader.cpp b/libmamba/src/api/channel_loader.cpp index 5b0684c537..128124e5c1 100644 --- a/libmamba/src/api/channel_loader.cpp +++ b/libmamba/src/api/channel_loader.cpp @@ -45,12 +45,10 @@ namespace mamba } expected_t - load_channels(MPool& pool, MultiPackageCache& package_caches, int is_retry) + load_channels(Context& ctx, MPool& pool, MultiPackageCache& package_caches, int is_retry) { int RETRY_SUBDIR_FETCH = 1 << 0; - auto& ctx = pool.context(); - std::vector subdirs; std::vector> priorities; @@ -68,6 +66,7 @@ namespace mamba for (const auto& platform : channel.platforms()) { auto sdires = MSubdirData::create( + ctx, pool.channel_context(), channel, platform, @@ -178,7 +177,7 @@ namespace mamba if (!ctx.offline && !(is_retry & RETRY_SUBDIR_FETCH)) { LOG_WARNING << "Encountered malformed repodata.json cache. Redownloading."; - return load_channels(pool, package_caches, is_retry | RETRY_SUBDIR_FETCH); + return load_channels(ctx, pool, package_caches, is_retry | RETRY_SUBDIR_FETCH); } error_list.push_back(mamba_error( "Could not load repodata. Cache corrupted?", diff --git a/libmamba/src/api/install.cpp b/libmamba/src/api/install.cpp index 5b416a651a..fcf0e77c8f 100644 --- a/libmamba/src/api/install.cpp +++ b/libmamba/src/api/install.cpp @@ -486,7 +486,7 @@ namespace mamba PrefixData::create(ctx.prefix_params.target_prefix); } ) .map_error([](const mamba_error& err) { throw std::runtime_error(err.what()); });*/ - auto exp_load = load_channels(pool, package_caches, is_retry); + auto exp_load = load_channels(ctx, pool, package_caches, is_retry); if (!exp_load) { throw std::runtime_error(exp_load.error().what()); diff --git a/libmamba/src/api/repoquery.cpp b/libmamba/src/api/repoquery.cpp index 5501d0b056..21b8178b48 100644 --- a/libmamba/src/api/repoquery.cpp +++ b/libmamba/src/api/repoquery.cpp @@ -64,7 +64,7 @@ namespace mamba { Console::stream() << "Getting repodata from channels..." << std::endl; } - auto exp_load = load_channels(pool, package_caches, 0); + auto exp_load = load_channels(ctx, pool, package_caches, 0); if (!exp_load) { throw std::runtime_error(exp_load.error().what()); diff --git a/libmamba/src/api/update.cpp b/libmamba/src/api/update.cpp index 94cecc2cb1..ebabd7b99d 100644 --- a/libmamba/src/api/update.cpp +++ b/libmamba/src/api/update.cpp @@ -49,7 +49,7 @@ namespace mamba MPool pool{ ctx, channel_context }; MultiPackageCache package_caches(ctx.pkgs_dirs, ctx.validation_params); - auto exp_loaded = load_channels(pool, package_caches, 0); + auto exp_loaded = load_channels(ctx, pool, package_caches, 0); if (!exp_loaded) { throw std::runtime_error(exp_loaded.error().what()); diff --git a/libmamba/src/core/subdirdata.cpp b/libmamba/src/core/subdirdata.cpp index 3aa47be508..e65d5d0c5d 100644 --- a/libmamba/src/core/subdirdata.cpp +++ b/libmamba/src/core/subdirdata.cpp @@ -395,6 +395,7 @@ namespace mamba } expected_t MSubdirData::create( + Context& ctx, ChannelContext& channel_context, const specs::Channel& channel, const std::string& platform, @@ -405,7 +406,7 @@ namespace mamba { try { - return MSubdirData(channel_context, channel, platform, url, caches, repodata_fn); + return MSubdirData(ctx, channel_context, channel, platform, url, caches, repodata_fn); } catch (std::exception& e) { @@ -526,6 +527,7 @@ namespace mamba } MSubdirData::MSubdirData( + Context& ctx, ChannelContext& channel_context, const specs::Channel& channel, const std::string& platform, @@ -541,7 +543,7 @@ namespace mamba , m_json_fn(cache_fn_url(m_repodata_url)) , m_solv_fn(m_json_fn.substr(0, m_json_fn.size() - 4) + "solv") , m_is_noarch(platform == "noarch") - , p_context(&(channel_context.context())) + , p_context(&(ctx)) { load(caches, channel_context, channel); } diff --git a/libmamba/tests/src/core/test_satisfiability_error.cpp b/libmamba/tests/src/core/test_satisfiability_error.cpp index 1e2042ae1d..29c05017c6 100644 --- a/libmamba/tests/src/core/test_satisfiability_error.cpp +++ b/libmamba/tests/src/core/test_satisfiability_error.cpp @@ -334,7 +334,8 @@ namespace /** * Mock of channel_loader.hpp:load_channels that takes a list of channels. */ - auto load_channels(MPool& pool, MultiPackageCache& cache, std::vector&& channels) + auto + load_channels(Context& ctx, MPool& pool, MultiPackageCache& cache, std::vector&& channels) { auto sub_dirs = std::vector(); for (const auto& location : channels) @@ -344,6 +345,7 @@ namespace for (const auto& platform : chan.platforms()) { auto sub_dir = expected_value_or_throw(MSubdirData::create( + ctx, pool.channel_context(), chan, platform, @@ -392,9 +394,9 @@ namespace create_cache_dir(cache.first_writable_path()); bool prev_progress_bars_value = ctx.graphics_params.no_progress_bars; - mambatests::context().graphics_params.no_progress_bars = true; - load_channels(pool, cache, make_platform_channels(std::move(channels), platforms)); - mambatests::context().graphics_params.no_progress_bars = prev_progress_bars_value; + ctx.graphics_params.no_progress_bars = true; + load_channels(ctx, pool, cache, make_platform_channels(std::move(channels), platforms)); + ctx.graphics_params.no_progress_bars = prev_progress_bars_value; auto solver = MSolver( std::move(pool), diff --git a/libmambapy/src/libmambapy/bindings/legacy.cpp b/libmambapy/src/libmambapy/bindings/legacy.cpp index bf506236af..86f0a5d85e 100644 --- a/libmambapy/src/libmambapy/bindings/legacy.cpp +++ b/libmambapy/src/libmambapy/bindings/legacy.cpp @@ -189,6 +189,7 @@ namespace mambapy using iterator = entry_list::const_iterator; void create( + mamba::Context& ctx, mamba::ChannelContext& channel_context, const mamba::specs::Channel& channel, const std::string& platform, @@ -200,7 +201,7 @@ namespace mambapy { using namespace mamba; m_subdirs.push_back(extract( - MSubdirData::create(channel_context, channel, platform, full_url, caches, repodata_fn) + MSubdirData::create(ctx, channel_context, channel, platform, full_url, caches, repodata_fn) )); m_entries.push_back({ nullptr, platform, &channel, url }); for (size_t i = 0; i < m_subdirs.size(); ++i) @@ -650,6 +651,7 @@ bind_submodule_impl(pybind11::module_ m) const std::string& url) { self.create( + mambapy::singletons.context(), mambapy::singletons.channel_context(), channel, platform, diff --git a/micromamba/src/server.cpp b/micromamba/src/server.cpp index d8899e836a..c12e1ca394 100644 --- a/micromamba/src/server.cpp +++ b/micromamba/src/server.cpp @@ -41,7 +41,7 @@ load_pool( { ctx.channels = channels; mamba::MPool pool{ ctx, channel_context }; - auto exp_load = load_channels(pool, package_caches, false); + auto exp_load = load_channels(ctx, pool, package_caches, false); if (!exp_load) { throw std::runtime_error(exp_load.error().what()); diff --git a/micromamba/src/update.cpp b/micromamba/src/update.cpp index 65fe042b36..e86143cfbd 100644 --- a/micromamba/src/update.cpp +++ b/micromamba/src/update.cpp @@ -41,7 +41,7 @@ update_self(Configuration& config, const std::optional& version) mamba::MPool pool{ ctx, channel_context }; mamba::MultiPackageCache package_caches(ctx.pkgs_dirs, ctx.validation_params); - auto exp_loaded = load_channels(pool, package_caches, 0); + auto exp_loaded = load_channels(ctx, pool, package_caches, 0); if (!exp_loaded) { throw exp_loaded.error(); From ae82cf96d5f66a424208c41919e7c07c2579c6f1 Mon Sep 17 00:00:00 2001 From: AntoinePrv Date: Tue, 28 Nov 2023 15:43:36 +0100 Subject: [PATCH 3/5] Explicit Context param in MatchSpec --- libmamba/include/mamba/api/install.hpp | 7 ++- libmamba/include/mamba/core/env_lockfile.hpp | 8 ++- libmamba/include/mamba/core/history.hpp | 2 +- libmamba/include/mamba/core/match_spec.hpp | 5 +- libmamba/include/mamba/core/pinning.hpp | 18 ++++-- libmamba/include/mamba/core/prefix_data.hpp | 2 +- libmamba/src/api/install.cpp | 13 ++-- libmamba/src/api/list.cpp | 2 +- libmamba/src/api/remove.cpp | 4 +- libmamba/src/api/update.cpp | 8 +-- libmamba/src/core/env_lockfile.cpp | 26 +++++--- libmamba/src/core/history.cpp | 4 +- libmamba/src/core/match_spec.cpp | 14 ++--- libmamba/src/core/pinning.cpp | 10 ++- libmamba/src/core/prefix_data.cpp | 4 +- libmamba/src/core/solver.cpp | 35 ++++++----- libmamba/src/core/transaction.cpp | 10 ++- libmamba/tests/src/core/test_cpp.cpp | 63 ++++++++++--------- libmamba/tests/src/core/test_env_lockfile.cpp | 38 ++++++----- libmamba/tests/src/core/test_pinning.cpp | 30 ++++----- libmambapy/src/libmambapy/bindings/legacy.cpp | 16 +++-- micromamba/src/constructor.cpp | 1 + micromamba/src/env.cpp | 4 +- micromamba/src/server.cpp | 2 +- micromamba/src/update.cpp | 7 ++- 25 files changed, 202 insertions(+), 131 deletions(-) diff --git a/libmamba/include/mamba/api/install.hpp b/libmamba/include/mamba/api/install.hpp index 0299e831cd..be7d84d017 100644 --- a/libmamba/include/mamba/api/install.hpp +++ b/libmamba/include/mamba/api/install.hpp @@ -87,8 +87,11 @@ namespace mamba yaml_file_contents read_yaml_file(fs::u8path yaml_file, const std::string platform); - std::tuple, std::vector> - parse_urls_to_package_info(const std::vector& urls, ChannelContext& channel_context); + std::tuple, std::vector> parse_urls_to_package_info( + const std::vector& urls, + Context& ctx, + ChannelContext& channel_context + ); inline void to_json(nlohmann::json&, const other_pkg_mgr_spec&) { diff --git a/libmamba/include/mamba/core/env_lockfile.hpp b/libmamba/include/mamba/core/env_lockfile.hpp index b200f30f5b..1c78778971 100644 --- a/libmamba/include/mamba/core/env_lockfile.hpp +++ b/libmamba/include/mamba/core/env_lockfile.hpp @@ -23,6 +23,7 @@ namespace mamba { + class Context; class ChannelContext; enum class file_parsing_error_code @@ -112,8 +113,11 @@ namespace mamba /// Read an environment lock YAML file and returns it's structured content or an error if /// failed. - tl::expected - read_environment_lockfile(ChannelContext& channel_context, const mamba::fs::u8path& lockfile_location); + tl::expected read_environment_lockfile( + const Context& ctx, + ChannelContext& channel_context, + const mamba::fs::u8path& lockfile_location + ); /// Returns `true` if the filename matches names of files which should be interpreted as conda diff --git a/libmamba/include/mamba/core/history.hpp b/libmamba/include/mamba/core/history.hpp index b205a9769b..7bc97a1896 100644 --- a/libmamba/include/mamba/core/history.hpp +++ b/libmamba/include/mamba/core/history.hpp @@ -52,7 +52,7 @@ namespace mamba std::vector parse(); bool parse_comment_line(const std::string& line, UserRequest& req); std::vector get_user_requests(); - std::unordered_map get_requested_specs_map(); + std::unordered_map get_requested_specs_map(const Context& ctx); void add_entry(const History::UserRequest& entry); fs::u8path m_prefix; diff --git a/libmamba/include/mamba/core/match_spec.hpp b/libmamba/include/mamba/core/match_spec.hpp index e1824370a2..2b8259e0d2 100644 --- a/libmamba/include/mamba/core/match_spec.hpp +++ b/libmamba/include/mamba/core/match_spec.hpp @@ -14,6 +14,7 @@ namespace mamba { + class Context; class ChannelContext; class MatchSpec @@ -22,9 +23,9 @@ namespace mamba MatchSpec() = default; - MatchSpec(std::string_view i_spec, ChannelContext& channel_context); + MatchSpec(std::string_view i_spec, const Context& ctx, ChannelContext& channel_context); - void parse(ChannelContext& channel_context); + void parse(const Context& ctx, ChannelContext& channel_context); std::string conda_build_form() const; std::string str() const; diff --git a/libmamba/include/mamba/core/pinning.hpp b/libmamba/include/mamba/core/pinning.hpp index c63396e45a..6ac594cb9f 100644 --- a/libmamba/include/mamba/core/pinning.hpp +++ b/libmamba/include/mamba/core/pinning.hpp @@ -10,12 +10,22 @@ #include #include -#include "prefix_data.hpp" - - namespace mamba { - std::string python_pin(PrefixData& prefix_data, const std::vector& specs); + class Context; + class ChannelContext; + class PrefixData; + namespace fs + { + class u8path; + } + + std::string python_pin( + const Context& ctx, + ChannelContext& chc, + PrefixData& prefix_data, + const std::vector& specs + ); std::vector file_pins(const fs::u8path& file); } diff --git a/libmamba/include/mamba/core/prefix_data.hpp b/libmamba/include/mamba/core/prefix_data.hpp index 8a4dbd1feb..e7436c23f7 100644 --- a/libmamba/include/mamba/core/prefix_data.hpp +++ b/libmamba/include/mamba/core/prefix_data.hpp @@ -33,7 +33,7 @@ namespace mamba History& history(); const fs::u8path& path() const; - std::vector sorted_records() const; + std::vector sorted_records(const Context& ctx) const; ChannelContext& channel_context() const { diff --git a/libmamba/src/api/install.cpp b/libmamba/src/api/install.cpp index fcf0e77c8f..0fb534266b 100644 --- a/libmamba/src/api/install.cpp +++ b/libmamba/src/api/install.cpp @@ -342,8 +342,11 @@ namespace mamba return result; } - std::tuple, std::vector> - parse_urls_to_package_info(const std::vector& urls, ChannelContext& channel_context) + std::tuple, std::vector> parse_urls_to_package_info( + const std::vector& urls, + Context& ctx, + ChannelContext& channel_context + ) { std::vector pi_result; std::vector ms_result; @@ -354,7 +357,7 @@ namespace mamba continue; } std::size_t hash = u.find_first_of('#'); - MatchSpec ms(u.substr(0, hash), channel_context); + MatchSpec ms(u.substr(0, hash), ctx, channel_context); PackageInfo p(ms.name); p.url = ms.url; p.build_string = ms.build_string; @@ -467,7 +470,7 @@ namespace mamba // add channels from specs for (const auto& s : specs) { - if (auto m = MatchSpec{ s, channel_context }; !m.channel.empty()) + if (auto m = MatchSpec{ s, ctx, channel_context }; !m.channel.empty()) { ctx.channels.push_back(m.channel); } @@ -541,7 +544,7 @@ namespace mamba if (!no_py_pin) { - auto py_pin = python_pin(prefix_data, specs); + auto py_pin = python_pin(ctx, channel_context, prefix_data, specs); if (!py_pin.empty()) { solver.add_pin(py_pin); diff --git a/libmamba/src/api/list.cpp b/libmamba/src/api/list.cpp index 6a48ca0c94..d83fd224c6 100644 --- a/libmamba/src/api/list.cpp +++ b/libmamba/src/api/list.cpp @@ -95,7 +95,7 @@ namespace mamba formatted_pkg formatted_pkgs; std::vector packages; - auto requested_specs = prefix_data.history().get_requested_specs_map(); + auto requested_specs = prefix_data.history().get_requested_specs_map(ctx); // order list of packages from prefix_data by alphabetical order for (const auto& package : prefix_data.records()) diff --git a/libmamba/src/api/remove.cpp b/libmamba/src/api/remove.cpp index e975fbf54b..1cf1670823 100644 --- a/libmamba/src/api/remove.cpp +++ b/libmamba/src/api/remove.cpp @@ -114,7 +114,7 @@ namespace mamba specs.end(), std::back_inserter(mspecs), [&](const auto& spec_str) { - return MatchSpec{ spec_str, channel_context }; + return MatchSpec{ spec_str, ctx, channel_context }; } ); auto transaction = MTransaction(pool, mspecs, {}, package_caches); @@ -133,7 +133,7 @@ namespace mamba ); History history(ctx.prefix_params.target_prefix, channel_context); - auto hist_map = history.get_requested_specs_map(); + auto hist_map = history.get_requested_specs_map(ctx); std::vector keep_specs; for (auto& it : hist_map) { diff --git a/libmamba/src/api/update.cpp b/libmamba/src/api/update.cpp index ebabd7b99d..76dcffd2e4 100644 --- a/libmamba/src/api/update.cpp +++ b/libmamba/src/api/update.cpp @@ -38,7 +38,7 @@ namespace mamba // add channels from specs for (const auto& s : update_specs) { - if (auto m = MatchSpec{ s, channel_context }; !m.channel.empty()) + if (auto m = MatchSpec{ s, ctx, channel_context }; !m.channel.empty()) { ctx.channels.push_back(m.channel); } @@ -93,7 +93,7 @@ namespace mamba if (!no_py_pin) { - auto py_pin = python_pin(prefix_data, update_specs); + auto py_pin = python_pin(ctx, channel_context, prefix_data, update_specs); if (!py_pin.empty()) { solver.add_pin(py_pin); @@ -114,7 +114,7 @@ namespace mamba if (update_all) { - auto hist_map = prefix_data.history().get_requested_specs_map(); + auto hist_map = prefix_data.history().get_requested_specs_map(ctx); std::vector keep_specs; for (auto& it : hist_map) { @@ -132,7 +132,7 @@ namespace mamba { if (remove_not_specified) { - auto hist_map = prefix_data.history().get_requested_specs_map(); + auto hist_map = prefix_data.history().get_requested_specs_map(ctx); std::vector remove_specs; for (auto& it : hist_map) { diff --git a/libmamba/src/core/env_lockfile.cpp b/libmamba/src/core/env_lockfile.cpp index a98edaf328..3b91b75a88 100644 --- a/libmamba/src/core/env_lockfile.cpp +++ b/libmamba/src/core/env_lockfile.cpp @@ -19,7 +19,7 @@ namespace mamba using Package = EnvironmentLockFile::Package; tl::expected - read_package_info(ChannelContext& channel_context, const YAML::Node& package_node) + read_package_info(const Context& ctx, ChannelContext& channel_context, const YAML::Node& package_node) { Package package{ /* .info = */ mamba::PackageInfo{ package_node["name"].as() }, @@ -57,7 +57,7 @@ namespace mamba } package.info.url = package_node["url"].as(); - const MatchSpec spec{ package.info.url, channel_context }; + const MatchSpec spec{ package.info.url, ctx, channel_context }; package.info.fn = spec.fn; package.info.build_string = spec.build_string; package.info.subdir = spec.subdir; @@ -144,8 +144,11 @@ namespace mamba return metadata; } - tl::expected - read_environment_lockfile(ChannelContext& channel_context, const YAML::Node& lockfile_yaml) + tl::expected read_environment_lockfile( + const Context& ctx, + ChannelContext& channel_context, + const YAML::Node& lockfile_yaml + ) { const auto& maybe_metadata = read_metadata(lockfile_yaml["metadata"]); if (!maybe_metadata) @@ -158,7 +161,7 @@ namespace mamba std::vector packages; for (const auto& package_node : lockfile_yaml["package"]) { - if (auto maybe_package = read_package_info(channel_context, package_node)) + if (auto maybe_package = read_package_info(ctx, channel_context, package_node)) { packages.push_back(maybe_package.value()); } @@ -172,8 +175,11 @@ namespace mamba } } - tl::expected - read_environment_lockfile(ChannelContext& channel_context, const fs::u8path& lockfile_location) + tl::expected read_environment_lockfile( + const Context& ctx, + ChannelContext& channel_context, + const fs::u8path& lockfile_location + ) { const auto file_path = fs::absolute(lockfile_location); // Having the complete path helps // with logging and error reports. @@ -185,7 +191,11 @@ namespace mamba switch (lockfile_version) { case 1: - return env_lockfile_v1::read_environment_lockfile(channel_context, lockfile_content); + return env_lockfile_v1::read_environment_lockfile( + ctx, + channel_context, + lockfile_content + ); default: { diff --git a/libmamba/src/core/history.cpp b/libmamba/src/core/history.cpp index e76d1e4c66..dc7d0de15f 100644 --- a/libmamba/src/core/history.cpp +++ b/libmamba/src/core/history.cpp @@ -190,7 +190,7 @@ namespace mamba return res; } - std::unordered_map History::get_requested_specs_map() + std::unordered_map History::get_requested_specs_map(const Context& ctx) { std::unordered_map map; @@ -200,7 +200,7 @@ namespace mamba v.reserve(sv.size()); for (const auto& el : sv) { - v.emplace_back(el, m_channel_context); + v.emplace_back(el, ctx, m_channel_context); } return v; }; diff --git a/libmamba/src/core/match_spec.cpp b/libmamba/src/core/match_spec.cpp index 2f410414e9..4682f6f683 100644 --- a/libmamba/src/core/match_spec.cpp +++ b/libmamba/src/core/match_spec.cpp @@ -31,10 +31,10 @@ namespace mamba return split_str; } - MatchSpec::MatchSpec(std::string_view i_spec, ChannelContext& channel_context) + MatchSpec::MatchSpec(std::string_view i_spec, const Context& ctx, ChannelContext& channel_context) : spec(i_spec) { - parse(channel_context); + parse(ctx, channel_context); } std::tuple MatchSpec::parse_version_and_build(const std::string& s) @@ -69,7 +69,7 @@ namespace mamba } } - void MatchSpec::parse(ChannelContext& channel_context) + void MatchSpec::parse(const Context& ctx, ChannelContext& channel_context) { std::string spec_str = spec; if (spec_str.empty()) @@ -200,13 +200,7 @@ namespace mamba std::string cleaned_url; std::string platform; - util::split_platform( - get_known_platforms(), - channel, - channel_context.context().platform, - channel, - platform - ); + util::split_platform(get_known_platforms(), channel, ctx.platform, channel, platform); if (!platform.empty()) { subdir = platform; diff --git a/libmamba/src/core/pinning.cpp b/libmamba/src/core/pinning.cpp index d787091298..c8dcf4ab0d 100644 --- a/libmamba/src/core/pinning.cpp +++ b/libmamba/src/core/pinning.cpp @@ -8,12 +8,18 @@ #include "mamba/core/output.hpp" #include "mamba/core/pinning.hpp" +#include "mamba/core/prefix_data.hpp" #include "mamba/util/string.hpp" namespace mamba { - std::string python_pin(PrefixData& prefix_data, const std::vector& specs) + std::string python_pin( + const Context& ctx, + ChannelContext& channel_context, + PrefixData& prefix_data, + const std::vector& specs + ) { std::string pin = ""; std::string py_version; @@ -30,7 +36,7 @@ namespace mamba for (const auto& spec : specs) { - MatchSpec ms{ spec, prefix_data.channel_context() }; + MatchSpec ms{ spec, ctx, channel_context }; if (ms.name == "python") { return ""; diff --git a/libmamba/src/core/prefix_data.cpp b/libmamba/src/core/prefix_data.cpp index 916c214047..5ce0f2a8b6 100644 --- a/libmamba/src/core/prefix_data.cpp +++ b/libmamba/src/core/prefix_data.cpp @@ -77,7 +77,7 @@ namespace mamba return m_package_records; } - std::vector PrefixData::sorted_records() const + std::vector PrefixData::sorted_records(const Context& ctx) const { // TODO add_pip_as_python_dependency @@ -100,7 +100,7 @@ namespace mamba for (const auto& dep : record->depends) { // Creating a matchspec to parse the name (there may be a channel) - auto ms = MatchSpec{ dep, m_channel_context }; + auto ms = MatchSpec{ dep, ctx, m_channel_context }; // Ignoring unmatched dependencies, the environment could be broken // or it could be a matchspec const auto from_iter = name_to_node_id.find(ms.name); diff --git a/libmamba/src/core/solver.cpp b/libmamba/src/core/solver.cpp index 433cf99653..d6b2e9b200 100644 --- a/libmamba/src/core/solver.cpp +++ b/libmamba/src/core/solver.cpp @@ -135,7 +135,8 @@ namespace mamba { for (const auto& job : jobs) { - MatchSpec ms{ job, m_pool.channel_context() }; + const auto& ctx = m_pool.context(); + MatchSpec ms{ job, ctx, m_pool.channel_context() }; int job_type = job_flag & SOLVER_JOBMASK; if (ms.conda_build_form().empty()) @@ -145,16 +146,16 @@ namespace mamba if (job_type & SOLVER_INSTALL) { - m_install_specs.emplace_back(job, m_pool.channel_context()); + m_install_specs.emplace_back(job, ctx, m_pool.channel_context()); } else if (job_type == SOLVER_ERASE) { - m_remove_specs.emplace_back(job, m_pool.channel_context()); + m_remove_specs.emplace_back(job, ctx, m_pool.channel_context()); } else if (job_type == SOLVER_LOCK) { - m_neuter_specs.emplace_back(job, m_pool.channel_context()); // not used for the - // moment + m_neuter_specs.emplace_back(job, ctx, m_pool.channel_context()); // not used for + // the moment } const ::Id job_id = m_pool.matchspec2id(ms); @@ -186,7 +187,7 @@ namespace mamba { m_jobs->push_back( SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES, - m_pool.matchspec2id({ job, m_pool.channel_context() }) + m_pool.matchspec2id({ job, m_pool.context(), m_pool.channel_context() }) ); } @@ -218,7 +219,7 @@ namespace mamba // as one of its constrains. // Then we lock this solvable and force the re-checking of its dependencies. - const auto pin_ms = MatchSpec{ pin, m_pool.channel_context() }; + const auto pin_ms = MatchSpec{ pin, m_pool.context(), m_pool.channel_context() }; m_pinned_specs.push_back(pin_ms); auto& pool = m_pool.pool(); @@ -630,9 +631,9 @@ namespace mamba ); node_id cons_id = add_solvable( problem.dep_id, - ConstraintNode{ { dep.value(), channel_context } } + ConstraintNode{ { dep.value(), m_pool.context(), channel_context } } ); - MatchSpec edge(dep.value(), channel_context); + MatchSpec edge(dep.value(), m_pool.context(), channel_context); m_graph.add_edge(src_id, cons_id, std::move(edge)); add_conflict(cons_id, tgt_id); break; @@ -652,7 +653,7 @@ namespace mamba problem.source_id, PackageNode{ std::move(source).value() } ); - MatchSpec edge(dep.value(), channel_context); + MatchSpec edge(dep.value(), m_pool.context(), channel_context); bool added = add_expanded_deps_edges(src_id, problem.dep_id, edge); if (!added) { @@ -671,7 +672,7 @@ namespace mamba warn_unexpected_problem(problem); break; } - MatchSpec edge(dep.value(), channel_context); + MatchSpec edge(dep.value(), m_pool.context(), channel_context); bool added = add_expanded_deps_edges(m_root_node, problem.dep_id, edge); if (!added) { @@ -690,10 +691,11 @@ namespace mamba warn_unexpected_problem(problem); break; } - MatchSpec edge(dep.value(), channel_context); + MatchSpec edge(dep.value(), m_pool.context(), channel_context); node_id dep_id = add_solvable( problem.dep_id, - UnresolvedDependencyNode{ { std::move(dep).value(), channel_context } } + UnresolvedDependencyNode{ + { std::move(dep).value(), m_pool.context(), channel_context } } ); m_graph.add_edge(m_root_node, dep_id, std::move(edge)); break; @@ -709,14 +711,15 @@ namespace mamba warn_unexpected_problem(problem); break; } - MatchSpec edge(dep.value(), channel_context); + MatchSpec edge(dep.value(), m_pool.context(), channel_context); node_id src_id = add_solvable( problem.source_id, PackageNode{ std::move(source).value() } ); node_id dep_id = add_solvable( problem.dep_id, - UnresolvedDependencyNode{ { std::move(dep).value(), channel_context } } + UnresolvedDependencyNode{ + { std::move(dep).value(), m_pool.context(), channel_context } } ); m_graph.add_edge(src_id, dep_id, std::move(edge)); break; @@ -759,7 +762,7 @@ namespace mamba // how the solver is handling this package, as this is resolved in term of // installed packages and solver flags (allow downgrade...) rather than a // dependency. - MatchSpec edge(source.value().name, channel_context); + MatchSpec edge(source.value().name, m_pool.context(), channel_context); // The package cannot exist without its name in the pool assert(m_pool.pool().find_string(edge.name).has_value()); const auto dep_id = m_pool.pool().find_string(edge.name).value(); diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index d1ad8b829a..4528238868 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -576,6 +576,7 @@ namespace mamba { specs_to_install.push_back(MatchSpec( fmt::format("{}=={}={}", pkginfo.name, pkginfo.version, pkginfo.build_string), + m_pool.context(), m_pool.channel_context() )); } @@ -1359,7 +1360,8 @@ namespace mamba } const auto hash_idx = url.find_first_of('#'); - specs_to_install.emplace_back(url.substr(0, hash_idx), pool.channel_context()); + specs_to_install + .emplace_back(url.substr(0, hash_idx), pool.context(), pool.channel_context()); MatchSpec& ms = specs_to_install.back(); if (hash_idx != std::string::npos) @@ -1386,7 +1388,11 @@ namespace mamba std::vector& other_specs ) { - const auto maybe_lockfile = read_environment_lockfile(pool.channel_context(), env_lockfile_path); + const auto maybe_lockfile = read_environment_lockfile( + pool.context(), + pool.channel_context(), + env_lockfile_path + ); if (!maybe_lockfile) { throw maybe_lockfile.error(); // NOTE: we cannot return an `un/expected` because diff --git a/libmamba/tests/src/core/test_cpp.cpp b/libmamba/tests/src/core/test_cpp.cpp index 892a21e1f0..4cdeb594ae 100644 --- a/libmamba/tests/src/core/test_cpp.cpp +++ b/libmamba/tests/src/core/test_cpp.cpp @@ -88,36 +88,37 @@ namespace mamba TEST_CASE("parse") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); { - MatchSpec ms("xtensor==0.12.3", channel_context); + MatchSpec ms("xtensor==0.12.3", ctx, channel_context); CHECK_EQ(ms.version, "0.12.3"); CHECK_EQ(ms.name, "xtensor"); } { - MatchSpec ms("", channel_context); + MatchSpec ms("", ctx, channel_context); CHECK_EQ(ms.version, ""); CHECK_EQ(ms.name, ""); } { - MatchSpec ms("ipykernel", channel_context); + MatchSpec ms("ipykernel", ctx, channel_context); CHECK_EQ(ms.version, ""); CHECK_EQ(ms.name, "ipykernel"); } { - MatchSpec ms("ipykernel ", channel_context); + MatchSpec ms("ipykernel ", ctx, channel_context); CHECK_EQ(ms.version, ""); CHECK_EQ(ms.name, "ipykernel"); } { - MatchSpec ms("numpy 1.7*", channel_context); + MatchSpec ms("numpy 1.7*", ctx, channel_context); CHECK_EQ(ms.version, "1.7*"); CHECK_EQ(ms.name, "numpy"); CHECK_EQ(ms.conda_build_form(), "numpy 1.7*"); CHECK_EQ(ms.str(), "numpy=1.7"); } { - MatchSpec ms("numpy[version='1.7|1.8']", channel_context); + MatchSpec ms("numpy[version='1.7|1.8']", ctx, channel_context); // TODO! // CHECK_EQ(ms.version, "1.7|1.8"); CHECK_EQ(ms.name, "numpy"); @@ -125,14 +126,14 @@ namespace mamba CHECK_EQ(ms.str(), "numpy[version='1.7|1.8']"); } { - MatchSpec ms("conda-forge/linux64::xtensor==0.12.3", channel_context); + MatchSpec ms("conda-forge/linux64::xtensor==0.12.3", ctx, channel_context); CHECK_EQ(ms.version, "0.12.3"); CHECK_EQ(ms.name, "xtensor"); CHECK_EQ(ms.channel, "conda-forge/linux64"); CHECK_EQ(ms.optional, false); } { - MatchSpec ms("conda-forge::foo[build=3](target=blarg,optional)", channel_context); + MatchSpec ms("conda-forge::foo[build=3](target=blarg,optional)", ctx, channel_context); CHECK_EQ(ms.version, ""); CHECK_EQ(ms.name, "foo"); CHECK_EQ(ms.channel, "conda-forge"); @@ -141,13 +142,13 @@ namespace mamba CHECK_EQ(ms.optional, true); } { - MatchSpec ms("python[build_number=3]", channel_context); + MatchSpec ms("python[build_number=3]", ctx, channel_context); CHECK_EQ(ms.name, "python"); CHECK_EQ(ms.brackets["build_number"], "3"); CHECK_EQ(ms.build_number, "3"); } { - MatchSpec ms("python[build_number='<=3']", channel_context); + MatchSpec ms("python[build_number='<=3']", ctx, channel_context); CHECK_EQ(ms.name, "python"); CHECK_EQ(ms.brackets["build_number"], "<=3"); CHECK_EQ(ms.build_number, "<=3"); @@ -155,6 +156,7 @@ namespace mamba { MatchSpec ms( "https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2", + ctx, channel_context ); CHECK_EQ(ms.name, "_libgcc_mutex"); @@ -169,6 +171,7 @@ namespace mamba { MatchSpec ms( "/home/randomguy/Downloads/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2", + ctx, channel_context ); CHECK_EQ(ms.name, "_libgcc_mutex"); @@ -193,6 +196,7 @@ namespace mamba MatchSpec ms( "xtensor[url=file:///home/wolfv/Downloads/" "xtensor-0.21.4-hc9558a2_0.tar.bz2]", + ctx, channel_context ); CHECK_EQ(ms.name, "xtensor"); @@ -203,13 +207,14 @@ namespace mamba CHECK_EQ(ms.url, "file:///home/wolfv/Downloads/xtensor-0.21.4-hc9558a2_0.tar.bz2"); } { - MatchSpec ms("foo=1.0=2", channel_context); + MatchSpec ms("foo=1.0=2", ctx, channel_context); CHECK_EQ(ms.conda_build_form(), "foo 1.0 2"); CHECK_EQ(ms.str(), "foo==1.0=2"); } { MatchSpec ms( "foo=1.0=2[md5=123123123, license=BSD-3, fn='test 123.tar.bz2']", + ctx, channel_context ); CHECK_EQ(ms.conda_build_form(), "foo 1.0 2"); @@ -218,77 +223,79 @@ namespace mamba { MatchSpec ms( "foo=1.0=2[md5=123123123, license=BSD-3, fn='test 123.tar.bz2', url='abcdef']", + ctx, channel_context ); CHECK_EQ(ms.conda_build_form(), "foo 1.0 2"); CHECK_EQ(ms.str(), "foo==1.0=2[url=abcdef,md5=123123123,license=BSD-3]"); } { - MatchSpec ms("libblas=*=*mkl", channel_context); + MatchSpec ms("libblas=*=*mkl", ctx, channel_context); CHECK_EQ(ms.conda_build_form(), "libblas * *mkl"); // CHECK_EQ(ms.str(), "foo==1.0=2"); } { - MatchSpec ms("libblas=0.15*", channel_context); + MatchSpec ms("libblas=0.15*", ctx, channel_context); CHECK_EQ(ms.conda_build_form(), "libblas 0.15*"); } { - MatchSpec ms("xtensor =0.15*", channel_context); + MatchSpec ms("xtensor =0.15*", ctx, channel_context); CHECK_EQ(ms.conda_build_form(), "xtensor 0.15*"); CHECK_EQ(ms.str(), "xtensor=0.15"); } { - MatchSpec ms("numpy=1.20", channel_context); + MatchSpec ms("numpy=1.20", ctx, channel_context); CHECK_EQ(ms.str(), "numpy=1.20"); } { - MatchSpec ms("conda-forge::tzdata", channel_context); + MatchSpec ms("conda-forge::tzdata", ctx, channel_context); CHECK_EQ(ms.str(), "conda-forge::tzdata"); } { - MatchSpec ms("conda-forge::noarch/tzdata", channel_context); + MatchSpec ms("conda-forge::noarch/tzdata", ctx, channel_context); CHECK_EQ(ms.str(), "conda-forge::noarch/tzdata"); } { - MatchSpec ms("pkgs/main::tzdata", channel_context); + MatchSpec ms("pkgs/main::tzdata", ctx, channel_context); CHECK_EQ(ms.str(), "pkgs/main::tzdata"); } { - MatchSpec ms("pkgs/main/noarch::tzdata", channel_context); + MatchSpec ms("pkgs/main/noarch::tzdata", ctx, channel_context); CHECK_EQ(ms.str(), "pkgs/main/noarch::tzdata"); } { - MatchSpec ms("conda-forge/noarch::tzdata[subdir=linux64]", channel_context); + MatchSpec ms("conda-forge/noarch::tzdata[subdir=linux64]", ctx, channel_context); CHECK_EQ(ms.str(), "conda-forge/noarch::tzdata"); } { - MatchSpec ms("conda-forge::tzdata[subdir=linux64]", channel_context); + MatchSpec ms("conda-forge::tzdata[subdir=linux64]", ctx, channel_context); CHECK_EQ(ms.str(), "conda-forge/linux64::tzdata"); } } TEST_CASE("is_simple") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); { - MatchSpec ms("libblas", channel_context); + MatchSpec ms("libblas", ctx, channel_context); CHECK(ms.is_simple()); } { - MatchSpec ms("libblas=12.9=abcdef", channel_context); + MatchSpec ms("libblas=12.9=abcdef", ctx, channel_context); CHECK_FALSE(ms.is_simple()); } { - MatchSpec ms("libblas=0.15*", channel_context); + MatchSpec ms("libblas=0.15*", ctx, channel_context); CHECK_FALSE(ms.is_simple()); } { - MatchSpec ms("libblas[version=12.2]", channel_context); + MatchSpec ms("libblas[version=12.2]", ctx, channel_context); CHECK_FALSE(ms.is_simple()); } { - MatchSpec ms("xtensor =0.15*", channel_context); + MatchSpec ms("xtensor =0.15*", ctx, channel_context); CHECK_FALSE(ms.is_simple()); } } diff --git a/libmamba/tests/src/core/test_env_lockfile.cpp b/libmamba/tests/src/core/test_env_lockfile.cpp index 81d83bbfd4..2a383b0f19 100644 --- a/libmamba/tests/src/core/test_env_lockfile.cpp +++ b/libmamba/tests/src/core/test_env_lockfile.cpp @@ -20,8 +20,10 @@ namespace mamba { TEST_CASE("absent_file_fails") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const auto maybe_lockfile = read_environment_lockfile( + ctx, channel_context, "this/file/does/not/exists" ); @@ -43,10 +45,12 @@ namespace mamba TEST_CASE("invalid_version_fails") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const fs::u8path invalid_version_lockfile_path{ mambatests::test_data_dir / "env_lockfile/bad_version-lock.yaml" }; const auto maybe_lockfile = read_environment_lockfile( + ctx, channel_context, invalid_version_lockfile_path ); @@ -59,10 +63,11 @@ namespace mamba TEST_CASE("valid_no_package_succeed") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const fs::u8path lockfile_path{ mambatests::test_data_dir / "env_lockfile/good_no_package-lock.yaml" }; - const auto maybe_lockfile = read_environment_lockfile(channel_context, lockfile_path); + const auto maybe_lockfile = read_environment_lockfile(ctx, channel_context, lockfile_path); REQUIRE_MESSAGE(maybe_lockfile, maybe_lockfile.error().what()); const auto lockfile = maybe_lockfile.value(); CHECK(lockfile.get_all_packages().empty()); @@ -70,10 +75,11 @@ namespace mamba TEST_CASE("invalid_package_fails") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const fs::u8path lockfile_path{ mambatests::test_data_dir / "env_lockfile/bad_package-lock.yaml" }; - const auto maybe_lockfile = read_environment_lockfile(channel_context, lockfile_path); + const auto maybe_lockfile = read_environment_lockfile(ctx, channel_context, lockfile_path); REQUIRE_FALSE(maybe_lockfile); const auto error = maybe_lockfile.error(); REQUIRE_EQ(mamba_error_code::env_lockfile_parsing_failed, error.error_code()); @@ -83,10 +89,11 @@ namespace mamba TEST_CASE("valid_one_package_succeed") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const fs::u8path lockfile_path{ mambatests::test_data_dir / "env_lockfile/good_one_package-lock.yaml" }; - const auto maybe_lockfile = read_environment_lockfile(channel_context, lockfile_path); + const auto maybe_lockfile = read_environment_lockfile(ctx, channel_context, lockfile_path); REQUIRE_MESSAGE(maybe_lockfile, maybe_lockfile.error().what()); const auto lockfile = maybe_lockfile.value(); CHECK_EQ(lockfile.get_all_packages().size(), 1); @@ -94,11 +101,12 @@ namespace mamba TEST_CASE("valid_one_package_implicit_category") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const fs::u8path lockfile_path{ mambatests::test_data_dir / "env_lockfile/good_one_package_missing_category-lock.yaml" }; - const auto maybe_lockfile = read_environment_lockfile(channel_context, lockfile_path); + const auto maybe_lockfile = read_environment_lockfile(ctx, channel_context, lockfile_path); REQUIRE_MESSAGE(maybe_lockfile, maybe_lockfile.error().what()); const auto lockfile = maybe_lockfile.value(); CHECK_EQ(lockfile.get_all_packages().size(), 1); @@ -106,10 +114,11 @@ namespace mamba TEST_CASE("valid_multiple_packages_succeed") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const fs::u8path lockfile_path{ mambatests::test_data_dir / "env_lockfile/good_multiple_packages-lock.yaml" }; - const auto maybe_lockfile = read_environment_lockfile(channel_context, lockfile_path); + const auto maybe_lockfile = read_environment_lockfile(ctx, channel_context, lockfile_path); REQUIRE_MESSAGE(maybe_lockfile, maybe_lockfile.error().what()); const auto lockfile = maybe_lockfile.value(); CHECK_GT(lockfile.get_all_packages().size(), 1); @@ -117,10 +126,11 @@ namespace mamba TEST_CASE("get_specific_packages") { - auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); + auto& ctx = mambatests::context(); + auto channel_context = ChannelContext::make_conda_compatible(ctx); const fs::u8path lockfile_path{ mambatests::test_data_dir / "env_lockfile/good_multiple_packages-lock.yaml" }; - const auto lockfile = read_environment_lockfile(channel_context, lockfile_path).value(); + const auto lockfile = read_environment_lockfile(ctx, channel_context, lockfile_path).value(); CHECK(lockfile.get_packages_for("", "", "").empty()); { const auto packages = lockfile.get_packages_for("main", "linux-64", "conda"); diff --git a/libmamba/tests/src/core/test_pinning.cpp b/libmamba/tests/src/core/test_pinning.cpp index 43511fe9f3..d324cb0d19 100644 --- a/libmamba/tests/src/core/test_pinning.cpp +++ b/libmamba/tests/src/core/test_pinning.cpp @@ -9,6 +9,7 @@ #include "mamba/core/channel_context.hpp" #include "mamba/core/context.hpp" #include "mamba/core/pinning.hpp" +#include "mamba/core/prefix_data.hpp" #include "mamba/core/util.hpp" #include "mambatests.hpp" @@ -24,6 +25,7 @@ namespace mamba std::vector specs; std::string pin; + const auto& ctx = mambatests::context(); auto channel_context = ChannelContext::make_conda_compatible(mambatests::context()); auto sprefix_data = PrefixData::create("", channel_context); if (!sprefix_data) @@ -35,27 +37,27 @@ namespace mamba REQUIRE_EQ(prefix_data.records().size(), 0); specs = { "python" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "python-test" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "python=3" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "python==3.8" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "python==3.8.3" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "numpy" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); PackageInfo pkg_info("python", "3.7.10", "abcde", 0); @@ -63,35 +65,35 @@ namespace mamba REQUIRE_EQ(prefix_data.records().size(), 1); specs = { "python" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "numpy" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, "python 3.7.*"); specs = { "python-test" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, "python 3.7.*"); specs = { "python==3" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "python=3.*" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "python=3.8" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "python=3.8.3" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); specs = { "numpy", "python" }; - pin = python_pin(prefix_data, specs); + pin = python_pin(ctx, channel_context, prefix_data, specs); CHECK_EQ(pin, ""); } diff --git a/libmambapy/src/libmambapy/bindings/legacy.cpp b/libmambapy/src/libmambapy/bindings/legacy.cpp index 86f0a5d85e..2fe9451dc9 100644 --- a/libmambapy/src/libmambapy/bindings/legacy.cpp +++ b/libmambapy/src/libmambapy/bindings/legacy.cpp @@ -300,7 +300,9 @@ bind_submodule_impl(pybind11::module_ m) .def(py::init<>()) .def(py::init<>( [](const std::string& name) { - return MatchSpec{ name, mambapy::singletons.channel_context() }; + return MatchSpec{ name, + mambapy::singletons.context(), + mambapy::singletons.channel_context() }; } )) .def("conda_build_form", &MatchSpec::conda_build_form); @@ -316,8 +318,11 @@ bind_submodule_impl(pybind11::module_ m) .def("matchspec2id", &MPool::matchspec2id, py::arg("ms")) .def( "matchspec2id", - [](MPool& self, std::string_view ms) { - return self.matchspec2id({ ms, mambapy::singletons.channel_context() }); + [](MPool& self, std::string_view ms) + { + return self.matchspec2id( + { ms, mambapy::singletons.context(), mambapy::singletons.channel_context() } + ); }, py::arg("ms") ) @@ -494,7 +499,10 @@ bind_submodule_impl(pybind11::module_ m) return History{ path, mambapy::singletons.channel_context() }; } )) - .def("get_requested_specs_map", &History::get_requested_specs_map); + .def( + "get_requested_specs_map", + [](History& self) { return self.get_requested_specs_map(mambapy::singletons.context()); } + ); /*py::class_(m, "Query") .def(py::init()) diff --git a/micromamba/src/constructor.cpp b/micromamba/src/constructor.cpp index 636af15b1f..de20ce9d3c 100644 --- a/micromamba/src/constructor.cpp +++ b/micromamba/src/constructor.cpp @@ -108,6 +108,7 @@ construct(Configuration& config, const fs::u8path& prefix, bool extract_conda_pk auto [package_details, _] = detail::parse_urls_to_package_info( read_lines(urls_file), + config.context(), channel_context ); diff --git a/micromamba/src/env.cpp b/micromamba/src/env.cpp index f15a6dce7f..5549274b07 100644 --- a/micromamba/src/env.cpp +++ b/micromamba/src/env.cpp @@ -136,7 +136,7 @@ set_env_command(CLI::App* com, Configuration& config) { // TODO: handle error auto pd = PrefixData::create(ctx.prefix_params.target_prefix, channel_context).value(); - auto records = pd.sorted_records(); + auto records = pd.sorted_records(ctx); std::cout << "# This file may be used to create an environment using:\n" << "# $ conda create --name --file \n" << "# platform: " << ctx.platform << "\n" @@ -163,7 +163,7 @@ set_env_command(CLI::App* com, Configuration& config) std::cout << "name: " << get_env_name(ctx, ctx.prefix_params.target_prefix) << "\n"; std::cout << "channels:\n"; - auto requested_specs_map = hist.get_requested_specs_map(); + auto requested_specs_map = hist.get_requested_specs_map(ctx); std::stringstream dependencies; std::set channels; for (const auto& [k, v] : versions_map) diff --git a/micromamba/src/server.cpp b/micromamba/src/server.cpp index c12e1ca394..84fd93c4b2 100644 --- a/micromamba/src/server.cpp +++ b/micromamba/src/server.cpp @@ -75,7 +75,7 @@ handle_solve_request( for (const auto& s : specs) { - if (auto m = MatchSpec{ s, channel_context }; !m.channel.empty()) + if (auto m = MatchSpec{ s, ctx, channel_context }; !m.channel.empty()) { channels.push_back(m.channel); } diff --git a/micromamba/src/update.cpp b/micromamba/src/update.cpp index e86143cfbd..ac9faa3d20 100644 --- a/micromamba/src/update.cpp +++ b/micromamba/src/update.cpp @@ -51,11 +51,14 @@ update_self(Configuration& config, const std::optional& version) std::string matchspec = version ? fmt::format("micromamba={}", version.value()) : fmt::format("micromamba>{}", umamba::version()); - auto solvable_ids = pool.select_solvables(pool.matchspec2id({ matchspec, channel_context }), true); + auto solvable_ids = pool.select_solvables( + pool.matchspec2id({ matchspec, ctx, channel_context }), + true + ); if (solvable_ids.empty()) { - if (pool.select_solvables(pool.matchspec2id({ "micromamba", channel_context })).empty()) + if (pool.select_solvables(pool.matchspec2id({ "micromamba", ctx, channel_context })).empty()) { throw mamba::mamba_error( "No micromamba found in the loaded channels. Add 'conda-forge' to your config file.", From 25c33d343cc74ef833ee093f704e1763b72e3699 Mon Sep 17 00:00:00 2001 From: AntoinePrv Date: Tue, 28 Nov 2023 16:07:34 +0100 Subject: [PATCH 4/5] Move URL hardening to Transaction --- .../include/mamba/core/package_fetcher.hpp | 8 +------- libmamba/src/core/package_fetcher.cpp | 19 ++++--------------- libmamba/src/core/transaction.cpp | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/libmamba/include/mamba/core/package_fetcher.hpp b/libmamba/include/mamba/core/package_fetcher.hpp index 7fb7b03edf..18202b2bf7 100644 --- a/libmamba/include/mamba/core/package_fetcher.hpp +++ b/libmamba/include/mamba/core/package_fetcher.hpp @@ -9,7 +9,6 @@ #include -#include "mamba/core/channel_context.hpp" #include "mamba/core/download.hpp" #include "mamba/core/package_cache.hpp" #include "mamba/core/package_handling.hpp" @@ -79,11 +78,7 @@ namespace mamba using post_download_success_t = std::function; using progress_callback_t = std::function; - PackageFetcher( - const PackageInfo& pkg_info, - ChannelContext& channel_context, - MultiPackageCache& caches - ); + PackageFetcher(const PackageInfo& pkg_info, MultiPackageCache& caches); const std::string& name() const; @@ -127,7 +122,6 @@ namespace mamba void update_monitor(progress_callback_t* cb, PackageExtractEvent event) const; PackageInfo m_package_info; - std::string m_url = ""; fs::u8path m_tarball_path; fs::u8path m_cache_path; diff --git a/libmamba/src/core/package_fetcher.cpp b/libmamba/src/core/package_fetcher.cpp index 098aa290f8..4e650533c0 100644 --- a/libmamba/src/core/package_fetcher.cpp +++ b/libmamba/src/core/package_fetcher.cpp @@ -70,23 +70,12 @@ namespace mamba PackageFetcher::PackageFetcher( const PackageInfo& pkg_info, - ChannelContext& channel_context, + // ChannelContext& channel_context, MultiPackageCache& caches ) + : m_package_info(pkg_info) { - // FIXME: only do this for micromamba for now - if (channel_context.context().command_params.is_micromamba) - { - auto channels = channel_context.make_channel(pkg_info.url); - assert(channels.size() == 1); // A URL can only resolve to one channel - m_url = channels.front().platform_urls().at(0).str(); - } - else - { - m_url = pkg_info.url; - } - const fs::u8path extracted_cache = caches.get_extracted_dir_path(m_package_info); if (extracted_cache.empty()) { @@ -314,7 +303,7 @@ namespace mamba const std::string& PackageFetcher::url() const { - return m_url; + return m_package_info.url; } const std::string& PackageFetcher::sha256() const @@ -393,7 +382,7 @@ namespace mamba std::lock_guard lock(urls_txt_mutex); const auto urls_file_path = m_cache_path / "urls.txt"; std::ofstream urls_txt(urls_file_path.std_path(), std::ios::app); - urls_txt << m_url << std::endl; + urls_txt << url() << std::endl; } void PackageFetcher::update_monitor(progress_callback_t* cb, PackageExtractEvent event) const diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 4528238868..e0e44f78b8 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -889,7 +889,20 @@ namespace mamba // // LOG_DEBUG << "'" << pkg.name << "' trusted from '" << pkg.channel << "'"; // } - fetchers.emplace_back(pkg, channel_context, multi_cache); + + // FIXME: only do this for micromamba for now + if (ctx.command_params.is_micromamba) + { + auto l_pkg = pkg; + auto channels = channel_context.make_channel(pkg.url); + assert(channels.size() == 1); // A URL can only resolve to one channel + l_pkg.url = channels.front().platform_urls().at(0).str(); + fetchers.emplace_back(l_pkg, multi_cache); + } + else + { + fetchers.emplace_back(pkg, multi_cache); + } } ); From b8ccc95efc61a7e1890e252543d2c9719d1eb92c Mon Sep 17 00:00:00 2001 From: AntoinePrv Date: Tue, 28 Nov 2023 16:32:29 +0100 Subject: [PATCH 5/5] Remove Context capture in ChannelContext --- .../include/mamba/core/channel_context.hpp | 15 +++------------ libmamba/src/core/channel_context.cpp | 18 ++++++------------ 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/libmamba/include/mamba/core/channel_context.hpp b/libmamba/include/mamba/core/channel_context.hpp index 2f3291ff7e..522942472e 100644 --- a/libmamba/include/mamba/core/channel_context.hpp +++ b/libmamba/include/mamba/core/channel_context.hpp @@ -7,7 +7,6 @@ #ifndef MAMBA_CORE_CHANNEL_HPP #define MAMBA_CORE_CHANNEL_HPP -#include #include #include @@ -32,7 +31,7 @@ namespace mamba * Custom channels are treated as aliases rather than the Conda way (the name is not * added at the end of the URL if absent). */ - [[nodiscard]] static auto make_simple(Context& ctx) -> ChannelContext; + [[nodiscard]] static auto make_simple(const Context& ctx) -> ChannelContext; /** * Create a ChannelContext while applying all of Conda context options. @@ -43,14 +42,14 @@ namespace mamba * be added. * The function will ensure custom channels names are added at the end of the URLs. */ - [[nodiscard]] static auto make_conda_compatible(Context& ctx) -> ChannelContext; + [[nodiscard]] static auto make_conda_compatible(const Context& ctx) -> ChannelContext; /** * Initialize channel with the parameters as they are. * * The Context is not parsed. */ - ChannelContext(Context& ctx, ChannelResolveParams params, std::vector has_zst); + ChannelContext(ChannelResolveParams params, std::vector has_zst); auto make_channel(std::string_view name) -> const channel_list&; @@ -58,13 +57,6 @@ namespace mamba [[nodiscard]] auto has_zst(const Channel& chan) const -> bool; - /** - * Return the context. - * - * @deprecated We aim to remove the capture of the Context. - */ - [[nodiscard, deprecated]] auto context() const -> const Context&; - private: using ChannelCache = std::unordered_map; @@ -72,7 +64,6 @@ namespace mamba ChannelResolveParams m_channel_params; ChannelCache m_channel_cache; std::vector m_has_zst; - std::reference_wrapper m_context; }; } #endif diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index 5c26a59302..07e9324567 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -190,29 +190,28 @@ namespace mamba } } - ChannelContext::ChannelContext(Context& ctx, ChannelResolveParams params, std::vector has_zst) + ChannelContext::ChannelContext(ChannelResolveParams params, std::vector has_zst) : m_channel_params(std::move(params)) - , m_has_zst(has_zst) - , m_context(ctx) + , m_has_zst(std::move(has_zst)) { } - auto ChannelContext::make_simple(Context& ctx) -> ChannelContext + auto ChannelContext::make_simple(const Context& ctx) -> ChannelContext { auto params = make_simple_params_base(ctx); add_simple_params_custom_channel(params, ctx); add_simple_params_custom_multichannel(params, ctx); auto has_zst = create_zstd(ctx, params); - return { ctx, std::move(params), std::move(has_zst) }; + return { std::move(params), std::move(has_zst) }; } - auto ChannelContext::make_conda_compatible(Context& ctx) -> ChannelContext + auto ChannelContext::make_conda_compatible(const Context& ctx) -> ChannelContext { auto params = make_simple_params_base(ctx); add_conda_params_custom_channel(params, ctx); add_conda_params_custom_multichannel(params, ctx); auto has_zst = create_zstd(ctx, params); - return { ctx, std::move(params), has_zst }; + return { std::move(params), has_zst }; } auto ChannelContext::make_channel(std::string_view name) -> const channel_list& @@ -246,9 +245,4 @@ namespace mamba } return false; } - - auto ChannelContext::context() const -> const Context& - { - return m_context; - } }