From 9a5caa9e0ebd7449c71a56217d19558a62565bcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Lamotte=20=28Klaim=29?= Date: Fri, 19 Dec 2025 15:17:01 +0100 Subject: [PATCH 01/66] inject channels+mirrors coming from mambajs env-lockfiles --- libmamba/include/mamba/core/env_lockfile.hpp | 1 + libmamba/include/mamba/core/transaction.hpp | 1 + libmamba/include/mamba/specs/channel.hpp | 3 + libmamba/include/mamba/specs/conda_url.hpp | 16 +++++ libmamba/include/mamba/util/algorithm.hpp | 61 +++++++++++++++++++ libmamba/include/mamba/util/url.hpp | 8 +++ libmamba/src/api/install.cpp | 1 + libmamba/src/core/channel_context.cpp | 8 +++ libmamba/src/core/env_lockfile_conda.cpp | 1 + libmamba/src/core/transaction.cpp | 10 ++- libmamba/src/specs/channel.cpp | 36 +++++++++-- libmamba/tests/src/core/test_env_lockfile.cpp | 1 + 12 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 libmamba/include/mamba/util/algorithm.hpp diff --git a/libmamba/include/mamba/core/env_lockfile.hpp b/libmamba/include/mamba/core/env_lockfile.hpp index a765904c83..d3caa31c71 100644 --- a/libmamba/include/mamba/core/env_lockfile.hpp +++ b/libmamba/include/mamba/core/env_lockfile.hpp @@ -77,6 +77,7 @@ namespace mamba std::vector channels; std::vector platforms; std::vector sources; + bool enable_channels = true; ///< `true` if we need to take into account the specified channels, `false` if we should ignore them. }; struct Package diff --git a/libmamba/include/mamba/core/transaction.hpp b/libmamba/include/mamba/core/transaction.hpp index f6bf5d1373..3eac4acb77 100644 --- a/libmamba/include/mamba/core/transaction.hpp +++ b/libmamba/include/mamba/core/transaction.hpp @@ -107,6 +107,7 @@ namespace mamba MTransaction create_explicit_transaction_from_lockfile( const Context& ctx, + ChannelContext& channel_context, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, const std::vector& categories, diff --git a/libmamba/include/mamba/specs/channel.hpp b/libmamba/include/mamba/specs/channel.hpp index 26e829a728..c23c6b24d0 100644 --- a/libmamba/include/mamba/specs/channel.hpp +++ b/libmamba/include/mamba/specs/channel.hpp @@ -74,6 +74,9 @@ namespace mamba::specs auto clear_display_name() -> std::string; void set_display_name(std::string display_name); + // Adds mirror urls if not already recorded. + void add_mirror_urls(const std::vector& additional_mirrors); + enum struct Match { No, diff --git a/libmamba/include/mamba/specs/conda_url.hpp b/libmamba/include/mamba/specs/conda_url.hpp index 27d511b030..f2eb10e200 100644 --- a/libmamba/include/mamba/specs/conda_url.hpp +++ b/libmamba/include/mamba/specs/conda_url.hpp @@ -9,6 +9,7 @@ #include #include +#include #include "mamba/specs/error.hpp" #include "mamba/specs/platform.hpp" @@ -251,6 +252,21 @@ namespace mamba::specs { auto operator""_cu(const char* str, std::size_t len) -> CondaURL; } + + template + requires std::same_as< std::ranges::range_value_t, util::URL > + auto as_conda_urls(URLRange&& values) + { + return std::views::transform(std::forward(values), [](const util::URL& url){ return CondaURL{url}; }); + } + + template + requires (not std::same_as< std::ranges::range_value_t, util::URL >) // TODO: or only string-like types? + auto as_conda_urls(StringRange&& values) + { + return as_conda_urls(util::as_urls(std::forward(values))); + } + } template <> diff --git a/libmamba/include/mamba/util/algorithm.hpp b/libmamba/include/mamba/util/algorithm.hpp new file mode 100644 index 0000000000..504ddf0b4b --- /dev/null +++ b/libmamba/include/mamba/util/algorithm.hpp @@ -0,0 +1,61 @@ +// Copyright (c) 2025, 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. + +////////////////////////////////////////////////////////////////////////////// +// This file provides implementations to generic algorithms which are not yet +// available in our current C++ version and/or implementations. +// +// TODO: replace these implementations by standard implementations +// once available. +// + +#ifndef MAMBA_UTIL_ALGORITHM_HPP +#define MAMBA_UTIL_ALGORITHM_HPP + +#include +#include +#include +#include + +namespace mamba::stdext // not using mamba::util because of potential conflicts with existing tooling +{ + /////////////////////////////////////////////////////////////////////////////////////////////// + // see https://en.cppreference.com/w/cpp/algorithm/ranges/contains.html + namespace details + { + struct contains_fn + { + template S, + class Proj = std::identity, + class T> + requires std::indirect_binary_predicate, + const T*> + constexpr bool operator()(I first, S last, const T& value, Proj proj = {}) const + { + return std::ranges::find(std::move(first), last, value, proj) != last; + } + + template + requires std::indirect_binary_predicate, Proj>, + const T*> + constexpr bool operator()(R&& r, const T& value, Proj proj = {}) const + { + return std::ranges::find(std::ranges::begin(r), + std::ranges::end(r), value, proj) != std::ranges::end(r); + } + }; + } + + + inline constexpr details::contains_fn contains{}; + + ///////////////////////////////////////////////////////////////////////////////////////////////// + +} +#endif \ No newline at end of file diff --git a/libmamba/include/mamba/util/url.hpp b/libmamba/include/mamba/util/url.hpp index 074f256a52..c673dcac8e 100644 --- a/libmamba/include/mamba/util/url.hpp +++ b/libmamba/include/mamba/util/url.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -293,6 +294,13 @@ namespace mamba::util /** A functional equivalent to ``URL::append_path``. */ auto operator/(URL const& url, std::string_view subpath) -> URL; auto operator/(URL&& url, std::string_view subpath) -> URL; + + template + auto as_urls(StringRange&& values) + { + return std::views::transform(std::forward(values), [](const auto& url){ return *URL::parse(url); }); + } + } template <> diff --git a/libmamba/src/api/install.cpp b/libmamba/src/api/install.cpp index 643411fb32..307bc24245 100644 --- a/libmamba/src/api/install.cpp +++ b/libmamba/src/api/install.cpp @@ -853,6 +853,7 @@ namespace mamba { return create_explicit_transaction_from_lockfile( ctx, + channel_context, db, file, categories, diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index 26accb77cb..6592899bbf 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -293,6 +293,14 @@ namespace mamba { if (const auto it = m_channel_cache.find(std::string(name)); it != m_channel_cache.end()) { + for(auto& channel : it->second) + { + // TODO C++23: replace all this by std::vector(from_range_t, ...) + auto urls_view = specs::as_conda_urls(mirrors); + std::vector urls(urls_view.begin(), urls_view.end()); + + channel.add_mirror_urls(urls); + } return it->second; } diff --git a/libmamba/src/core/env_lockfile_conda.cpp b/libmamba/src/core/env_lockfile_conda.cpp index 446dd45f6c..cded382949 100644 --- a/libmamba/src/core/env_lockfile_conda.cpp +++ b/libmamba/src/core/env_lockfile_conda.cpp @@ -128,6 +128,7 @@ namespace mamba -> tl::expected { EnvironmentLockFile::Meta metadata; + metadata.enable_channels = false; // we ignore the channels specified by the file for (const auto& platform_node : metadata_node["platforms"]) { diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index dbb4f6e2ad..74c6a736a6 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1353,6 +1353,7 @@ namespace mamba MTransaction create_explicit_transaction_from_lockfile( const Context& ctx, + ChannelContext& channel_context, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, const std::vector& categories, @@ -1377,7 +1378,14 @@ namespace mamba LOG_DEBUG << " manager = " << package.manager; } - // TODO: FIXME: inject channel info coming from the lockfile! + if(lockfile_data.get_metadata().enable_channels) + { + // create or add mirrors to additional channels + for(const EnvironmentLockFile::Channel& channel_info : lockfile_data.get_metadata().channels) + { + auto channels [[maybe_unused]] = channel_context.make_channel(channel_info.name, channel_info.urls); + } + } std::vector conda_packages = {}; std::vector pip_packages = {}; diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 5136d21d95..f6d201b61e 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -4,11 +4,13 @@ // // The full license is in the file LICENSE, distributed with this software. +#include #include #include #include "mamba/fs/filesystem.hpp" #include "mamba/specs/channel.hpp" +#include "mamba/util/algorithm.hpp" #include "mamba/util/path_manip.hpp" #include "mamba/util/string.hpp" #include "mamba/util/tuple_hash.hpp" @@ -16,6 +18,20 @@ namespace mamba::specs { + namespace { + + void prepare_mirrors(std::vector& mirror_urls) + { + for (auto& url : mirror_urls) + { + auto p = url.clear_path(); + p = util::rstrip(p, '/'); + url.set_path(std::move(p), CondaURL::Encode::no); + } + } + + } + /********************************* * NameWeakener Implementation * *********************************/ @@ -47,19 +63,27 @@ namespace mamba::specs , m_id(util::rstrip(m_display_name, '/')) , m_platforms(std::move(platforms)) { - for (auto& url : m_mirror_urls) - { - auto p = url.clear_path(); - p = util::rstrip(p, '/'); - url.set_path(std::move(p), CondaURL::Encode::no); - } + prepare_mirrors(m_mirror_urls); } + auto Channel::is_package() const -> bool { return (m_mirror_urls.size() == 1u) && !url().package().empty(); } + void Channel::add_mirror_urls(const std::vector& additional_mirrors) + { + // keep the mirrors list withouth duplicates + auto new_urls = std::views::filter(additional_mirrors, [this](const auto& url){ return not stdext::contains(m_mirror_urls, url); }); + for(const auto& new_url : new_urls) // TODO C++23: replace by std::vector::append_range + { + m_mirror_urls.push_back(new_url); + } + prepare_mirrors(m_mirror_urls); + } + + auto Channel::mirror_urls() const -> const std::vector& { return m_mirror_urls; diff --git a/libmamba/tests/src/core/test_env_lockfile.cpp b/libmamba/tests/src/core/test_env_lockfile.cpp index 2b15400edf..15096c29d9 100644 --- a/libmamba/tests/src/core/test_env_lockfile.cpp +++ b/libmamba/tests/src/core/test_env_lockfile.cpp @@ -427,6 +427,7 @@ namespace mamba std::vector other_specs; auto transaction = create_explicit_transaction_from_lockfile( ctx, + channel_context, db, lockfile_path, categories, From 9822718c39bd3f7e7065910e89316aa5f2f5a16e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 13:21:01 +0100 Subject: [PATCH 02/66] c++ tests --- libmamba/tests/src/core/test_env_lockfile.cpp | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/libmamba/tests/src/core/test_env_lockfile.cpp b/libmamba/tests/src/core/test_env_lockfile.cpp index 15096c29d9..0a25a9deee 100644 --- a/libmamba/tests/src/core/test_env_lockfile.cpp +++ b/libmamba/tests/src/core/test_env_lockfile.cpp @@ -15,6 +15,7 @@ #include "mamba/core/package_database_loader.hpp" #include "mamba/core/transaction.hpp" #include "mamba/solver/libsolv/database.hpp" +#include "mamba/util/algorithm.hpp" #include "mambatests.hpp" @@ -249,7 +250,8 @@ namespace mamba auto test_get_specific_packages( const fs::u8path lockfile_path, size_t expected_total_package_count, - std::vector requests + std::vector requests, + std::vector expected_channels = {} ) -> void { auto maybe_lockfile = read_environment_lockfile(lockfile_path); @@ -268,6 +270,23 @@ namespace mamba const auto packages = lockfile.get_packages_for(request.package_filter); REQUIRE(packages.size() == request.expected_package_count); } + + const auto& channels = lockfile.get_metadata().channels; + for (const auto& expected_channel : expected_channels) + { + auto it = std::ranges::find( + channels, + expected_channel.name, + &mamba::EnvironmentLockFile::Channel::name + ); + REQUIRE(it != channels.end()); + + const auto& channel_info = *it; + for (const auto& url_mirror : expected_channel.urls) + { + REQUIRE(mamba::stdext::contains(channel_info.urls, url_mirror)); + } + } } TEST_CASE("env-lockfile get_specific_packages-conda") @@ -287,7 +306,13 @@ namespace mamba 51, { { 41, { .category = "main", .platform = "emscripten-wasm32", .manager = "conda" } }, { 26, { .category = "main", .platform = "noarch", .manager = "conda" } }, - { 10, { .category = "main", .platform = std::nullopt, .manager = "pip" } } } + { 10, { .category = "main", .platform = std::nullopt, .manager = "pip" } } }, + { { .name = "emscripten-forge", + .urls = { "https://prefix.dev/emscripten-forge-dev", + "https://repo.prefix.dev/emscripten-forge-dev" } }, + { .name = "conda-forge", + .urls = { "https://prefix.dev/conda-forge", + "https://repo.prefix.dev/conda-forge" } } } ); } From 4e7e5174de8310772b7f3a46b1191c059d102e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 13:22:09 +0100 Subject: [PATCH 03/66] debug info from ci --- micromamba/tests/test_create.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index ff8c48424c..8f2d90b37d 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -215,6 +215,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): print("packages installed:", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) + print("DEBUG: ", packages) @pytest.mark.skipif( platform.system() != "Linux", @@ -248,6 +249,8 @@ def test_lockfile_with_pip(tmp_home, tmp_root_prefix, tmp_path, lockfile_format) # Test pkg url ending with `.tar.bz2` assert any(package["name"] == "xz" and package["version"] == "5.2.6" for package in packages) + print("DEBUG: ", packages) + # TODO: Remove this test once this is fixed: # https://github.com/dateutil/dateutil/issues/1419 From 957eb644028edba53e55781556f35abb1bbf1149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 13:28:06 +0100 Subject: [PATCH 04/66] workaround incorrect compilers --- libmamba/tests/src/core/test_env_lockfile.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libmamba/tests/src/core/test_env_lockfile.cpp b/libmamba/tests/src/core/test_env_lockfile.cpp index 0a25a9deee..8b22bb2694 100644 --- a/libmamba/tests/src/core/test_env_lockfile.cpp +++ b/libmamba/tests/src/core/test_env_lockfile.cpp @@ -247,11 +247,17 @@ namespace mamba EnvironmentLockFile::PackageFilter package_filter; }; + struct ChannelInfo + { + std::string name = {}; + std::vector urls = {}; + }; + auto test_get_specific_packages( const fs::u8path lockfile_path, size_t expected_total_package_count, std::vector requests, - std::vector expected_channels = {} + std::vector expected_channels = {} ) -> void { auto maybe_lockfile = read_environment_lockfile(lockfile_path); From 7b4fcc4ca7d625fed2f7e34d5fa1f5995d9f53e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 14:32:13 +0100 Subject: [PATCH 05/66] debug info ci --- micromamba/tests/test_create.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 8f2d90b37d..498019f617 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -216,6 +216,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) print("DEBUG: ", packages) + assert False @pytest.mark.skipif( platform.system() != "Linux", @@ -250,6 +251,7 @@ def test_lockfile_with_pip(tmp_home, tmp_root_prefix, tmp_path, lockfile_format) assert any(package["name"] == "xz" and package["version"] == "5.2.6" for package in packages) print("DEBUG: ", packages) + assert False # TODO: Remove this test once this is fixed: From 542d4a9f6604704b6e2b9ac945efc5f1acab9fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 15:32:44 +0100 Subject: [PATCH 06/66] channels urls/mirrors coming from the env-lockfile have higher priority --- .../include/mamba/core/channel_context.hpp | 7 +++- libmamba/include/mamba/specs/channel.hpp | 14 ++++++- libmamba/src/core/channel_context.cpp | 11 ++++-- libmamba/src/specs/channel.cpp | 38 ++++++++++++++----- 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/libmamba/include/mamba/core/channel_context.hpp b/libmamba/include/mamba/core/channel_context.hpp index 98c0fdbef6..658b8ecf95 100644 --- a/libmamba/include/mamba/core/channel_context.hpp +++ b/libmamba/include/mamba/core/channel_context.hpp @@ -53,8 +53,11 @@ namespace mamba [[nodiscard]] auto make_channel(specs::UnresolvedChannel uc) -> const channel_list&; [[nodiscard]] auto make_channel(std::string_view name) -> const channel_list&; - [[nodiscard]] auto - make_channel(std::string_view name, const std::vector& mirrors) + [[nodiscard]] auto make_channel( + std::string_view name, + const std::vector& mirrors, + specs::Channel::UrlPriorty new_mirrors_priority = specs::Channel::UrlPriorty::high + ) -> const channel_list&; [[nodiscard]] auto params() const -> const specs::ChannelResolveParams&; diff --git a/libmamba/include/mamba/specs/channel.hpp b/libmamba/include/mamba/specs/channel.hpp index c23c6b24d0..a90aa04819 100644 --- a/libmamba/include/mamba/specs/channel.hpp +++ b/libmamba/include/mamba/specs/channel.hpp @@ -32,6 +32,12 @@ namespace mamba::specs using platform_list = util::flat_set; using channel_list = std::vector; + enum class UrlPriorty + { + high, ///< associated urls will be placed in the front the list of urls + low ///< associated urls will be placed in the back the list of urls + }; + [[nodiscard]] static auto resolve( // UnresolvedChannel uc, const ChannelResolveParams& params @@ -74,8 +80,12 @@ namespace mamba::specs auto clear_display_name() -> std::string; void set_display_name(std::string display_name); - // Adds mirror urls if not already recorded. - void add_mirror_urls(const std::vector& additional_mirrors); + // Adds mirror urls if not already recorded, by default added in the front of the mirrors + // list. + void add_mirror_urls( + const std::vector& additional_mirrors, + UrlPriorty priority = UrlPriorty::high + ); enum struct Match { diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index 6592899bbf..41cb53fe9f 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -288,18 +288,23 @@ namespace mamba return it->second; } - auto ChannelContext::make_channel(std::string_view name, const std::vector& mirrors) + auto ChannelContext::make_channel( + std::string_view name, + const std::vector& mirrors, + specs::Channel::UrlPriorty new_mirrors_priority + ) -> const channel_list& { if (const auto it = m_channel_cache.find(std::string(name)); it != m_channel_cache.end()) { + // inject additional mirrors if not already existing in current channels for(auto& channel : it->second) { // TODO C++23: replace all this by std::vector(from_range_t, ...) auto urls_view = specs::as_conda_urls(mirrors); std::vector urls(urls_view.begin(), urls_view.end()); - channel.add_mirror_urls(urls); + channel.add_mirror_urls(urls, new_mirrors_priority); } return it->second; } @@ -308,7 +313,7 @@ namespace mamba mirror_urls.reserve(mirrors.size()); for (const auto& mirror : mirrors) { - mirror_urls.push_back( // + mirror_urls.push_back( specs::CondaURL::parse(mirror) .or_else([](specs::ParseError&& err) { throw std::move(err); }) .value() diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index f6d201b61e..33ba0bce40 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -18,7 +18,8 @@ namespace mamba::specs { - namespace { + namespace + { void prepare_mirrors(std::vector& mirror_urls) { @@ -66,23 +67,40 @@ namespace mamba::specs prepare_mirrors(m_mirror_urls); } - auto Channel::is_package() const -> bool { return (m_mirror_urls.size() == 1u) && !url().package().empty(); } - void Channel::add_mirror_urls(const std::vector& additional_mirrors) + void + Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty priority) { - // keep the mirrors list withouth duplicates - auto new_urls = std::views::filter(additional_mirrors, [this](const auto& url){ return not stdext::contains(m_mirror_urls, url); }); - for(const auto& new_url : new_urls) // TODO C++23: replace by std::vector::append_range + auto all_urls = m_mirror_urls; + + // keep the mirrors list without duplicates + auto new_urls = std::views::filter( + additional_mirrors, + [&](const auto& url) { return not stdext::contains(all_urls, url); } + ); + + const auto insertion_point = [&] { - m_mirror_urls.push_back(new_url); - } - prepare_mirrors(m_mirror_urls); - } + switch (priority) + { + default: + case UrlPriorty::high: + return all_urls.begin(); + case UrlPriorty::low: + return all_urls.end(); + } + }(); + + // TODO C++23: replace by std::vector::append_range + all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); + prepare_mirrors(all_urls); + m_mirror_urls = all_urls; + } auto Channel::mirror_urls() const -> const std::vector& { From 7e7b4436656b5375f61f9bfeb2a201a077937eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 15:56:40 +0100 Subject: [PATCH 07/66] tweak url priority logic --- libmamba/include/mamba/core/channel_context.hpp | 2 +- libmamba/include/mamba/specs/channel.hpp | 4 ++-- libmamba/src/core/transaction.cpp | 14 ++++++++++---- libmamba/src/specs/channel.cpp | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/libmamba/include/mamba/core/channel_context.hpp b/libmamba/include/mamba/core/channel_context.hpp index 658b8ecf95..1d9622f69d 100644 --- a/libmamba/include/mamba/core/channel_context.hpp +++ b/libmamba/include/mamba/core/channel_context.hpp @@ -56,7 +56,7 @@ namespace mamba [[nodiscard]] auto make_channel( std::string_view name, const std::vector& mirrors, - specs::Channel::UrlPriorty new_mirrors_priority = specs::Channel::UrlPriorty::high + specs::Channel::UrlPriorty new_mirrors_priority = specs::Channel::UrlPriorty::low ) -> const channel_list&; diff --git a/libmamba/include/mamba/specs/channel.hpp b/libmamba/include/mamba/specs/channel.hpp index a90aa04819..202eb990d6 100644 --- a/libmamba/include/mamba/specs/channel.hpp +++ b/libmamba/include/mamba/specs/channel.hpp @@ -80,11 +80,11 @@ namespace mamba::specs auto clear_display_name() -> std::string; void set_display_name(std::string display_name); - // Adds mirror urls if not already recorded, by default added in the front of the mirrors + // Adds mirror urls if not already recorded, by default added at the end of the mirrors // list. void add_mirror_urls( const std::vector& additional_mirrors, - UrlPriorty priority = UrlPriorty::high + UrlPriorty priority = UrlPriorty::low ); enum struct Match diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 74c6a736a6..8eefb1525e 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1378,12 +1378,18 @@ namespace mamba LOG_DEBUG << " manager = " << package.manager; } - if(lockfile_data.get_metadata().enable_channels) + if (lockfile_data.get_metadata().enable_channels) { - // create or add mirrors to additional channels - for(const EnvironmentLockFile::Channel& channel_info : lockfile_data.get_metadata().channels) + // create or add mirrors to additional channels + for (const EnvironmentLockFile::Channel& channel_info : + lockfile_data.get_metadata().channels) { - auto channels [[maybe_unused]] = channel_context.make_channel(channel_info.name, channel_info.urls); + auto channels [[maybe_unused]] = channel_context.make_channel( + channel_info.name, + channel_info.urls, + specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // of the mirrors list + ); } } diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 33ba0bce40..2aaf0f902f 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -99,7 +99,7 @@ namespace mamba::specs all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); prepare_mirrors(all_urls); - m_mirror_urls = all_urls; + m_mirror_urls = std::move(all_urls); } auto Channel::mirror_urls() const -> const std::vector& From 2e6e11a3a73446d4aa1afce0d5627522b99d43b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 16:06:20 +0100 Subject: [PATCH 08/66] tweak ci debug info --- micromamba/tests/test_create.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 498019f617..8682f4cccc 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -216,7 +216,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) print("DEBUG: ", packages) - assert False + assert lockfile_format == lockfile_format_mambajs @pytest.mark.skipif( platform.system() != "Linux", @@ -251,7 +251,7 @@ def test_lockfile_with_pip(tmp_home, tmp_root_prefix, tmp_path, lockfile_format) assert any(package["name"] == "xz" and package["version"] == "5.2.6" for package in packages) print("DEBUG: ", packages) - assert False + assert lockfile_format == lockfile_format_mambajs # TODO: Remove this test once this is fixed: From eec22d49e8bd2c65f6328d12cf3046769813cf42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 22 Dec 2025 16:14:36 +0100 Subject: [PATCH 09/66] fix wrong debug info --- micromamba/tests/test_create.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 8682f4cccc..2785fa9e3b 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -216,7 +216,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) print("DEBUG: ", packages) - assert lockfile_format == lockfile_format_mambajs + assert lockfile_format != lockfile_format_mambajs @pytest.mark.skipif( platform.system() != "Linux", @@ -251,7 +251,7 @@ def test_lockfile_with_pip(tmp_home, tmp_root_prefix, tmp_path, lockfile_format) assert any(package["name"] == "xz" and package["version"] == "5.2.6" for package in packages) print("DEBUG: ", packages) - assert lockfile_format == lockfile_format_mambajs + assert lockfile_format != lockfile_format_mambajs # TODO: Remove this test once this is fixed: From bbd62c0db57e937b4db2dd2260ca6737649b4f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:57:24 +0100 Subject: [PATCH 10/66] fix attempt --- libmamba/src/core/channel_context.cpp | 1 + libmamba/src/specs/channel.cpp | 2 +- micromamba/tests/test_create.py | 3 --- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index 41cb53fe9f..9eff4c782b 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -309,6 +309,7 @@ namespace mamba return it->second; } + // TODO C++23: replace by append_range std::vector mirror_urls; mirror_urls.reserve(mirrors.size()); for (const auto& mirror : mirrors) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 2aaf0f902f..e244c67d0a 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -80,7 +80,7 @@ namespace mamba::specs // keep the mirrors list without duplicates auto new_urls = std::views::filter( additional_mirrors, - [&](const auto& url) { return not stdext::contains(all_urls, url); } + [&](const auto& url) { return not stdext::contains(m_mirror_urls, url); } ); const auto insertion_point = [&] diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 2785fa9e3b..c2eec88e5c 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -250,9 +250,6 @@ def test_lockfile_with_pip(tmp_home, tmp_root_prefix, tmp_path, lockfile_format) # Test pkg url ending with `.tar.bz2` assert any(package["name"] == "xz" and package["version"] == "5.2.6" for package in packages) - print("DEBUG: ", packages) - assert lockfile_format != lockfile_format_mambajs - # TODO: Remove this test once this is fixed: # https://github.com/dateutil/dateutil/issues/1419 From 1e7a72193bcf1413b991cfa8b17b623bae302770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 15:38:16 +0100 Subject: [PATCH 11/66] fix attempt --- libmamba/src/specs/channel.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index e244c67d0a..3481940598 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -83,20 +83,25 @@ namespace mamba::specs [&](const auto& url) { return not stdext::contains(m_mirror_urls, url); } ); - const auto insertion_point = [&] + switch (priority) { - switch (priority) + default: + case UrlPriorty::high: { - default: - case UrlPriorty::high: - return all_urls.begin(); - case UrlPriorty::low: - return all_urls.end(); + // TODO C++23 consider using append_range + std::vector urls(new_urls.begin(), new_urls.end()); // TODO C++23 range to + urls.insert(urls.end(), all_urls.begin(), all_urls.end()); + all_urls = std::move(urls); } - }(); - - // TODO C++23: replace by std::vector::append_range - all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); + case UrlPriorty::low: + { + // keep the one by one loop to keep vectors valid + for (const auto& url : new_urls) + { + all_urls.push_back(url); + } + } + } prepare_mirrors(all_urls); m_mirror_urls = std::move(all_urls); From cc33b170a88cc50517e91153b36a4063b18865ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 16:16:20 +0100 Subject: [PATCH 12/66] fixup --- libmamba/src/specs/channel.cpp | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 3481940598..596774ed9f 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -78,30 +78,27 @@ namespace mamba::specs auto all_urls = m_mirror_urls; // keep the mirrors list without duplicates - auto new_urls = std::views::filter( + auto new_urls_view = std::views::filter( additional_mirrors, - [&](const auto& url) { return not stdext::contains(m_mirror_urls, url); } + [&](const auto& url) { return not stdext::contains(all_urls, url); } ); + // TODO C++23 range `to` + std::vector new_urls(new_urls_view.begin(), new_urls_view.end()); - switch (priority) + auto insertion_point = [&] { - default: - case UrlPriorty::high: + switch (priority) { - // TODO C++23 consider using append_range - std::vector urls(new_urls.begin(), new_urls.end()); // TODO C++23 range to - urls.insert(urls.end(), all_urls.begin(), all_urls.end()); - all_urls = std::move(urls); - } - case UrlPriorty::low: - { - // keep the one by one loop to keep vectors valid - for (const auto& url : new_urls) - { - all_urls.push_back(url); - } + case UrlPriorty::high: + return all_urls.begin(); + + default: + case UrlPriorty::low: + return all_urls.end(); } - } + }(); + + all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); prepare_mirrors(all_urls); m_mirror_urls = std::move(all_urls); From f03eea2b085feed22b290c4ecfcdb52911b26777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 16:50:34 +0100 Subject: [PATCH 13/66] attempt to figure out what's happening --- libmamba/src/specs/channel.cpp | 45 +++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 596774ed9f..9ac4c45a39 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -78,27 +78,32 @@ namespace mamba::specs auto all_urls = m_mirror_urls; // keep the mirrors list without duplicates - auto new_urls_view = std::views::filter( - additional_mirrors, - [&](const auto& url) { return not stdext::contains(all_urls, url); } - ); - // TODO C++23 range `to` - std::vector new_urls(new_urls_view.begin(), new_urls_view.end()); - - auto insertion_point = [&] + //auto new_urls_view = std::views::filter( + // additional_mirrors, + // [&](const auto& url) { return not stdext::contains(all_urls, url); } + //); + //// TODO C++23 range `to` + //std::vector new_urls(new_urls_view.begin(), new_urls_view.end()); + + //auto insertion_point = [&] + //{ + // switch (priority) + // { + // case UrlPriorty::high: + // return all_urls.begin(); + + // default: + // case UrlPriorty::low: + // return all_urls.end(); + // } + //}(); + + //all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); + + for (const auto& url : additional_mirrors) { - switch (priority) - { - case UrlPriorty::high: - return all_urls.begin(); - - default: - case UrlPriorty::low: - return all_urls.end(); - } - }(); - - all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); + all_urls.push_back(url); + } prepare_mirrors(all_urls); m_mirror_urls = std::move(all_urls); From 127d5432d4c8001286ea76f1459b940bc36fd6cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:39:35 +0100 Subject: [PATCH 14/66] workaround annoying warnings as error --- libmamba/src/specs/channel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 9ac4c45a39..620c41db84 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -73,7 +73,7 @@ namespace mamba::specs } void - Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty priority) + Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty /*priority*/) { auto all_urls = m_mirror_urls; From 19b4f15508d3f36c5324b843932c90e09c6ec94a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:51:50 +0100 Subject: [PATCH 15/66] attempt mirror added on top + no unicity filter --- libmamba/src/specs/channel.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 620c41db84..384393c54d 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -75,7 +75,7 @@ namespace mamba::specs void Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty /*priority*/) { - auto all_urls = m_mirror_urls; + //auto all_urls = m_mirror_urls; // keep the mirrors list without duplicates //auto new_urls_view = std::views::filter( @@ -100,13 +100,24 @@ namespace mamba::specs //all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); - for (const auto& url : additional_mirrors) + // WORKS BUT DOESNT MAKE THE RIGHT CHANNEL WORK WITH MANBAJS ENV LOCKFILES + /*for (const auto& url : additional_mirrors) { all_urls.push_back(url); + }*/ + + + // prepare_mirrors(all_urls); + // m_mirror_urls = std::move(all_urls); + + auto all_mirrors = additional_mirrors; + for (const auto& url : m_mirror_urls) + { + all_mirrors.push_back(url); } - prepare_mirrors(all_urls); - m_mirror_urls = std::move(all_urls); + prepare_mirrors(all_mirrors); + m_mirror_urls = std::move(all_mirrors); } auto Channel::mirror_urls() const -> const std::vector& From 9f5e696366b8d775ae6dca1be1dd421f0d4bf73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:58:43 +0100 Subject: [PATCH 16/66] attempt to gather more data --- libmamba/src/specs/channel.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 384393c54d..086d427042 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -8,6 +8,8 @@ #include #include +#include + #include "mamba/fs/filesystem.hpp" #include "mamba/specs/channel.hpp" #include "mamba/util/algorithm.hpp" @@ -109,13 +111,21 @@ namespace mamba::specs // prepare_mirrors(all_urls); // m_mirror_urls = std::move(all_urls); - + + std::cout << "ADDING MIRRORS TO " << this->id() << std::endl; auto all_mirrors = additional_mirrors; for (const auto& url : m_mirror_urls) { + std::cout << " + " << url.str() << std::endl; all_mirrors.push_back(url); } + std::cout << "ALL MIRRORS FOR " << this->id() << std::endl; + for (const auto& url : all_mirrors) + { + std::cout << " + " << url.str() << std::endl; + } + prepare_mirrors(all_mirrors); m_mirror_urls = std::move(all_mirrors); } From cdd437d1fc6bfcf42c2a40cd29c708afbbc4bccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 19:08:51 +0100 Subject: [PATCH 17/66] tweak --- libmamba/src/specs/channel.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 086d427042..8e396daa57 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -112,18 +112,16 @@ namespace mamba::specs // prepare_mirrors(all_urls); // m_mirror_urls = std::move(all_urls); - std::cout << "ADDING MIRRORS TO " << this->id() << std::endl; auto all_mirrors = additional_mirrors; for (const auto& url : m_mirror_urls) { - std::cout << " + " << url.str() << std::endl; all_mirrors.push_back(url); } - std::cout << "ALL MIRRORS FOR " << this->id() << std::endl; + std::cout << "\nALL MIRRORS FOR " << this->id() << std::endl; for (const auto& url : all_mirrors) { - std::cout << " + " << url.str() << std::endl; + std::cout << " " << url.str() << std::endl; } prepare_mirrors(all_mirrors); From b4064631a93dc29a5047747d05e8b7020971e7af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 23 Dec 2025 19:18:10 +0100 Subject: [PATCH 18/66] experiment: valid prefix url --- micromamba/tests/env_lockfiles/test-env-lock-linux-64.json | 6 +----- micromamba/tests/env_lockfiles/test-env-lock-win-64.json | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json b/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json index 8af9741d56..2b5b85c8c0 100644 --- a/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json +++ b/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json @@ -15,11 +15,7 @@ ], "conda-forge": [ { - "url": "https://prefix.dev/conda-forge", - "protocol": "https" - }, - { - "url": "https://repo.prefix.dev/conda-forge", + "url": "https://prefix.dev/channels/conda-forge", "protocol": "https" } ] diff --git a/micromamba/tests/env_lockfiles/test-env-lock-win-64.json b/micromamba/tests/env_lockfiles/test-env-lock-win-64.json index 0e5214ea3d..f90389b41d 100644 --- a/micromamba/tests/env_lockfiles/test-env-lock-win-64.json +++ b/micromamba/tests/env_lockfiles/test-env-lock-win-64.json @@ -15,11 +15,7 @@ ], "conda-forge": [ { - "url": "https://prefix.dev/conda-forge", - "protocol": "https" - }, - { - "url": "https://repo.prefix.dev/conda-forge", + "url": "https://prefix.dev/channels/conda-forge", "protocol": "https" } ] From f3c3a029da405ca502cc88aee86172eb1fe6e3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 6 Jan 2026 11:15:36 +0100 Subject: [PATCH 19/66] tweak debug log --- libmamba/src/specs/channel.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 8e396daa57..48b8091c3a 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -6,10 +6,10 @@ #include #include -#include - #include +#include +#include "mamba/core/logging.hpp" #include "mamba/fs/filesystem.hpp" #include "mamba/specs/channel.hpp" #include "mamba/util/algorithm.hpp" @@ -77,22 +77,22 @@ namespace mamba::specs void Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty /*priority*/) { - //auto all_urls = m_mirror_urls; + // auto all_urls = m_mirror_urls; // keep the mirrors list without duplicates - //auto new_urls_view = std::views::filter( + // auto new_urls_view = std::views::filter( // additional_mirrors, // [&](const auto& url) { return not stdext::contains(all_urls, url); } //); //// TODO C++23 range `to` - //std::vector new_urls(new_urls_view.begin(), new_urls_view.end()); + // std::vector new_urls(new_urls_view.begin(), new_urls_view.end()); - //auto insertion_point = [&] + // auto insertion_point = [&] //{ - // switch (priority) - // { - // case UrlPriorty::high: - // return all_urls.begin(); + // switch (priority) + // { + // case UrlPriorty::high: + // return all_urls.begin(); // default: // case UrlPriorty::low: @@ -100,7 +100,7 @@ namespace mamba::specs // } //}(); - //all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); + // all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); // WORKS BUT DOESNT MAKE THE RIGHT CHANNEL WORK WITH MANBAJS ENV LOCKFILES /*for (const auto& url : additional_mirrors) @@ -108,20 +108,20 @@ namespace mamba::specs all_urls.push_back(url); }*/ - + // prepare_mirrors(all_urls); // m_mirror_urls = std::move(all_urls); - + auto all_mirrors = additional_mirrors; for (const auto& url : m_mirror_urls) { all_mirrors.push_back(url); } - std::cout << "\nALL MIRRORS FOR " << this->id() << std::endl; + LOG_DEBUG << "\nALL MIRRORS FOR " << this->id(); for (const auto& url : all_mirrors) { - std::cout << " " << url.str() << std::endl; + LOG_DEBUG << " " << url.str(); } prepare_mirrors(all_mirrors); From e3d78e55f0c32bf381ad4a8e52ce2eb5764a8883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 6 Jan 2026 11:25:09 +0100 Subject: [PATCH 20/66] tweak to confirm issue --- libmamba/src/core/transaction.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 8eefb1525e..1762454c6c 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1387,8 +1387,9 @@ namespace mamba auto channels [[maybe_unused]] = channel_context.make_channel( channel_info.name, channel_info.urls, - specs::Channel::UrlPriorty::high // put the urls coming form this file on top - // of the mirrors list + //specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // // of the mirrors list + specs::Channel::UrlPriorty::low ); } } From 61777cefaf21c4c62c4788e39b96bb83139e3509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 6 Jan 2026 11:30:01 +0100 Subject: [PATCH 21/66] revert to correct behavior --- libmamba/src/core/transaction.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 1762454c6c..8eefb1525e 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1387,9 +1387,8 @@ namespace mamba auto channels [[maybe_unused]] = channel_context.make_channel( channel_info.name, channel_info.urls, - //specs::Channel::UrlPriorty::high // put the urls coming form this file on top - // // of the mirrors list - specs::Channel::UrlPriorty::low + specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // of the mirrors list ); } } From 576cc9f29aa550cd99a9faacb9b7120798c8cc49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 6 Jan 2026 11:32:17 +0100 Subject: [PATCH 22/66] Revert "experiment: valid prefix url" This reverts commit 61dd997e8258a5c6f79e3ba874505bd851d59ac7. --- micromamba/tests/env_lockfiles/test-env-lock-linux-64.json | 6 +++++- micromamba/tests/env_lockfiles/test-env-lock-win-64.json | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json b/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json index 2b5b85c8c0..8af9741d56 100644 --- a/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json +++ b/micromamba/tests/env_lockfiles/test-env-lock-linux-64.json @@ -15,7 +15,11 @@ ], "conda-forge": [ { - "url": "https://prefix.dev/channels/conda-forge", + "url": "https://prefix.dev/conda-forge", + "protocol": "https" + }, + { + "url": "https://repo.prefix.dev/conda-forge", "protocol": "https" } ] diff --git a/micromamba/tests/env_lockfiles/test-env-lock-win-64.json b/micromamba/tests/env_lockfiles/test-env-lock-win-64.json index f90389b41d..0e5214ea3d 100644 --- a/micromamba/tests/env_lockfiles/test-env-lock-win-64.json +++ b/micromamba/tests/env_lockfiles/test-env-lock-win-64.json @@ -15,7 +15,11 @@ ], "conda-forge": [ { - "url": "https://prefix.dev/channels/conda-forge", + "url": "https://prefix.dev/conda-forge", + "protocol": "https" + }, + { + "url": "https://repo.prefix.dev/conda-forge", "protocol": "https" } ] From 429172695e5fa8557fa1cf99f779f6c1a87be4b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 6 Jan 2026 11:47:44 +0100 Subject: [PATCH 23/66] tests: dont force default channel when testing env-lockfiles --- micromamba/tests/test_create.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index c2eec88e5c..24255b24bd 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -207,7 +207,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): shutil.copyfile(lockfile_to_use, spec_file) - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json") + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) print("create result:", res) assert res["success"] @@ -230,7 +230,7 @@ def test_lockfile_with_pip(tmp_home, tmp_root_prefix, tmp_path, lockfile_format) shutil.copyfile(pip_lockfile_path(lockfile_format), spec_file) - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json") + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) assert res["success"] packages = helpers.umamba_list("-p", env_prefix, "--json") @@ -268,7 +268,7 @@ def test_pip_git_https_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_fo shutil.copyfile(pip_git_https_lockfile_path(lockfile_format), spec_file) - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json") + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) assert res["success"] packages = helpers.umamba_list("-p", env_prefix, "--json") @@ -295,7 +295,7 @@ def test_lockfile_online( env_prefix = tmp_path / "myenv" spec_file = "https://raw.githubusercontent.com/mamba-org/mamba/main/micromamba/tests/env_lockfiles/test-env-lock.yaml" - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json") + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) assert res["success"] packages = helpers.umamba_list("-p", env_prefix, "--json") @@ -318,11 +318,11 @@ def test_env_lockfile_different_install_after_create( _base_lockfile_path("envlockfile-check-step-2-lock", lockfile_format), install_spec_file ) - res = helpers.create("-p", env_prefix, "-f", create_spec_file, "-y", "--json") + res = helpers.create("-p", env_prefix, "-f", create_spec_file, "-y", "--json", default_channel = False) assert res["success"] # Must not crash - helpers.install("-p", env_prefix, "-f", install_spec_file, "-y", "--json") + helpers.install("-p", env_prefix, "-f", install_spec_file, "-y", "--json", default_channel = False) @pytest.mark.parametrize("shared_pkgs_dirs", [True], indirect=True) From 0455438928a32774f22ac5d438dc3bf1f26366fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 6 Jan 2026 14:59:35 +0100 Subject: [PATCH 24/66] improved error reports --- libmamba/src/core/package_cache.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libmamba/src/core/package_cache.cpp b/libmamba/src/core/package_cache.cpp index cff7a52af7..666ad7192e 100644 --- a/libmamba/src/core/package_cache.cpp +++ b/libmamba/src/core/package_cache.cpp @@ -570,8 +570,12 @@ namespace mamba } else { - LOG_ERROR << "Cannot find tarball cache for '" << s.filename << "'"; - throw std::runtime_error("Package cache error."); + const auto message = fmt::format( + "Package cache error: Cannot find tarball cache for '{}'", + s.filename + ); + LOG_ERROR << message; + throw std::runtime_error(message); } } @@ -602,8 +606,12 @@ namespace mamba } else { - LOG_ERROR << "Cannot find a valid extracted directory cache for '" << s.filename << "'"; - throw std::runtime_error("Package cache error."); + const auto message = fmt::format( + "Package cache error: Cannot find a valid extracted directory cache for '{}'", + s.filename + ); + LOG_ERROR << message; + throw std::runtime_error(message); } } From 4497b373a81f4c4d51a4f455ce1c8ae68d0b1752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 6 Jan 2026 14:59:47 +0100 Subject: [PATCH 25/66] reactivated correct channel mirrors injection logic --- libmamba/src/specs/channel.cpp | 62 ++++++++++++++-------------------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 48b8091c3a..1c53935c73 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -75,57 +75,47 @@ namespace mamba::specs } void - Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty /*priority*/) + Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty priority) { - // auto all_urls = m_mirror_urls; + auto all_urls = m_mirror_urls; // keep the mirrors list without duplicates - // auto new_urls_view = std::views::filter( - // additional_mirrors, - // [&](const auto& url) { return not stdext::contains(all_urls, url); } - //); - //// TODO C++23 range `to` - // std::vector new_urls(new_urls_view.begin(), new_urls_view.end()); - - // auto insertion_point = [&] - //{ - // switch (priority) - // { - // case UrlPriorty::high: - // return all_urls.begin(); - - // default: - // case UrlPriorty::low: - // return all_urls.end(); - // } - //}(); - - // all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); + auto new_urls_view = std::views::filter( + additional_mirrors, + [&](const auto& url) { return not stdext::contains(all_urls, url); } + ); + // TODO C++23 range `to` + std::vector new_urls(new_urls_view.begin(), new_urls_view.end()); - // WORKS BUT DOESNT MAKE THE RIGHT CHANNEL WORK WITH MANBAJS ENV LOCKFILES - /*for (const auto& url : additional_mirrors) + auto insertion_point = [&] { - all_urls.push_back(url); - }*/ + switch (priority) + { + case UrlPriorty::high: + return all_urls.begin(); + default: + case UrlPriorty::low: + return all_urls.end(); + } + }(); - // prepare_mirrors(all_urls); - // m_mirror_urls = std::move(all_urls); + all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); - auto all_mirrors = additional_mirrors; - for (const auto& url : m_mirror_urls) + // WORKS BUT DOESNT MAKE THE RIGHT CHANNEL WORK WITH MANBAJS ENV LOCKFILES + for (const auto& url : additional_mirrors) { - all_mirrors.push_back(url); + all_urls.push_back(url); } + prepare_mirrors(all_urls); + m_mirror_urls = std::move(all_urls); + LOG_DEBUG << "\nALL MIRRORS FOR " << this->id(); - for (const auto& url : all_mirrors) + for (const auto& url : m_mirror_urls) { LOG_DEBUG << " " << url.str(); } - - prepare_mirrors(all_mirrors); - m_mirror_urls = std::move(all_mirrors); } auto Channel::mirror_urls() const -> const std::vector& From 67529368ce72531e5b09d84808e1d9c871a564e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:55:49 +0100 Subject: [PATCH 26/66] attempt to fix failure with `--json` because packages info dont have yet the url set when we generate the json log --- libmamba/src/api/install.cpp | 13 ++++++++----- libmamba/src/api/utils.cpp | 19 +++++++++++++------ libmamba/src/core/package_cache.cpp | 3 ++- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/libmamba/src/api/install.cpp b/libmamba/src/api/install.cpp index 307bc24245..ee7253065e 100644 --- a/libmamba/src/api/install.cpp +++ b/libmamba/src/api/install.cpp @@ -1238,15 +1238,18 @@ namespace mamba auto execute_transaction = [&](MTransaction& transaction) { - if (ctx.output_params.json) - { - transaction.log_json(); - } - auto prompt_entry = transaction.prompt(ctx, channel_context); if (prompt_entry) { transaction.execute(ctx, channel_context, prefix_data); + if (ctx.output_params.json) + { + transaction.log_json(); + } + } + else if (ctx.output_params.json) + { + transaction.log_json(); } return prompt_entry; }; diff --git a/libmamba/src/api/utils.cpp b/libmamba/src/api/utils.cpp index 64b8730381..59a68f7f22 100644 --- a/libmamba/src/api/utils.cpp +++ b/libmamba/src/api/utils.cpp @@ -727,10 +727,6 @@ namespace mamba const std::function& on_abort ) { - if (ctx.output_params.json) - { - transaction.log_json(); - } const auto should_execute = transaction.prompt(ctx, channel_context); if (should_execute) { @@ -739,14 +735,25 @@ namespace mamba before_execute(); } transaction.execute(ctx, channel_context, prefix_data); + if (ctx.output_params.json) + { + transaction.log_json(); + } if (after_execute) { after_execute(); } } - else if (on_abort) + else { - on_abort(); + if (ctx.output_params.json) + { + transaction.log_json(); + } + if (on_abort) + { + on_abort(); + } } return should_execute; } diff --git a/libmamba/src/core/package_cache.cpp b/libmamba/src/core/package_cache.cpp index 666ad7192e..0000dc74b5 100644 --- a/libmamba/src/core/package_cache.cpp +++ b/libmamba/src/core/package_cache.cpp @@ -417,7 +417,8 @@ namespace mamba // Validate URL if (valid) { - if (!repodata_record["url"].get().empty()) + const auto repodata_url = repodata_record["url"].get(); + if (!repodata_url.empty()) { const auto pkg_url = repodata_record["url"].get(); if (!compare_cleaned_url(pkg_url, s.package_url)) From 8de30d4027df90cf38fef408ce1310d861374367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:37:35 +0100 Subject: [PATCH 27/66] fix attempt variation for --json --- libmamba/src/core/transaction.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 8eefb1525e..b3abf4ee82 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -505,6 +505,12 @@ namespace mamba } }; + + if (ctx.output_params.json) + { + log_json(); + } + TransactionRollback rollback; TransactionContext transaction_context( ctx.transaction_params(), From 6464c702021d5a3e273c7df65a9290d8e3a58933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 9 Jan 2026 16:35:58 +0100 Subject: [PATCH 28/66] add more context information for ci errors reports --- libmamba/src/core/package_cache.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/libmamba/src/core/package_cache.cpp b/libmamba/src/core/package_cache.cpp index 0000dc74b5..33559cdc64 100644 --- a/libmamba/src/core/package_cache.cpp +++ b/libmamba/src/core/package_cache.cpp @@ -6,9 +6,11 @@ #include #include +#include #include #include +#include #include #include "mamba/core/context.hpp" @@ -572,8 +574,12 @@ namespace mamba else { const auto message = fmt::format( - "Package cache error: Cannot find tarball cache for '{}'", - s.filename + "Package cache error: Cannot find tarball cache for '{}' (evaluated cache dirs: tarballs {}, local {})", + s.filename, + m_cached_tarballs, + m_caches + | std::views::transform([](const auto& pkg_cache_data) + { return pkg_cache_data.path(); }) ); LOG_ERROR << message; throw std::runtime_error(message); @@ -608,8 +614,12 @@ namespace mamba else { const auto message = fmt::format( - "Package cache error: Cannot find a valid extracted directory cache for '{}'", - s.filename + "Package cache error: Cannot find a valid extracted directory cache for '{}' (evaluated cache dirs: extraction {}, local {})", + s.filename, + m_cached_extracted_dirs, + m_caches + | std::views::transform([](const auto& pkg_cache_data) + { return pkg_cache_data.path(); }) ); LOG_ERROR << message; throw std::runtime_error(message); From cfa724d70a74de6dd743ed314a1321df712abb49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 9 Jan 2026 16:48:39 +0100 Subject: [PATCH 29/66] added missing json log if dryrun --- libmamba/src/core/transaction.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index b3abf4ee82..2776199891 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -390,6 +390,10 @@ namespace mamba if (ctx.dry_run) { + if (ctx.output_params.json) + { + log_json(); + } Console::stream() << "Dry run. Not executing the transaction."; return true; } From e8a7880921496b78342995a1f99992e14ad191dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 9 Jan 2026 17:16:21 +0100 Subject: [PATCH 30/66] experiment: comment channel injection from mambajs lockfiles --- libmamba/src/core/transaction.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 2776199891..4504ccac59 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1388,20 +1388,20 @@ namespace mamba LOG_DEBUG << " manager = " << package.manager; } - if (lockfile_data.get_metadata().enable_channels) - { - // create or add mirrors to additional channels - for (const EnvironmentLockFile::Channel& channel_info : - lockfile_data.get_metadata().channels) - { - auto channels [[maybe_unused]] = channel_context.make_channel( - channel_info.name, - channel_info.urls, - specs::Channel::UrlPriorty::high // put the urls coming form this file on top - // of the mirrors list - ); - } - } + //if (lockfile_data.get_metadata().enable_channels) + //{ + // // create or add mirrors to additional channels + // for (const EnvironmentLockFile::Channel& channel_info : + // lockfile_data.get_metadata().channels) + // { + // auto channels [[maybe_unused]] = channel_context.make_channel( + // channel_info.name, + // channel_info.urls, + // specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // // of the mirrors list + // ); + // } + //} std::vector conda_packages = {}; std::vector pip_packages = {}; From 58fbfe5251da1695b337ed2f90b7c56386f3f7c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 9 Jan 2026 17:19:22 +0100 Subject: [PATCH 31/66] warning tweak --- libmamba/src/core/transaction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 4504ccac59..8953501128 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1363,7 +1363,7 @@ namespace mamba MTransaction create_explicit_transaction_from_lockfile( const Context& ctx, - ChannelContext& channel_context, + //ChannelContext& channel_context, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, const std::vector& categories, From 7be95fca99787dcf32425a39d0a990557490dac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 9 Jan 2026 17:23:16 +0100 Subject: [PATCH 32/66] woops --- libmamba/src/core/transaction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 8953501128..179f254c9d 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1363,7 +1363,7 @@ namespace mamba MTransaction create_explicit_transaction_from_lockfile( const Context& ctx, - //ChannelContext& channel_context, + ChannelContext& /*channel_context*/, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, const std::vector& categories, From 04b665c1a88b2e85b10ef15dc1d5227c603a5caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 9 Jan 2026 18:05:58 +0100 Subject: [PATCH 33/66] experiment; reactivate lockfile channels injection code but put the urls at the end of the mirrors list --- libmamba/src/core/transaction.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 179f254c9d..cbe350f363 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1363,7 +1363,7 @@ namespace mamba MTransaction create_explicit_transaction_from_lockfile( const Context& ctx, - ChannelContext& /*channel_context*/, + ChannelContext& channel_context, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, const std::vector& categories, @@ -1388,20 +1388,21 @@ namespace mamba LOG_DEBUG << " manager = " << package.manager; } - //if (lockfile_data.get_metadata().enable_channels) - //{ - // // create or add mirrors to additional channels - // for (const EnvironmentLockFile::Channel& channel_info : - // lockfile_data.get_metadata().channels) - // { - // auto channels [[maybe_unused]] = channel_context.make_channel( - // channel_info.name, - // channel_info.urls, - // specs::Channel::UrlPriorty::high // put the urls coming form this file on top - // // of the mirrors list - // ); - // } - //} + if (lockfile_data.get_metadata().enable_channels) + { + // create or add mirrors to additional channels + for (const EnvironmentLockFile::Channel& channel_info : + lockfile_data.get_metadata().channels) + { + auto channels [[maybe_unused]] = channel_context.make_channel( + channel_info.name, + channel_info.urls, + //specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // // of the mirrors list + specs::Channel::UrlPriorty::low // FOR TESTING PURPOSE ONLY + ); + } + } std::vector conda_packages = {}; std::vector pip_packages = {}; From c3215961f6a778bb1af6737777c199216081f8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 9 Jan 2026 19:28:51 +0100 Subject: [PATCH 34/66] restore intended code (fails on ci) --- libmamba/src/core/transaction.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index cbe350f363..2776199891 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1397,9 +1397,8 @@ namespace mamba auto channels [[maybe_unused]] = channel_context.make_channel( channel_info.name, channel_info.urls, - //specs::Channel::UrlPriorty::high // put the urls coming form this file on top - // // of the mirrors list - specs::Channel::UrlPriorty::low // FOR TESTING PURPOSE ONLY + specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // of the mirrors list ); } } From 9fab0717555c58161c261c078f360080722062a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 12 Jan 2026 11:36:24 +0100 Subject: [PATCH 35/66] make sure injected channels are taken into account through context and related systems --- libmamba/include/mamba/core/transaction.hpp | 2 +- libmamba/src/core/transaction.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libmamba/include/mamba/core/transaction.hpp b/libmamba/include/mamba/core/transaction.hpp index 3eac4acb77..b140a1442f 100644 --- a/libmamba/include/mamba/core/transaction.hpp +++ b/libmamba/include/mamba/core/transaction.hpp @@ -106,7 +106,7 @@ namespace mamba ); MTransaction create_explicit_transaction_from_lockfile( - const Context& ctx, + Context& ctx, ChannelContext& channel_context, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 2776199891..bc940158d8 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -19,6 +19,7 @@ #include #include +#include "mamba/api/channel_loader.hpp" #include "mamba/core/channel_context.hpp" #include "mamba/core/context.hpp" #include "mamba/core/download_progress_bar.hpp" @@ -1362,7 +1363,7 @@ namespace mamba } MTransaction create_explicit_transaction_from_lockfile( - const Context& ctx, + Context& ctx, ChannelContext& channel_context, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, @@ -1400,7 +1401,13 @@ namespace mamba specs::Channel::UrlPriorty::high // put the urls coming form this file on top // of the mirrors list ); + // TODO c++23: use .append + auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; + context_mirrors + .insert(context_mirrors.begin(), channel_info.urls.begin(), channel_info.urls.end()); } + + init_channels(ctx, channel_context); // makes sure the new mirrors are taken into account } std::vector conda_packages = {}; From eefe9c48e4a348fe7f2938478e68ae3bb69500a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:57:45 +0100 Subject: [PATCH 36/66] removed test code impacting correctness in mambajs lockfile case --- libmamba/src/specs/channel.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 1c53935c73..4088d0a4a7 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -102,12 +102,6 @@ namespace mamba::specs all_urls.insert(insertion_point, new_urls.begin(), new_urls.end()); - // WORKS BUT DOESNT MAKE THE RIGHT CHANNEL WORK WITH MANBAJS ENV LOCKFILES - for (const auto& url : additional_mirrors) - { - all_urls.push_back(url); - } - prepare_mirrors(all_urls); m_mirror_urls = std::move(all_urls); From c494b0d1259315c88680f8fc2009e5dd09176763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 3 Feb 2026 14:06:12 +0100 Subject: [PATCH 37/66] removed test assertion --- micromamba/tests/test_create.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 24255b24bd..0a0f222679 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -215,8 +215,6 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): print("packages installed:", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) - print("DEBUG: ", packages) - assert lockfile_format != lockfile_format_mambajs @pytest.mark.skipif( platform.system() != "Linux", From 0842dbd7d9cf5d7427eae12448ea2fdd08f9d0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Lamotte=20=28Klaim=29?= Date: Thu, 5 Feb 2026 13:29:25 +0100 Subject: [PATCH 38/66] experiment: deactivate the feature added here --- libmamba/src/core/transaction.cpp | 40 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index bc940158d8..fee963adfa 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1389,26 +1389,26 @@ namespace mamba LOG_DEBUG << " manager = " << package.manager; } - if (lockfile_data.get_metadata().enable_channels) - { - // create or add mirrors to additional channels - for (const EnvironmentLockFile::Channel& channel_info : - lockfile_data.get_metadata().channels) - { - auto channels [[maybe_unused]] = channel_context.make_channel( - channel_info.name, - channel_info.urls, - specs::Channel::UrlPriorty::high // put the urls coming form this file on top - // of the mirrors list - ); - // TODO c++23: use .append - auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; - context_mirrors - .insert(context_mirrors.begin(), channel_info.urls.begin(), channel_info.urls.end()); - } - - init_channels(ctx, channel_context); // makes sure the new mirrors are taken into account - } + // if (lockfile_data.get_metadata().enable_channels) + // { + // // create or add mirrors to additional channels + // for (const EnvironmentLockFile::Channel& channel_info : + // lockfile_data.get_metadata().channels) + // { + // auto channels [[maybe_unused]] = channel_context.make_channel( + // channel_info.name, + // channel_info.urls, + // specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // // of the mirrors list + // ); + // // TODO c++23: use .append + // auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; + // context_mirrors + // .insert(context_mirrors.begin(), channel_info.urls.begin(), channel_info.urls.end()); + // } + + // init_channels(ctx, channel_context); // makes sure the new mirrors are taken into account + // } std::vector conda_packages = {}; std::vector pip_packages = {}; From 99d05893e5aaa3158492283b7576d82cc4032ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Lamotte=20=28Klaim=29?= Date: Thu, 5 Feb 2026 13:38:31 +0100 Subject: [PATCH 39/66] still experiment, remove warning --- libmamba/src/core/transaction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index fee963adfa..824be0074d 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1364,7 +1364,7 @@ namespace mamba MTransaction create_explicit_transaction_from_lockfile( Context& ctx, - ChannelContext& channel_context, + ChannelContext& /*channel_context*/, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, const std::vector& categories, From a6864372285027f6ab8211051e8dc8e0c5d351cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Lamotte=20=28Klaim=29?= Date: Thu, 5 Feb 2026 14:36:33 +0100 Subject: [PATCH 40/66] revert experiment, reenable feature --- libmamba/src/core/transaction.cpp | 42 +++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 824be0074d..bc940158d8 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1364,7 +1364,7 @@ namespace mamba MTransaction create_explicit_transaction_from_lockfile( Context& ctx, - ChannelContext& /*channel_context*/, + ChannelContext& channel_context, solver::libsolv::Database& database, const fs::u8path& env_lockfile_path, const std::vector& categories, @@ -1389,26 +1389,26 @@ namespace mamba LOG_DEBUG << " manager = " << package.manager; } - // if (lockfile_data.get_metadata().enable_channels) - // { - // // create or add mirrors to additional channels - // for (const EnvironmentLockFile::Channel& channel_info : - // lockfile_data.get_metadata().channels) - // { - // auto channels [[maybe_unused]] = channel_context.make_channel( - // channel_info.name, - // channel_info.urls, - // specs::Channel::UrlPriorty::high // put the urls coming form this file on top - // // of the mirrors list - // ); - // // TODO c++23: use .append - // auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; - // context_mirrors - // .insert(context_mirrors.begin(), channel_info.urls.begin(), channel_info.urls.end()); - // } - - // init_channels(ctx, channel_context); // makes sure the new mirrors are taken into account - // } + if (lockfile_data.get_metadata().enable_channels) + { + // create or add mirrors to additional channels + for (const EnvironmentLockFile::Channel& channel_info : + lockfile_data.get_metadata().channels) + { + auto channels [[maybe_unused]] = channel_context.make_channel( + channel_info.name, + channel_info.urls, + specs::Channel::UrlPriorty::high // put the urls coming form this file on top + // of the mirrors list + ); + // TODO c++23: use .append + auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; + context_mirrors + .insert(context_mirrors.begin(), channel_info.urls.begin(), channel_info.urls.end()); + } + + init_channels(ctx, channel_context); // makes sure the new mirrors are taken into account + } std::vector conda_packages = {}; std::vector pip_packages = {}; From 04e05fbc73d0565ff99869d2ad9b45f14066f97a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:18:36 +0100 Subject: [PATCH 41/66] experiment please remove --- micromamba/tests/test_create.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 0a0f222679..5d9e7ca05d 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -211,7 +211,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): print("create result:", res) assert res["success"] - packages = helpers.umamba_list("-p", env_prefix, "--json") + packages = helpers.umamba_list("-p", env_prefix)# , "--json") print("packages installed:", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) From c0acdb553e4bcf26720b2bad5ae5961ef0ea50e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:35:56 +0100 Subject: [PATCH 42/66] Revert "experiment please remove" This reverts commit 1d2fe6ddbace59f79d6ef122809ed965567177f7. --- micromamba/tests/test_create.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 5d9e7ca05d..0a0f222679 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -211,7 +211,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): print("create result:", res) assert res["success"] - packages = helpers.umamba_list("-p", env_prefix)# , "--json") + packages = helpers.umamba_list("-p", env_prefix, "--json") print("packages installed:", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) From cb7e7a6d82ee0ed45ad0b9dcc314627d539291b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:47:44 +0100 Subject: [PATCH 43/66] experiment more info --- micromamba/tests/helpers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/micromamba/tests/helpers.py b/micromamba/tests/helpers.py index e129ab1185..cf978dc02d 100644 --- a/micromamba/tests/helpers.py +++ b/micromamba/tests/helpers.py @@ -322,6 +322,7 @@ def umamba_list(*args, **kwargs): res = subprocess_run(*cmd, **kwargs) if "--json" in args: + print("json result will be parsed to python object, original res: \n", res) j = json.loads(res) return j From c75bb4c9614668145cc4185df1ff0aadc015f252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:08:23 +0100 Subject: [PATCH 44/66] tweaks might not be necessary --- libmamba/include/mamba/api/channel_loader.hpp | 7 ++++- .../include/mamba/download/mirror_map.hpp | 7 ++++- libmamba/src/api/channel_loader.cpp | 27 ++++++++++--------- libmamba/src/core/channel_context.cpp | 26 +++++++++--------- libmamba/src/core/transaction.cpp | 20 +++++++++----- libmamba/src/download/mirror_map.cpp | 19 ++++++++++--- libmamba/src/specs/channel.cpp | 14 +++++----- 7 files changed, 75 insertions(+), 45 deletions(-) diff --git a/libmamba/include/mamba/api/channel_loader.hpp b/libmamba/include/mamba/api/channel_loader.hpp index 17033dbfe1..ad52ddc34f 100644 --- a/libmamba/include/mamba/api/channel_loader.hpp +++ b/libmamba/include/mamba/api/channel_loader.hpp @@ -13,6 +13,7 @@ #include #include "mamba/core/error_handling.hpp" +#include "mamba/specs/channel.hpp" #include "mamba/specs/version.hpp" namespace mamba @@ -104,7 +105,11 @@ namespace mamba * Creates and stores channels in the ChannelContext, * and mirrors objects in the Context object. */ - void init_channels(Context& context, ChannelContext& channel_context); + void init_channels( + Context& context, + ChannelContext& channel_context, + specs::Channel::UrlPriorty priority = specs::Channel::UrlPriorty::low + ); void init_channels_from_package_urls( Context& context, ChannelContext& channel_context, diff --git a/libmamba/include/mamba/download/mirror_map.hpp b/libmamba/include/mamba/download/mirror_map.hpp index 551d7b14db..58f6977618 100644 --- a/libmamba/include/mamba/download/mirror_map.hpp +++ b/libmamba/include/mamba/download/mirror_map.hpp @@ -16,6 +16,7 @@ #include "mamba/download/mirror.hpp" #include "mamba/util/iterator.hpp" +#include "mamba/specs/channel.hpp" namespace mamba::download { @@ -47,7 +48,11 @@ namespace mamba::download // Stores a provided Mirror IFF no other mirror is already registered with the same id for // the specified mirror name. Returns true if the mirror has been stored, false otherwise. - bool add_unique_mirror(std::string_view mirror_name, mirror_ptr mirror); + bool add_unique_mirror( + std::string_view mirror_name, + mirror_ptr mirror, + specs::Channel::UrlPriorty priority = specs::Channel::UrlPriorty::low + ); // Copy mirrors for a given mirror name from another map. Used when building extended // mirror maps (e.g. for shard downloads) that need to include channel mirrors. diff --git a/libmamba/src/api/channel_loader.cpp b/libmamba/src/api/channel_loader.cpp index 1f80a6f1a2..a0bd071c63 100644 --- a/libmamba/src/api/channel_loader.cpp +++ b/libmamba/src/api/channel_loader.cpp @@ -876,17 +876,19 @@ namespace mamba return result_repo; } - void create_mirrors(const specs::Channel& channel, download::mirror_map& mirrors) + void create_mirrors( + const specs::Channel& channel, + download::mirror_map& mirrors, + specs::Channel::UrlPriorty priority = specs::Channel::UrlPriorty::low + ) { - if (!mirrors.has_mirrors(channel.id())) + for (const specs::CondaURL& url : channel.mirror_urls()) { - for (const specs::CondaURL& url : channel.mirror_urls()) - { - mirrors.add_unique_mirror( - channel.id(), - download::make_mirror(url.str(specs::CondaURL::Credentials::Show)) - ); - } + mirrors.add_unique_mirror( + channel.id(), + download::make_mirror(url.str(specs::CondaURL::Credentials::Show)), + priority + ); } } @@ -1139,14 +1141,15 @@ namespace mamba ); } - void init_channels(Context& context, ChannelContext& channel_context) + void + init_channels(Context& context, ChannelContext& channel_context, specs::Channel::UrlPriorty priority) { for (const auto& mirror : context.mirrored_channels) { for (const specs::Channel& channel : channel_context.make_channel(mirror.first, mirror.second)) { - create_mirrors(channel, context.mirrors); + create_mirrors(channel, context.mirrors, priority); } } @@ -1156,7 +1159,7 @@ namespace mamba { for (const specs::Channel& channel : channel_context.make_channel(location)) { - create_mirrors(channel, context.mirrors); + create_mirrors(channel, context.mirrors, priority); } } } diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index 9eff4c782b..ce74d75ed6 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -55,16 +55,15 @@ namespace mamba auto make_simple_params_base(const Context& ctx) -> specs::ChannelResolveParams { return specs::ChannelResolveParams{ - /* .platform= */ create_platforms(ctx.platforms()), - /* .channel_alias= */ - specs::CondaURL::parse(util::path_or_url_to_url(ctx.channel_alias)) - .or_else([](specs::ParseError&& err) { throw std::move(err); }) - .value(), - /* .custom_channels= */ {}, - /* .custom_multichannels= */ {}, - /* .authentication_db= */ ctx.authentication_info(), - /* .home_dir= */ util::user_home_dir(), - /* .current_working_dir= */ fs::current_path(), + .platforms = create_platforms(ctx.platforms()), + .channel_alias = specs::CondaURL::parse(util::path_or_url_to_url(ctx.channel_alias)) + .or_else([](specs::ParseError&& err) { throw std::move(err); }) + .value(), + .custom_channels = {}, + .custom_multichannels = {}, + .authentication_db = ctx.authentication_info(), + .home_dir = util::user_home_dir(), + .current_working_dir = fs::current_path(), }; } @@ -292,18 +291,17 @@ namespace mamba std::string_view name, const std::vector& mirrors, specs::Channel::UrlPriorty new_mirrors_priority - ) - -> const channel_list& + ) -> const channel_list& { if (const auto it = m_channel_cache.find(std::string(name)); it != m_channel_cache.end()) { // inject additional mirrors if not already existing in current channels - for(auto& channel : it->second) + for (auto& channel : it->second) { // TODO C++23: replace all this by std::vector(from_range_t, ...) auto urls_view = specs::as_conda_urls(mirrors); std::vector urls(urls_view.begin(), urls_view.end()); - + channel.add_mirror_urls(urls, new_mirrors_priority); } return it->second; diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index bc940158d8..7d8215791e 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -510,7 +510,7 @@ namespace mamba } }; - + if (ctx.output_params.json) { log_json(); @@ -1403,11 +1403,18 @@ namespace mamba ); // TODO c++23: use .append auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; - context_mirrors - .insert(context_mirrors.begin(), channel_info.urls.begin(), channel_info.urls.end()); + context_mirrors.insert( + context_mirrors.begin(), + channel_info.urls.begin(), + channel_info.urls.end() + ); } - init_channels(ctx, channel_context); // makes sure the new mirrors are taken into account + init_channels(ctx, channel_context, specs::Channel::UrlPriorty::high); // makes sure + // the new + // mirrors are + // taken into + // account } std::vector conda_packages = {}; @@ -1436,9 +1443,8 @@ namespace mamba .platform = ctx.platform, .manager = "pip", // NOTE: sometime python packages can have no platform specified (mambajs lockfile - // for - // example) in this case we just take the package if not specified, but if - // specified we filter to the current platform. + // for example) in this case we just take the package if not specified, but if + // specified we filter to the current platform. .allow_no_platform = true } ); std::copy( diff --git a/libmamba/src/download/mirror_map.cpp b/libmamba/src/download/mirror_map.cpp index f1599192cf..25b012b52a 100644 --- a/libmamba/src/download/mirror_map.cpp +++ b/libmamba/src/download/mirror_map.cpp @@ -8,6 +8,7 @@ #include "mamba/download/mirror_map.hpp" #include "mirror_impl.hpp" +#include "mamba/specs/channel.hpp" namespace mamba::download { @@ -44,8 +45,19 @@ namespace mamba::download } } - bool mirror_map::add_unique_mirror(std::string_view mirror_name, mirror_ptr mirror) + bool mirror_map::add_unique_mirror( + std::string_view mirror_name, + mirror_ptr mirror, + specs::Channel::UrlPriorty priority + ) { + auto insert_mirror = [&](auto& mirror_list) // assuming std::vector here + { + auto insert_it = priority == specs::Channel::UrlPriorty::high ? mirror_list.begin() + : mirror_list.end(); + mirror_list.insert(insert_it, std::move(mirror)); + }; + auto find_it = m_mirrors.find(std::string(mirror_name)); if (find_it != m_mirrors.end()) { @@ -54,11 +66,12 @@ namespace mamba::download { return false; } - mirrors.push_back(std::move(mirror)); + + insert_mirror(mirrors); } else { - m_mirrors[std::string(mirror_name)].push_back(std::move(mirror)); + insert_mirror(m_mirrors[std::string(mirror_name)]); } return true; } diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 4088d0a4a7..0611fad385 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -579,13 +579,13 @@ namespace mamba::specs return resolve( std::move(uc), ChannelResolveParamsView{ - /* .platforms= */ params.platforms, - /* .channel_alias= */ params.channel_alias, - /* .custom_channels= */ params.custom_channels, - /* .custom_multichannels= */ params.custom_multichannels, - /* .authentication_db= */ params.authentication_db, - /* .home_dir= */ params.home_dir, - /* .current_working_dir= */ params.current_working_dir, + .platforms= params.platforms, + .channel_alias= params.channel_alias, + .custom_channels= params.custom_channels, + .custom_multichannels= params.custom_multichannels, + .authentication_db= params.authentication_db, + .home_dir= params.home_dir, + .current_working_dir= params.current_working_dir, } ); } From 9a3d0bf33f185069733d214e25cc1a013fd35fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:51:20 +0100 Subject: [PATCH 45/66] transaction: replace channel name resolution by looking into channels mirrors --- libmamba/src/core/transaction.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 7d8215791e..7937a67c34 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -493,15 +493,10 @@ namespace mamba for (specs::PackageInfo& pkg : m_solution.packages()) { - const auto unresolved_pkg_channel = mamba::specs::UnresolvedChannel::parse(pkg.channel) - .value(); - const auto pkg_channel = mamba::specs::Channel::resolve( - unresolved_pkg_channel, - channel_context.params() - ) - .value(); - assert(not pkg_channel.empty()); - const auto channel_url = pkg_channel.front().platform_url(pkg.platform).str(); + const auto& channels = channel_context.make_channel(pkg.channel); + assert(not channels.empty()); + + const auto channel_url = channels.front().platform_url(pkg.platform).str(); pkg.channel = channel_url; if (pkg.package_url.empty()) From f7461ccbaea2bbba637666587746a8b15ac1d1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:52:03 +0100 Subject: [PATCH 46/66] tests: added logs --- micromamba/tests/test_create.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 0a0f222679..2e3880aee1 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -213,6 +213,8 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): packages = helpers.umamba_list("-p", env_prefix, "--json") print("packages installed:", packages) + print("pkgs: ", os.listdir( tmp_root_prefix / "pkgs")) + print("conda-meta: ", os.listdir( env_prefix / "conda-meta")) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) From 1974ecb3c0950ff7c7acf358672741300230071d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:16:04 +0100 Subject: [PATCH 47/66] test log tweak --- micromamba/tests/test_create.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 2e3880aee1..a864d94699 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -213,7 +213,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): packages = helpers.umamba_list("-p", env_prefix, "--json") print("packages installed:", packages) - print("pkgs: ", os.listdir( tmp_root_prefix / "pkgs")) + print("pkgs: ", os.listdir( tmp_root_prefix)) print("conda-meta: ", os.listdir( env_prefix / "conda-meta")) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) From 207d85e004542e46b53f53017c5ed9bc65149599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:46:01 +0100 Subject: [PATCH 48/66] partial cleanup --- libmamba/CMakeLists.txt | 1 + libmamba/include/mamba/specs/conda_url.hpp | 20 +++++++---- libmamba/include/mamba/util/algorithm.hpp | 40 ++++++++++------------ libmamba/include/mamba/util/url.hpp | 10 ++++-- micromamba/tests/helpers.py | 1 - micromamba/tests/test_create.py | 6 ++-- 6 files changed, 42 insertions(+), 36 deletions(-) diff --git a/libmamba/CMakeLists.txt b/libmamba/CMakeLists.txt index ef53a772f6..668a08e8dc 100644 --- a/libmamba/CMakeLists.txt +++ b/libmamba/CMakeLists.txt @@ -301,6 +301,7 @@ set( # Filesystem library ${LIBMAMBA_INCLUDE_DIR}/mamba/fs/filesystem.hpp # Utility library + ${LIBMAMBA_INCLUDE_DIR}/mamba/util/algorithm.hpp ${LIBMAMBA_INCLUDE_DIR}/mamba/util/build.hpp ${LIBMAMBA_INCLUDE_DIR}/mamba/util/cast.hpp ${LIBMAMBA_INCLUDE_DIR}/mamba/util/cfile.hpp diff --git a/libmamba/include/mamba/specs/conda_url.hpp b/libmamba/include/mamba/specs/conda_url.hpp index f2eb10e200..552e75b1dc 100644 --- a/libmamba/include/mamba/specs/conda_url.hpp +++ b/libmamba/include/mamba/specs/conda_url.hpp @@ -7,9 +7,9 @@ #ifndef MAMBA_SPECS_CONDA_URL_HPP #define MAMBA_SPECS_CONDA_URL_HPP +#include #include #include -#include #include "mamba/specs/error.hpp" #include "mamba/specs/platform.hpp" @@ -253,15 +253,23 @@ namespace mamba::specs auto operator""_cu(const char* str, std::size_t len) -> CondaURL; } - template - requires std::same_as< std::ranges::range_value_t, util::URL > + /** Converts any range of `URL` into a view-range of `CondaURL` values. */ + template + requires std::same_as, util::URL> auto as_conda_urls(URLRange&& values) { - return std::views::transform(std::forward(values), [](const util::URL& url){ return CondaURL{url}; }); + return std::views::transform( + std::forward(values), + [](const util::URL& url) { return CondaURL{ url }; } + ); } - template - requires (not std::same_as< std::ranges::range_value_t, util::URL >) // TODO: or only string-like types? + /** Converts any range of string-like values into a view-range of `CondaURL` values based on + * it's constructor. */ + template + requires( + not std::same_as, util::URL> + ) // TODO: or only string-like types? auto as_conda_urls(StringRange&& values) { return as_conda_urls(util::as_urls(std::forward(values))); diff --git a/libmamba/include/mamba/util/algorithm.hpp b/libmamba/include/mamba/util/algorithm.hpp index 504ddf0b4b..ab47bc975f 100644 --- a/libmamba/include/mamba/util/algorithm.hpp +++ b/libmamba/include/mamba/util/algorithm.hpp @@ -7,20 +7,21 @@ ////////////////////////////////////////////////////////////////////////////// // This file provides implementations to generic algorithms which are not yet // available in our current C++ version and/or implementations. -// +// // TODO: replace these implementations by standard implementations -// once available. +// once available. // #ifndef MAMBA_UTIL_ALGORITHM_HPP #define MAMBA_UTIL_ALGORITHM_HPP -#include -#include #include +#include #include +#include -namespace mamba::stdext // not using mamba::util because of potential conflicts with existing tooling +namespace mamba::stdext // not using mamba::util because of potential conflicts with existing + // tooling { /////////////////////////////////////////////////////////////////////////////////////////////// // see https://en.cppreference.com/w/cpp/algorithm/ranges/contains.html @@ -28,34 +29,29 @@ namespace mamba::stdext // not using mamba::util because of potential conflicts { struct contains_fn { - template S, - class Proj = std::identity, - class T> - requires std::indirect_binary_predicate, - const T*> + template S, class Proj = std::identity, class T> + requires std::indirect_binary_predicate, const T*> constexpr bool operator()(I first, S last, const T& value, Proj proj = {}) const { return std::ranges::find(std::move(first), last, value, proj) != last; } - - template - requires std::indirect_binary_predicate, Proj>, - const T*> + + template + requires std::indirect_binary_predicate< + std::ranges::equal_to, + std::projected, Proj>, + const T*> constexpr bool operator()(R&& r, const T& value, Proj proj = {}) const { - return std::ranges::find(std::ranges::begin(r), - std::ranges::end(r), value, proj) != std::ranges::end(r); + return std::ranges::find(std::ranges::begin(r), std::ranges::end(r), value, proj) + != std::ranges::end(r); } }; } - - + inline constexpr details::contains_fn contains{}; ///////////////////////////////////////////////////////////////////////////////////////////////// } -#endif \ No newline at end of file +#endif diff --git a/libmamba/include/mamba/util/url.hpp b/libmamba/include/mamba/util/url.hpp index c673dcac8e..06ed375402 100644 --- a/libmamba/include/mamba/util/url.hpp +++ b/libmamba/include/mamba/util/url.hpp @@ -9,9 +9,9 @@ #include #include +#include #include #include -#include #include @@ -295,10 +295,14 @@ namespace mamba::util auto operator/(URL const& url, std::string_view subpath) -> URL; auto operator/(URL&& url, std::string_view subpath) -> URL; - template + /** Converts any range of string-like values into a view-range of `URL` values. */ + template auto as_urls(StringRange&& values) { - return std::views::transform(std::forward(values), [](const auto& url){ return *URL::parse(url); }); + return std::views::transform( + std::forward(values), + [](const auto& url) { return *URL::parse(url); } + ); } } diff --git a/micromamba/tests/helpers.py b/micromamba/tests/helpers.py index cf978dc02d..e129ab1185 100644 --- a/micromamba/tests/helpers.py +++ b/micromamba/tests/helpers.py @@ -322,7 +322,6 @@ def umamba_list(*args, **kwargs): res = subprocess_run(*cmd, **kwargs) if "--json" in args: - print("json result will be parsed to python object, original res: \n", res) j = json.loads(res) return j diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index a864d94699..1363a99157 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -208,13 +208,11 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): shutil.copyfile(lockfile_to_use, spec_file) res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) - print("create result:", res) + print("create result:\n", res) assert res["success"] packages = helpers.umamba_list("-p", env_prefix, "--json") - print("packages installed:", packages) - print("pkgs: ", os.listdir( tmp_root_prefix)) - print("conda-meta: ", os.listdir( env_prefix / "conda-meta")) + print("packages installed:\n", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) From 8818faa153dca5df436ae58ab091145f32b23eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:46:40 +0100 Subject: [PATCH 49/66] temporary experiment --- micromamba/tests/test_create.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 1363a99157..cac22bcfd8 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -215,6 +215,8 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): print("packages installed:\n", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) + assert False # Triggered to check print output + @pytest.mark.skipif( platform.system() != "Linux", From d5163df5eb851265aab0133e8937013b1705d63f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:55:12 +0100 Subject: [PATCH 50/66] fixed typo --- libmamba/include/mamba/api/channel_loader.hpp | 2 +- libmamba/include/mamba/core/channel_context.hpp | 2 +- libmamba/include/mamba/download/mirror_map.hpp | 2 +- libmamba/include/mamba/specs/channel.hpp | 4 ++-- libmamba/src/api/channel_loader.cpp | 4 ++-- libmamba/src/core/channel_context.cpp | 2 +- libmamba/src/core/transaction.cpp | 4 ++-- libmamba/src/download/mirror_map.cpp | 4 ++-- libmamba/src/specs/channel.cpp | 6 +++--- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/libmamba/include/mamba/api/channel_loader.hpp b/libmamba/include/mamba/api/channel_loader.hpp index ad52ddc34f..262e3317e8 100644 --- a/libmamba/include/mamba/api/channel_loader.hpp +++ b/libmamba/include/mamba/api/channel_loader.hpp @@ -108,7 +108,7 @@ namespace mamba void init_channels( Context& context, ChannelContext& channel_context, - specs::Channel::UrlPriorty priority = specs::Channel::UrlPriorty::low + specs::Channel::UrlPriority priority = specs::Channel::UrlPriority::low ); void init_channels_from_package_urls( Context& context, diff --git a/libmamba/include/mamba/core/channel_context.hpp b/libmamba/include/mamba/core/channel_context.hpp index 1d9622f69d..62961d77c4 100644 --- a/libmamba/include/mamba/core/channel_context.hpp +++ b/libmamba/include/mamba/core/channel_context.hpp @@ -56,7 +56,7 @@ namespace mamba [[nodiscard]] auto make_channel( std::string_view name, const std::vector& mirrors, - specs::Channel::UrlPriorty new_mirrors_priority = specs::Channel::UrlPriorty::low + specs::Channel::UrlPriority new_mirrors_priority = specs::Channel::UrlPriority::low ) -> const channel_list&; diff --git a/libmamba/include/mamba/download/mirror_map.hpp b/libmamba/include/mamba/download/mirror_map.hpp index 58f6977618..8adc1d1ee6 100644 --- a/libmamba/include/mamba/download/mirror_map.hpp +++ b/libmamba/include/mamba/download/mirror_map.hpp @@ -51,7 +51,7 @@ namespace mamba::download bool add_unique_mirror( std::string_view mirror_name, mirror_ptr mirror, - specs::Channel::UrlPriorty priority = specs::Channel::UrlPriorty::low + specs::Channel::UrlPriority priority = specs::Channel::UrlPriority::low ); // Copy mirrors for a given mirror name from another map. Used when building extended diff --git a/libmamba/include/mamba/specs/channel.hpp b/libmamba/include/mamba/specs/channel.hpp index 202eb990d6..8fbce1fbab 100644 --- a/libmamba/include/mamba/specs/channel.hpp +++ b/libmamba/include/mamba/specs/channel.hpp @@ -32,7 +32,7 @@ namespace mamba::specs using platform_list = util::flat_set; using channel_list = std::vector; - enum class UrlPriorty + enum class UrlPriority { high, ///< associated urls will be placed in the front the list of urls low ///< associated urls will be placed in the back the list of urls @@ -84,7 +84,7 @@ namespace mamba::specs // list. void add_mirror_urls( const std::vector& additional_mirrors, - UrlPriorty priority = UrlPriorty::low + UrlPriority priority = UrlPriority::low ); enum struct Match diff --git a/libmamba/src/api/channel_loader.cpp b/libmamba/src/api/channel_loader.cpp index a0bd071c63..7a701bed6b 100644 --- a/libmamba/src/api/channel_loader.cpp +++ b/libmamba/src/api/channel_loader.cpp @@ -879,7 +879,7 @@ namespace mamba void create_mirrors( const specs::Channel& channel, download::mirror_map& mirrors, - specs::Channel::UrlPriorty priority = specs::Channel::UrlPriorty::low + specs::Channel::UrlPriority priority = specs::Channel::UrlPriority::low ) { for (const specs::CondaURL& url : channel.mirror_urls()) @@ -1142,7 +1142,7 @@ namespace mamba } void - init_channels(Context& context, ChannelContext& channel_context, specs::Channel::UrlPriorty priority) + init_channels(Context& context, ChannelContext& channel_context, specs::Channel::UrlPriority priority) { for (const auto& mirror : context.mirrored_channels) { diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index ce74d75ed6..1d2108b10f 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -290,7 +290,7 @@ namespace mamba auto ChannelContext::make_channel( std::string_view name, const std::vector& mirrors, - specs::Channel::UrlPriorty new_mirrors_priority + specs::Channel::UrlPriority new_mirrors_priority ) -> const channel_list& { if (const auto it = m_channel_cache.find(std::string(name)); it != m_channel_cache.end()) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 7937a67c34..a4393e53ef 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1393,7 +1393,7 @@ namespace mamba auto channels [[maybe_unused]] = channel_context.make_channel( channel_info.name, channel_info.urls, - specs::Channel::UrlPriorty::high // put the urls coming form this file on top + specs::Channel::UrlPriority::high // put the urls coming form this file on top // of the mirrors list ); // TODO c++23: use .append @@ -1405,7 +1405,7 @@ namespace mamba ); } - init_channels(ctx, channel_context, specs::Channel::UrlPriorty::high); // makes sure + init_channels(ctx, channel_context, specs::Channel::UrlPriority::high); // makes sure // the new // mirrors are // taken into diff --git a/libmamba/src/download/mirror_map.cpp b/libmamba/src/download/mirror_map.cpp index 25b012b52a..855f40a82a 100644 --- a/libmamba/src/download/mirror_map.cpp +++ b/libmamba/src/download/mirror_map.cpp @@ -48,12 +48,12 @@ namespace mamba::download bool mirror_map::add_unique_mirror( std::string_view mirror_name, mirror_ptr mirror, - specs::Channel::UrlPriorty priority + specs::Channel::UrlPriority priority ) { auto insert_mirror = [&](auto& mirror_list) // assuming std::vector here { - auto insert_it = priority == specs::Channel::UrlPriorty::high ? mirror_list.begin() + auto insert_it = priority == specs::Channel::UrlPriority::high ? mirror_list.begin() : mirror_list.end(); mirror_list.insert(insert_it, std::move(mirror)); }; diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 0611fad385..986d8abf1f 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -75,7 +75,7 @@ namespace mamba::specs } void - Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriorty priority) + Channel::add_mirror_urls(const std::vector& additional_mirrors, UrlPriority priority) { auto all_urls = m_mirror_urls; @@ -91,11 +91,11 @@ namespace mamba::specs { switch (priority) { - case UrlPriorty::high: + case UrlPriority::high: return all_urls.begin(); default: - case UrlPriorty::low: + case UrlPriority::low: return all_urls.end(); } }(); From 880adfb6b3e313548b22825f1a4e0dd0cb49f5b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:57:56 +0100 Subject: [PATCH 51/66] formatting --- libmamba/src/download/mirror_map.cpp | 14 +++++++------- libmamba/src/specs/channel.cpp | 14 +++++++------- micromamba/tests/test_create.py | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/libmamba/src/download/mirror_map.cpp b/libmamba/src/download/mirror_map.cpp index 855f40a82a..e55c3e3994 100644 --- a/libmamba/src/download/mirror_map.cpp +++ b/libmamba/src/download/mirror_map.cpp @@ -6,9 +6,9 @@ #include "mamba/download/mirror.hpp" #include "mamba/download/mirror_map.hpp" +#include "mamba/specs/channel.hpp" #include "mirror_impl.hpp" -#include "mamba/specs/channel.hpp" namespace mamba::download { @@ -51,12 +51,12 @@ namespace mamba::download specs::Channel::UrlPriority priority ) { - auto insert_mirror = [&](auto& mirror_list) // assuming std::vector here - { - auto insert_it = priority == specs::Channel::UrlPriority::high ? mirror_list.begin() - : mirror_list.end(); - mirror_list.insert(insert_it, std::move(mirror)); - }; + auto insert_mirror = [&](auto& mirror_list) // assuming std::vector here + { + auto insert_it = priority == specs::Channel::UrlPriority::high ? mirror_list.begin() + : mirror_list.end(); + mirror_list.insert(insert_it, std::move(mirror)); + }; auto find_it = m_mirrors.find(std::string(mirror_name)); if (find_it != m_mirrors.end()) diff --git a/libmamba/src/specs/channel.cpp b/libmamba/src/specs/channel.cpp index 986d8abf1f..866c460c26 100644 --- a/libmamba/src/specs/channel.cpp +++ b/libmamba/src/specs/channel.cpp @@ -579,13 +579,13 @@ namespace mamba::specs return resolve( std::move(uc), ChannelResolveParamsView{ - .platforms= params.platforms, - .channel_alias= params.channel_alias, - .custom_channels= params.custom_channels, - .custom_multichannels= params.custom_multichannels, - .authentication_db= params.authentication_db, - .home_dir= params.home_dir, - .current_working_dir= params.current_working_dir, + .platforms = params.platforms, + .channel_alias = params.channel_alias, + .custom_channels = params.custom_channels, + .custom_multichannels = params.custom_multichannels, + .authentication_db = params.authentication_db, + .home_dir = params.home_dir, + .current_working_dir = params.current_working_dir, } ); } diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index cac22bcfd8..416d256a13 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -207,7 +207,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): shutil.copyfile(lockfile_to_use, spec_file) - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel=False) print("create result:\n", res) assert res["success"] @@ -215,7 +215,7 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): print("packages installed:\n", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) - assert False # Triggered to check print output + assert False # Triggered to check print output @pytest.mark.skipif( @@ -230,7 +230,7 @@ def test_lockfile_with_pip(tmp_home, tmp_root_prefix, tmp_path, lockfile_format) shutil.copyfile(pip_lockfile_path(lockfile_format), spec_file) - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel=False) assert res["success"] packages = helpers.umamba_list("-p", env_prefix, "--json") @@ -268,7 +268,7 @@ def test_pip_git_https_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_fo shutil.copyfile(pip_git_https_lockfile_path(lockfile_format), spec_file) - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel=False) assert res["success"] packages = helpers.umamba_list("-p", env_prefix, "--json") @@ -295,7 +295,7 @@ def test_lockfile_online( env_prefix = tmp_path / "myenv" spec_file = "https://raw.githubusercontent.com/mamba-org/mamba/main/micromamba/tests/env_lockfiles/test-env-lock.yaml" - res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel = False) + res = helpers.create("-p", env_prefix, "-f", spec_file, "--json", default_channel=False) assert res["success"] packages = helpers.umamba_list("-p", env_prefix, "--json") @@ -318,11 +318,11 @@ def test_env_lockfile_different_install_after_create( _base_lockfile_path("envlockfile-check-step-2-lock", lockfile_format), install_spec_file ) - res = helpers.create("-p", env_prefix, "-f", create_spec_file, "-y", "--json", default_channel = False) + res = helpers.create("-p", env_prefix, "-f", create_spec_file, "-y", "--json", default_channel=False) assert res["success"] # Must not crash - helpers.install("-p", env_prefix, "-f", install_spec_file, "-y", "--json", default_channel = False) + helpers.install("-p", env_prefix, "-f", install_spec_file, "-y", "--json", default_channel=False) @pytest.mark.parametrize("shared_pkgs_dirs", [True], indirect=True) From 4fd4b8805b993aa93d25a2fd10d49b966a9b1c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 11 Feb 2026 15:21:02 +0100 Subject: [PATCH 52/66] removed temporary experiment --- micromamba/tests/test_create.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index 416d256a13..e6cd90d96f 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -215,8 +215,6 @@ def test_lockfile(tmp_home, tmp_root_prefix, tmp_path, lockfile_format): print("packages installed:\n", packages) assert any(package["name"] == "zlib" and package["version"] == "1.2.11" for package in packages) - assert False # Triggered to check print output - @pytest.mark.skipif( platform.system() != "Linux", From 8d763b6fa51520dffb9f7b3abd25fdf52a024b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 11 Feb 2026 16:05:11 +0100 Subject: [PATCH 53/66] formatting --- libmamba/include/mamba/core/channel_context.hpp | 3 +-- libmamba/include/mamba/core/env_lockfile.hpp | 3 ++- libmamba/include/mamba/download/mirror_map.hpp | 2 +- libmamba/src/core/env_lockfile_conda.cpp | 2 +- libmamba/src/core/transaction.cpp | 10 +++++----- micromamba/tests/test_create.py | 8 ++++++-- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/libmamba/include/mamba/core/channel_context.hpp b/libmamba/include/mamba/core/channel_context.hpp index 62961d77c4..dcff0d2668 100644 --- a/libmamba/include/mamba/core/channel_context.hpp +++ b/libmamba/include/mamba/core/channel_context.hpp @@ -57,8 +57,7 @@ namespace mamba std::string_view name, const std::vector& mirrors, specs::Channel::UrlPriority new_mirrors_priority = specs::Channel::UrlPriority::low - ) - -> const channel_list&; + ) -> const channel_list&; [[nodiscard]] auto params() const -> const specs::ChannelResolveParams&; diff --git a/libmamba/include/mamba/core/env_lockfile.hpp b/libmamba/include/mamba/core/env_lockfile.hpp index d3caa31c71..8f325211a3 100644 --- a/libmamba/include/mamba/core/env_lockfile.hpp +++ b/libmamba/include/mamba/core/env_lockfile.hpp @@ -77,7 +77,8 @@ namespace mamba std::vector channels; std::vector platforms; std::vector sources; - bool enable_channels = true; ///< `true` if we need to take into account the specified channels, `false` if we should ignore them. + bool enable_channels = true; ///< `true` if we need to take into account the specified + ///< channels, `false` if we should ignore them. }; struct Package diff --git a/libmamba/include/mamba/download/mirror_map.hpp b/libmamba/include/mamba/download/mirror_map.hpp index 8adc1d1ee6..6532a52f35 100644 --- a/libmamba/include/mamba/download/mirror_map.hpp +++ b/libmamba/include/mamba/download/mirror_map.hpp @@ -15,8 +15,8 @@ #include #include "mamba/download/mirror.hpp" -#include "mamba/util/iterator.hpp" #include "mamba/specs/channel.hpp" +#include "mamba/util/iterator.hpp" namespace mamba::download { diff --git a/libmamba/src/core/env_lockfile_conda.cpp b/libmamba/src/core/env_lockfile_conda.cpp index cded382949..1f17112713 100644 --- a/libmamba/src/core/env_lockfile_conda.cpp +++ b/libmamba/src/core/env_lockfile_conda.cpp @@ -128,7 +128,7 @@ namespace mamba -> tl::expected { EnvironmentLockFile::Meta metadata; - metadata.enable_channels = false; // we ignore the channels specified by the file + metadata.enable_channels = false; // we ignore the channels specified by the file for (const auto& platform_node : metadata_node["platforms"]) { diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index a4393e53ef..60cf6ff781 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1394,7 +1394,7 @@ namespace mamba channel_info.name, channel_info.urls, specs::Channel::UrlPriority::high // put the urls coming form this file on top - // of the mirrors list + // of the mirrors list ); // TODO c++23: use .append auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; @@ -1406,10 +1406,10 @@ namespace mamba } init_channels(ctx, channel_context, specs::Channel::UrlPriority::high); // makes sure - // the new - // mirrors are - // taken into - // account + // the new + // mirrors are + // taken into + // account } std::vector conda_packages = {}; diff --git a/micromamba/tests/test_create.py b/micromamba/tests/test_create.py index e6cd90d96f..a844c47cab 100644 --- a/micromamba/tests/test_create.py +++ b/micromamba/tests/test_create.py @@ -316,11 +316,15 @@ def test_env_lockfile_different_install_after_create( _base_lockfile_path("envlockfile-check-step-2-lock", lockfile_format), install_spec_file ) - res = helpers.create("-p", env_prefix, "-f", create_spec_file, "-y", "--json", default_channel=False) + res = helpers.create( + "-p", env_prefix, "-f", create_spec_file, "-y", "--json", default_channel=False + ) assert res["success"] # Must not crash - helpers.install("-p", env_prefix, "-f", install_spec_file, "-y", "--json", default_channel=False) + helpers.install( + "-p", env_prefix, "-f", install_spec_file, "-y", "--json", default_channel=False + ) @pytest.mark.parametrize("shared_pkgs_dirs", [True], indirect=True) From 3b2628ef99286e9e416dff9bda2cb2b384d0ef7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Lamotte=20=28Klaim=29?= Date: Tue, 17 Feb 2026 18:30:35 +0100 Subject: [PATCH 54/66] wip --- .../include/mamba/core/channel_context.hpp | 5 +-- libmamba/include/mamba/specs/channel.hpp | 10 ++--- libmamba/src/core/channel_context.cpp | 29 +++++--------- libmamba/src/core/transaction.cpp | 40 ++++++++++--------- libmambapy/bindings/specs.cpp | 14 +++---- 5 files changed, 45 insertions(+), 53 deletions(-) diff --git a/libmamba/include/mamba/core/channel_context.hpp b/libmamba/include/mamba/core/channel_context.hpp index dcff0d2668..fe8b1f378a 100644 --- a/libmamba/include/mamba/core/channel_context.hpp +++ b/libmamba/include/mamba/core/channel_context.hpp @@ -55,11 +55,10 @@ namespace mamba [[nodiscard]] auto make_channel(std::string_view name) -> const channel_list&; [[nodiscard]] auto make_channel( std::string_view name, - const std::vector& mirrors, - specs::Channel::UrlPriority new_mirrors_priority = specs::Channel::UrlPriority::low - ) -> const channel_list&; + const std::vector& mirrors) -> const channel_list&; [[nodiscard]] auto params() const -> const specs::ChannelResolveParams&; + [[nodiscard]] auto zst_channels() const -> const std::vector&; [[nodiscard]] auto has_zst(const Channel& chan) const -> bool; diff --git a/libmamba/include/mamba/specs/channel.hpp b/libmamba/include/mamba/specs/channel.hpp index 8fbce1fbab..75ebf240d9 100644 --- a/libmamba/include/mamba/specs/channel.hpp +++ b/libmamba/include/mamba/specs/channel.hpp @@ -150,11 +150,11 @@ namespace mamba::specs struct ChannelResolveParamsView { - const ChannelResolveParams::platform_list& platforms = {}; - const CondaURL& channel_alias = {}; - const ChannelResolveParams::channel_map& custom_channels = {}; - const ChannelResolveParams::multichannel_map& custom_multichannels = {}; - const AuthenticationDataBase& authentication_db = {}; + const ChannelResolveParams::platform_list& platforms; + const CondaURL& channel_alias; + const ChannelResolveParams::channel_map& custom_channels; + const ChannelResolveParams::multichannel_map& custom_multichannels; + const AuthenticationDataBase& authentication_db; std::string_view home_dir = {}; std::string_view current_working_dir = {}; }; diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index 1d2108b10f..2c532c961d 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -289,21 +289,11 @@ namespace mamba auto ChannelContext::make_channel( std::string_view name, - const std::vector& mirrors, - specs::Channel::UrlPriority new_mirrors_priority + const std::vector& mirrors ) -> const channel_list& { if (const auto it = m_channel_cache.find(std::string(name)); it != m_channel_cache.end()) { - // inject additional mirrors if not already existing in current channels - for (auto& channel : it->second) - { - // TODO C++23: replace all this by std::vector(from_range_t, ...) - auto urls_view = specs::as_conda_urls(mirrors); - std::vector urls(urls_view.begin(), urls_view.end()); - - channel.add_mirror_urls(urls, new_mirrors_priority); - } return it->second; } @@ -332,15 +322,16 @@ namespace mamba return m_channel_params; } + [[nodiscard]] auto ChannelContext::zst_channels() const -> const std::vector& + { + return m_has_zst; + } + auto ChannelContext::has_zst(const Channel& chan) const -> bool { - for (const auto& zst_chan : m_has_zst) - { - if (zst_chan.contains_equivalent(chan)) - { - return true; - } - } - return false; + return std::ranges::any_of(m_has_zst, [&](const auto& zst_chan){ + return zst_chan.contains_equivalent(chan); + }); } + } diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 60cf6ff781..dd4138ec19 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1386,30 +1386,32 @@ namespace mamba if (lockfile_data.get_metadata().enable_channels) { - // create or add mirrors to additional channels + // We need to recreate the channel context using updated channel values + auto channel_context_params = channel_context.params(); + const auto zst_channels = channel_context.zst_channels(); + for (const EnvironmentLockFile::Channel& channel_info : lockfile_data.get_metadata().channels) { - auto channels [[maybe_unused]] = channel_context.make_channel( - channel_info.name, - channel_info.urls, - specs::Channel::UrlPriority::high // put the urls coming form this file on top - // of the mirrors list - ); - // TODO c++23: use .append - auto& context_mirrors = ctx.mirrored_channels[channel_info.name]; - context_mirrors.insert( - context_mirrors.begin(), - channel_info.urls.begin(), - channel_info.urls.end() - ); + // TODO C++23: replace all this by std::vector(from_range_t, ...) + // or `channel_info.urls | as_conda_urls | to` + auto urls_view = specs::as_conda_urls(channel_info.urls); + std::vector mirror_urls(urls_view.begin(), urls_view.end()); + + auto channel_it = channel_context_params.custom_channels.find(channel_info.name); + if(channel_it == channel_context_params.custom_channels.end()) + { + channel_context_params.custom_channels.emplace(channel_info.name, specs::Channel{ std::move(mirror_urls), channel_info.name }); + } + else + { + channel_it->second.add_mirror_urls(mirror_urls, specs::Channel::UrlPriority::high); + } } - init_channels(ctx, channel_context, specs::Channel::UrlPriority::high); // makes sure - // the new - // mirrors are - // taken into - // account + channel_context = ChannelContext{ std::move(channel_context_params), std::move(zst_channels) }; + + init_channels(ctx, channel_context, specs::Channel::UrlPriority::high); // update the context too } std::vector conda_packages = {}; diff --git a/libmambapy/bindings/specs.cpp b/libmambapy/bindings/specs.cpp index 7aef730672..ee144968f5 100644 --- a/libmambapy/bindings/specs.cpp +++ b/libmambapy/bindings/specs.cpp @@ -498,13 +498,13 @@ namespace mambapy return Channel::resolve( what, ChannelResolveParamsView{ - /* .platforms= */ platforms, - /* .channel_alias= */ channel_alias, - /* .custom_channels= */ custom_channels, - /* .custom_multichannels= */ custom_multichannels, - /* .authentication_db= */ authentication_db, - /* .home_dir= */ home_dir, - /* .current_working_dir= */ current_working_dir, + .platforms = platforms, + .channel_alias = channel_alias, + .custom_channels = custom_channels, + .custom_multichannels = custom_multichannels, + .authentication_db = authentication_db, + .home_dir = home_dir, + .current_working_dir = current_working_dir, } ); }, From 017ace8b18b69917ef8ec1e1a8829e3a56fbaa94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:27:12 +0100 Subject: [PATCH 55/66] back to using channel::resolve --- libmamba/src/core/transaction.cpp | 33 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index dd4138ec19..c11b36b22b 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -493,16 +493,12 @@ namespace mamba for (specs::PackageInfo& pkg : m_solution.packages()) { - const auto& channels = channel_context.make_channel(pkg.channel); - assert(not channels.empty()); - - const auto channel_url = channels.front().platform_url(pkg.platform).str(); - pkg.channel = channel_url; - - if (pkg.package_url.empty()) - { - pkg.package_url = pkg.url_for_channel_platform(channel_url); - } + using namespace mamba::specs; + const auto unresolved_pkg_channel = UnresolvedChannel::parse(pkg.channel).value(); + const auto pkg_channel = Channel::resolve(unresolved_pkg_channel, channel_context.params()) + .value(); + assert(not pkg_channel.empty()); + const auto channel_url = pkg_channel.front().platform_url(pkg.platform).str(); }; @@ -1393,15 +1389,18 @@ namespace mamba for (const EnvironmentLockFile::Channel& channel_info : lockfile_data.get_metadata().channels) { - // TODO C++23: replace all this by std::vector(from_range_t, ...) - // or `channel_info.urls | as_conda_urls | to` + // TODO C++23: replace all this by std::vector(from_range_t, ...) + // or `channel_info.urls | as_conda_urls | to` auto urls_view = specs::as_conda_urls(channel_info.urls); std::vector mirror_urls(urls_view.begin(), urls_view.end()); auto channel_it = channel_context_params.custom_channels.find(channel_info.name); - if(channel_it == channel_context_params.custom_channels.end()) + if (channel_it == channel_context_params.custom_channels.end()) { - channel_context_params.custom_channels.emplace(channel_info.name, specs::Channel{ std::move(mirror_urls), channel_info.name }); + channel_context_params.custom_channels.emplace( + channel_info.name, + specs::Channel{ std::move(mirror_urls), channel_info.name } + ); } else { @@ -1409,9 +1408,11 @@ namespace mamba } } - channel_context = ChannelContext{ std::move(channel_context_params), std::move(zst_channels) }; + channel_context = ChannelContext{ std::move(channel_context_params), + std::move(zst_channels) }; - init_channels(ctx, channel_context, specs::Channel::UrlPriority::high); // update the context too + init_channels(ctx, channel_context, specs::Channel::UrlPriority::high); // update the + // context too } std::vector conda_packages = {}; From b074b1cad1f9e66cfad1e70e6f30299b25dbb7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:34:33 +0100 Subject: [PATCH 56/66] formatting --- libmamba/src/core/channel_context.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libmamba/src/core/channel_context.cpp b/libmamba/src/core/channel_context.cpp index 2c532c961d..66c27a5d9e 100644 --- a/libmamba/src/core/channel_context.cpp +++ b/libmamba/src/core/channel_context.cpp @@ -287,10 +287,8 @@ namespace mamba return it->second; } - auto ChannelContext::make_channel( - std::string_view name, - const std::vector& mirrors - ) -> const channel_list& + auto ChannelContext::make_channel(std::string_view name, const std::vector& mirrors) + -> const channel_list& { if (const auto it = m_channel_cache.find(std::string(name)); it != m_channel_cache.end()) { @@ -329,9 +327,10 @@ namespace mamba auto ChannelContext::has_zst(const Channel& chan) const -> bool { - return std::ranges::any_of(m_has_zst, [&](const auto& zst_chan){ - return zst_chan.contains_equivalent(chan); - }); + return std::ranges::any_of( + m_has_zst, + [&](const auto& zst_chan) { return zst_chan.contains_equivalent(chan); } + ); } } From e9fd8891ecf57a57401454c8e921489a51bc52d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:07:42 +0100 Subject: [PATCH 57/66] determine env-lockfile packages missing urls before earlier --- libmamba/src/core/transaction.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index c11b36b22b..9020e822ca 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -1475,6 +1475,20 @@ namespace mamba LOG_DEBUG << "pip package to install: " << package.name; } + // Make sure package urls are set for conda packages if a channel is specified + for (auto& package : conda_packages) + { + if (package.package_url.empty() and not package.channel.empty()) + { + using Credentials = typename specs::CondaURL::Credentials; + auto channels = channel_context.make_channel(package.channel); + assert(channels.size() == 1); // A URL can only resolve to one channel + const auto& channel = channels.front(); + + package.package_url = package.url_for_channel(channel.url().str(Credentials::Show)); + } + } + return MTransaction{ ctx, database, std::move(conda_packages), package_caches }; } From 66b8e92bc66b8cea75d42cad61e144967172adfc Mon Sep 17 00:00:00 2001 From: Julien Jerphanion Date: Tue, 12 May 2026 11:02:51 +0200 Subject: [PATCH 58/66] Lint Signed-off-by: Julien Jerphanion --- libmamba/include/mamba/core/channel_context.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libmamba/include/mamba/core/channel_context.hpp b/libmamba/include/mamba/core/channel_context.hpp index fe8b1f378a..e8ebb16190 100644 --- a/libmamba/include/mamba/core/channel_context.hpp +++ b/libmamba/include/mamba/core/channel_context.hpp @@ -53,9 +53,9 @@ namespace mamba [[nodiscard]] auto make_channel(specs::UnresolvedChannel uc) -> const channel_list&; [[nodiscard]] auto make_channel(std::string_view name) -> const channel_list&; - [[nodiscard]] auto make_channel( - std::string_view name, - const std::vector& mirrors) -> const channel_list&; + [[nodiscard]] auto + make_channel(std::string_view name, const std::vector& mirrors) + -> const channel_list&; [[nodiscard]] auto params() const -> const specs::ChannelResolveParams&; [[nodiscard]] auto zst_channels() const -> const std::vector&; From a06274f10f8b308da6107e091269c4f786e01aec Mon Sep 17 00:00:00 2001 From: Julien Jerphanion Date: Tue, 12 May 2026 11:10:20 +0200 Subject: [PATCH 59/66] Move default parameter value from header to translation unit Signed-off-by: Julien Jerphanion --- libmamba/src/api/channel_loader.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libmamba/src/api/channel_loader.cpp b/libmamba/src/api/channel_loader.cpp index 7a701bed6b..2a3793a2fe 100644 --- a/libmamba/src/api/channel_loader.cpp +++ b/libmamba/src/api/channel_loader.cpp @@ -185,7 +185,11 @@ namespace mamba } // Forward declarations for helpers defined later in this namespace. - void create_mirrors(const specs::Channel& channel, download::mirror_map& mirrors); + void create_mirrors( + const specs::Channel& channel, + download::mirror_map& mirrors, + specs::Channel::UrlPriority priority = specs::Channel::UrlPriority::low + ); void create_subdirs( Context& ctx, @@ -879,7 +883,7 @@ namespace mamba void create_mirrors( const specs::Channel& channel, download::mirror_map& mirrors, - specs::Channel::UrlPriority priority = specs::Channel::UrlPriority::low + specs::Channel::UrlPriority priority ) { for (const specs::CondaURL& url : channel.mirror_urls()) From 90c2cf80a9e5919d4c1c63639d4dc6d3c4ffa6e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:47:35 +0200 Subject: [PATCH 60/66] fixed: missing pacakge info channel url determination (maybe unintentionally removed when merged with main?) --- libmamba/src/core/transaction.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index 4408c2d8f4..ccd65044c8 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -614,6 +614,12 @@ namespace mamba .value(); assert(not pkg_channel.empty()); const auto channel_url = pkg_channel.front().platform_url(pkg.platform).str(); + + pkg.channel = channel_url; + if (pkg.package_url.empty()) + { + pkg.package_url = pkg.url_for_channel_platform(channel_url); + } }; From b815459338bb9add055579c1faeb1f2d0720d61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 3 Jul 2026 15:30:20 +0200 Subject: [PATCH 61/66] attempt to fix history vs channel name ci issue --- libmamba/src/core/transaction.cpp | 10 +--------- libmamba/src/solver/helpers.cpp | 14 ++++++++++++++ libmamba/src/solver/helpers.hpp | 18 +++++++++++++----- libmamba/src/specs/package_info.cpp | 11 +++++++++-- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index ccd65044c8..dc68f9a090 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -608,17 +608,9 @@ namespace mamba for (specs::PackageInfo& pkg : m_solution.packages()) { - using namespace mamba::specs; - const auto unresolved_pkg_channel = UnresolvedChannel::parse(pkg.channel).value(); - const auto pkg_channel = Channel::resolve(unresolved_pkg_channel, channel_context.params()) - .value(); - assert(not pkg_channel.empty()); - const auto channel_url = pkg_channel.front().platform_url(pkg.platform).str(); - - pkg.channel = channel_url; if (pkg.package_url.empty()) { - pkg.package_url = pkg.url_for_channel_platform(channel_url); + pkg.package_url = solver::resolve_package_url(channel_context, pkg); } }; diff --git a/libmamba/src/solver/helpers.cpp b/libmamba/src/solver/helpers.cpp index 0182e6e49c..306ef94625 100644 --- a/libmamba/src/solver/helpers.cpp +++ b/libmamba/src/solver/helpers.cpp @@ -8,6 +8,8 @@ #include "solver/helpers.hpp" +#include "mamba/core/channel_context.hpp" + namespace mamba::solver { auto find_new_python_in_solution(const Solution& solution) @@ -36,4 +38,16 @@ namespace mamba::solver && a_ver[0] == b_ver[0] // && a_ver[1] == b_ver[1]; } + + auto resolve_package_url(ChannelContext& channel_context, const specs::PackageInfo& package) + -> std::string + { + using namespace mamba::specs; + const auto unresolved_pkg_channel = UnresolvedChannel::parse(package.channel).value(); + const auto pkg_channel = Channel::resolve(unresolved_pkg_channel, channel_context.params()) + .value(); + assert(not pkg_channel.empty()); + const auto channel_url = pkg_channel.front().platform_url(package.platform).str(); + return package.url_for_channel_platform(channel_url); + } } diff --git a/libmamba/src/solver/helpers.hpp b/libmamba/src/solver/helpers.hpp index f6979f40d4..24115aabdd 100644 --- a/libmamba/src/solver/helpers.hpp +++ b/libmamba/src/solver/helpers.hpp @@ -17,14 +17,22 @@ * Solver, repo, and package helpers for solver agnostic code. */ +namespace mamba +{ + class ChannelContext; +} + namespace mamba::solver { - [[nodiscard]] auto find_new_python_in_solution(const Solution& solution) + [[nodiscard]] + auto find_new_python_in_solution(const Solution& solution) -> std::optional>; - [[nodiscard]] auto python_binary_compatible( // - const specs::Version& older, - const specs::Version& newer - ) -> bool; + [[nodiscard]] + auto python_binary_compatible(const specs::Version& older, const specs::Version& newer) -> bool; + + [[nodiscard]] + auto resolve_package_url(ChannelContext& channel_context, const specs::PackageInfo& package) + -> std::string; } #endif diff --git a/libmamba/src/specs/package_info.cpp b/libmamba/src/specs/package_info.cpp index 443b6a27a4..01cf39560e 100644 --- a/libmamba/src/specs/package_info.cpp +++ b/libmamba/src/specs/package_info.cpp @@ -405,8 +405,15 @@ namespace mamba::specs auto PackageInfo::long_str() const -> std::string { - // TODO channel contains subdir right now?! - return util::concat(channel, "::", str()); + if (not package_url.empty()) + { + return package_url; + } + else + { + // TODO channel contains subdir right now?! + return util::concat(channel, "::", str()); + } } namespace From 383401b991e9e4aba08902cf66d2040ba181508e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:54:09 +0200 Subject: [PATCH 62/66] fixup "long_str()` needs to return a desc not an url --- libmamba/src/specs/package_info.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/libmamba/src/specs/package_info.cpp b/libmamba/src/specs/package_info.cpp index 01cf39560e..7e1071e838 100644 --- a/libmamba/src/specs/package_info.cpp +++ b/libmamba/src/specs/package_info.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -403,11 +404,28 @@ namespace mamba::specs return fmt::format("{}-{}-{}", name, version, build_string); } + namespace + { + [[nodiscard]] + auto pkg_url_to_pkg_desc(std::string_view package_url) -> std::string + { + using namespace std::literals; + const auto sep_pos = package_url.find_last_of('/'); + + const auto channel_url = package_url.substr(0, sep_pos); + const auto package_name = fs::u8path(package_url.substr(sep_pos + 1)) + .replace_extension() // removes file extension + .string(); + + return fmt::format("{}::{}", channel_url, package_name); + } + } + auto PackageInfo::long_str() const -> std::string { if (not package_url.empty()) { - return package_url; + return pkg_url_to_pkg_desc(package_url); } else { From 2e3db8262187618744b27ab3d77aadc6ae85a5c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:28:47 +0200 Subject: [PATCH 63/66] minor cleanup --- libmamba/src/api/install.cpp | 18 +++++++++++++++--- libmamba/src/specs/match_spec.cpp | 18 ++++++++++-------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/libmamba/src/api/install.cpp b/libmamba/src/api/install.cpp index 0c328314fd..cab5a2d911 100644 --- a/libmamba/src/api/install.cpp +++ b/libmamba/src/api/install.cpp @@ -1048,8 +1048,7 @@ namespace mamba { env_name.set_cli_yaml_value(parse_result.name); } - else if (parse_result.name.size() != 0 - && parse_result.name != env_name.cli_value()) + else if (parse_result.name.size() != 0 && parse_result.name != env_name.cli_value()) { LOG_WARNING << "YAML specs have different environment names. Using " << env_name.cli_value(); @@ -1210,8 +1209,21 @@ namespace mamba { const auto ms = pkg.second.name + "==" + pkg.second.version + " =" + pkg.second.build_string; + auto match_specs = specs::MatchSpec::parse(ms); + if (not match_specs) + { + throw mamba_error( + fmt::format( + "failed to parse specs '{}' : {}", + ms, + match_specs.error().what() + ), + mamba_error_code::invalid_spec + ); + } + db.for_each_package_matching( - specs::MatchSpec::parse(ms).value(), + match_specs.value(), [&](specs::PackageInfo&& pkg_info) { pkg.second = pkg_info; } ); } diff --git a/libmamba/src/specs/match_spec.cpp b/libmamba/src/specs/match_spec.cpp index fbdb7f0a09..a9005a8c94 100644 --- a/libmamba/src/specs/match_spec.cpp +++ b/libmamba/src/specs/match_spec.cpp @@ -355,12 +355,12 @@ namespace mamba::specs if (util::starts_with(key_val, "version")) { const auto op_val = util::lstrip(key_val, "version"); - if ( // - util::starts_with(op_val, "==") // - || util::starts_with(op_val, "!=") - || util::starts_with(op_val, "~=") // - || util::starts_with(op_val, '>') // - || util::starts_with(op_val, '<')) + if ( // + util::starts_with(op_val, "==") // + || util::starts_with(op_val, "!=") || util::starts_with(op_val, "~=") // + || util::starts_with(op_val, '>') // + || util::starts_with(op_val, '<') + ) { return make_unexpected_parse( fmt::format( @@ -542,6 +542,8 @@ namespace mamba::specs auto MatchSpec::parse(std::string_view str) -> expected_parse_t { + using namespace std::literals; + // Remove comments, i.e. everything after ` #` (space included) if (const auto idx = str.find(" #"); idx != std::string::npos) { @@ -569,8 +571,8 @@ namespace mamba::specs // TODO: this solution reallocates memory several times potentially, but the // number of operators is small and the strings are short, so it must be fine. // If needed it can be optimized so that the string is only copied once. - const auto op_array = std::array{ ">=", "<=", ">", "<", "!=", - "=", "==", "~=", "," }; + static constexpr auto op_array = std::array{ ">="s, "<="s, ">"s, "<"s, "!="s, + "="s, "=="s, "~="s, ","s }; for (const std::string& op : op_array) { const std::string bad_op = op + " "; From 39e3981c2fa78a540308dde822d9d3d74c3405e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:29:39 +0200 Subject: [PATCH 64/66] Revert "fixup "long_str()` needs to return a desc not an url" This reverts commit 383401b991e9e4aba08902cf66d2040ba181508e. --- libmamba/src/specs/package_info.cpp | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/libmamba/src/specs/package_info.cpp b/libmamba/src/specs/package_info.cpp index 7e1071e838..01cf39560e 100644 --- a/libmamba/src/specs/package_info.cpp +++ b/libmamba/src/specs/package_info.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -404,28 +403,11 @@ namespace mamba::specs return fmt::format("{}-{}-{}", name, version, build_string); } - namespace - { - [[nodiscard]] - auto pkg_url_to_pkg_desc(std::string_view package_url) -> std::string - { - using namespace std::literals; - const auto sep_pos = package_url.find_last_of('/'); - - const auto channel_url = package_url.substr(0, sep_pos); - const auto package_name = fs::u8path(package_url.substr(sep_pos + 1)) - .replace_extension() // removes file extension - .string(); - - return fmt::format("{}::{}", channel_url, package_name); - } - } - auto PackageInfo::long_str() const -> std::string { if (not package_url.empty()) { - return pkg_url_to_pkg_desc(package_url); + return package_url; } else { From 67fbc3235eec9f712ae019e055abb40f3fd90703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:30:12 +0200 Subject: [PATCH 65/66] Revert "attempt to fix history vs channel name ci issue" This reverts commit b815459338bb9add055579c1faeb1f2d0720d61f. --- libmamba/src/core/transaction.cpp | 10 +++++++++- libmamba/src/solver/helpers.cpp | 14 -------------- libmamba/src/solver/helpers.hpp | 18 +++++------------- libmamba/src/specs/package_info.cpp | 11 ++--------- 4 files changed, 16 insertions(+), 37 deletions(-) diff --git a/libmamba/src/core/transaction.cpp b/libmamba/src/core/transaction.cpp index dc68f9a090..ccd65044c8 100644 --- a/libmamba/src/core/transaction.cpp +++ b/libmamba/src/core/transaction.cpp @@ -608,9 +608,17 @@ namespace mamba for (specs::PackageInfo& pkg : m_solution.packages()) { + using namespace mamba::specs; + const auto unresolved_pkg_channel = UnresolvedChannel::parse(pkg.channel).value(); + const auto pkg_channel = Channel::resolve(unresolved_pkg_channel, channel_context.params()) + .value(); + assert(not pkg_channel.empty()); + const auto channel_url = pkg_channel.front().platform_url(pkg.platform).str(); + + pkg.channel = channel_url; if (pkg.package_url.empty()) { - pkg.package_url = solver::resolve_package_url(channel_context, pkg); + pkg.package_url = pkg.url_for_channel_platform(channel_url); } }; diff --git a/libmamba/src/solver/helpers.cpp b/libmamba/src/solver/helpers.cpp index 306ef94625..0182e6e49c 100644 --- a/libmamba/src/solver/helpers.cpp +++ b/libmamba/src/solver/helpers.cpp @@ -8,8 +8,6 @@ #include "solver/helpers.hpp" -#include "mamba/core/channel_context.hpp" - namespace mamba::solver { auto find_new_python_in_solution(const Solution& solution) @@ -38,16 +36,4 @@ namespace mamba::solver && a_ver[0] == b_ver[0] // && a_ver[1] == b_ver[1]; } - - auto resolve_package_url(ChannelContext& channel_context, const specs::PackageInfo& package) - -> std::string - { - using namespace mamba::specs; - const auto unresolved_pkg_channel = UnresolvedChannel::parse(package.channel).value(); - const auto pkg_channel = Channel::resolve(unresolved_pkg_channel, channel_context.params()) - .value(); - assert(not pkg_channel.empty()); - const auto channel_url = pkg_channel.front().platform_url(package.platform).str(); - return package.url_for_channel_platform(channel_url); - } } diff --git a/libmamba/src/solver/helpers.hpp b/libmamba/src/solver/helpers.hpp index 24115aabdd..f6979f40d4 100644 --- a/libmamba/src/solver/helpers.hpp +++ b/libmamba/src/solver/helpers.hpp @@ -17,22 +17,14 @@ * Solver, repo, and package helpers for solver agnostic code. */ -namespace mamba -{ - class ChannelContext; -} - namespace mamba::solver { - [[nodiscard]] - auto find_new_python_in_solution(const Solution& solution) + [[nodiscard]] auto find_new_python_in_solution(const Solution& solution) -> std::optional>; - [[nodiscard]] - auto python_binary_compatible(const specs::Version& older, const specs::Version& newer) -> bool; - - [[nodiscard]] - auto resolve_package_url(ChannelContext& channel_context, const specs::PackageInfo& package) - -> std::string; + [[nodiscard]] auto python_binary_compatible( // + const specs::Version& older, + const specs::Version& newer + ) -> bool; } #endif diff --git a/libmamba/src/specs/package_info.cpp b/libmamba/src/specs/package_info.cpp index 01cf39560e..443b6a27a4 100644 --- a/libmamba/src/specs/package_info.cpp +++ b/libmamba/src/specs/package_info.cpp @@ -405,15 +405,8 @@ namespace mamba::specs auto PackageInfo::long_str() const -> std::string { - if (not package_url.empty()) - { - return package_url; - } - else - { - // TODO channel contains subdir right now?! - return util::concat(channel, "::", str()); - } + // TODO channel contains subdir right now?! + return util::concat(channel, "::", str()); } namespace From c6d332dafc7d0f66a01f70c05b09fc772a40c888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaim=20=28Jo=C3=ABl=20Lamotte=29?= <142265+Klaim@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:49:46 +0200 Subject: [PATCH 66/66] fixed merge missing modifications --- libmamba/include/mamba/core/transaction.hpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/libmamba/include/mamba/core/transaction.hpp b/libmamba/include/mamba/core/transaction.hpp index 7bf731ea2b..0e1a9e7fcb 100644 --- a/libmamba/include/mamba/core/transaction.hpp +++ b/libmamba/include/mamba/core/transaction.hpp @@ -52,10 +52,28 @@ namespace mamba ); // Only use if the packages have been solved previously already. + template S> + requires std::same_as::value_type>, specs::PackageInfo> MTransaction( const Context& ctx, solver::libsolv::Database& database, - std::unordered_set packages, + I begin_packages, + S end_packages, + MultiPackageCache& caches + ) + : MTransaction( + ctx, + database, + std::vector(begin_packages, end_packages), + caches + ) + { + } + + MTransaction( + const Context& ctx, + solver::libsolv::Database& database, + std::vector packages, MultiPackageCache& caches );