Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite Query with Pool functions (wrapping libsolv) #3168

Merged
merged 10 commits into from
Feb 5, 2024
61 changes: 57 additions & 4 deletions libmamba/include/mamba/core/pool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "mamba/solver/libsolv/parameters.hpp"
#include "mamba/solver/libsolv/repo_info.hpp"
#include "mamba/specs/package_info.hpp"
#include "mamba/util/loop_control.hpp"

namespace mamba
{
Expand Down Expand Up @@ -63,10 +64,6 @@ namespace mamba
std::optional<specs::PackageInfo> id2pkginfo(Id solv_id) const;
std::optional<std::string> dep2str(Id dep_id) const;

// TODO: (TMP) This is not meant to exist but is needed for a transition period
operator ::Pool*();
operator const ::Pool*() const;

// TODO: (TMP) This is not meant to be public but is needed for a transition period
solv::ObjPool& pool();
const solv::ObjPool& pool() const;
Expand Down Expand Up @@ -112,6 +109,12 @@ namespace mamba

void remove_repo(::Id repo_id, bool reuse_ids);

template <typename Func>
void for_each_package_matching(const specs::MatchSpec& ms, Func&&);

template <typename Func>
void for_each_package_depending_on(const specs::MatchSpec& ms, Func&&);

ChannelContext& channel_context() const;
const Context& context() const;

Expand Down Expand Up @@ -143,6 +146,16 @@ namespace mamba
const solver::libsolv::RepoInfo& repo,
solver::libsolv::PipAsPythonDependency add
);

using SolvableId = int;

[[nodiscard]] auto solvable_id_to_package_info(SolvableId id) const -> specs::PackageInfo;

[[nodiscard]] auto packages_matching_ids(const specs::MatchSpec& ms)
-> std::vector<SolvableId>;

[[nodiscard]] auto packages_depending_on_ids(const specs::MatchSpec& ms)
-> std::vector<SolvableId>;
};

// TODO machinery functions in separate files
Expand Down Expand Up @@ -182,5 +195,45 @@ namespace mamba
{
return add_repo_from_packages(packages.begin(), packages.end(), name, add);
}

// TODO(C++20): Use ranges::transform
template <typename Func>
void MPool::for_each_package_matching(const specs::MatchSpec& ms, Func&& func)
{
for (auto id : packages_matching_ids(ms))
{
if constexpr (std::is_same_v<decltype(func(solvable_id_to_package_info(id))), util::LoopControl>)
{
if (func(solvable_id_to_package_info(id)) == util::LoopControl::Break)
{
break;
}
}
else
{
func(solvable_id_to_package_info(id));
}
}
}

// TODO(C++20): Use ranges::transform
template <typename Func>
void MPool::for_each_package_depending_on(const specs::MatchSpec& ms, Func&& func)
{
for (auto id : packages_depending_on_ids(ms))
{
if constexpr (std::is_same_v<decltype(func(solvable_id_to_package_info(id))), util::LoopControl>)
{
if (func(solvable_id_to_package_info(id)) == util::LoopControl::Break)
{
break;
}
}
else
{
func(solvable_id_to_package_info(id));
}
}
}
}
#endif
6 changes: 2 additions & 4 deletions libmamba/include/mamba/core/query.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,9 @@ namespace mamba
[[nodiscard]] static auto find(MPool& pool, const std::vector<std::string>& queries)
-> QueryResult;

[[nodiscard]] static auto whoneeds(MPool& pool, const std::string& query, bool tree)
-> QueryResult;
[[nodiscard]] static auto whoneeds(MPool& pool, std::string query, bool tree) -> QueryResult;

[[nodiscard]] static auto depends(MPool& pool, const std::string& query, bool tree)
-> QueryResult;
[[nodiscard]] static auto depends(MPool& pool, std::string query, bool tree) -> QueryResult;
};

/********************
Expand Down
34 changes: 24 additions & 10 deletions libmamba/src/core/pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,16 +112,6 @@ namespace mamba
pool().create_whatprovides();
}

MPool::operator Pool*()
{
return pool().raw();
}

MPool::operator const Pool*() const
{
return pool().raw();
}

std::vector<Id> MPool::select_solvables(Id matchspec, bool sorted) const
{
auto solvables = pool().select_solvables({ SOLVER_SOLVABLE_PROVIDES, matchspec });
Expand Down Expand Up @@ -313,6 +303,30 @@ namespace mamba
repo.m_ptr->subpriority = priorities.subpriority;
}

auto MPool::solvable_id_to_package_info(SolvableId id) const -> specs::PackageInfo
{
static_assert(std::is_same_v<SolvableId, solv::SolvableId>);
return id2pkginfo(id).value(); // Safe because the ID is coming from libsolv
}

auto MPool::packages_matching_ids(const specs::MatchSpec& ms) -> std::vector<SolvableId>
{
const auto ms_id = matchspec2id(ms);
auto solvables = pool().select_solvables({ SOLVER_SOLVABLE_PROVIDES, ms_id });
auto out = std::vector<SolvableId>(solvables.size());
std::copy(solvables.begin(), solvables.end(), out.begin());
return out;
}

auto MPool::packages_depending_on_ids(const specs::MatchSpec& ms) -> std::vector<SolvableId>
{
const auto ms_id = matchspec2id(ms);
auto solvables = pool().what_matches_dep(SOLVABLE_REQUIRES, ms_id);
auto out = std::vector<SolvableId>(solvables.size());
std::copy(solvables.begin(), solvables.end(), out.begin());
return out;
}

// TODO machinery functions in separate files
auto load_subdir_in_pool(const Context& ctx, MPool& pool, const SubdirData& subdir)
-> expected_t<solver::libsolv::RepoInfo>
Expand Down
Loading
Loading