Skip to content

Commit

Permalink
No singleton: ChannelContext, ChannelBuilder and channel cache (#2455)
Browse files Browse the repository at this point in the history
* Fusionned ChannelBuilder and ChannelContext and channel cache

* ChannelContext is not a singleton anymore.

* libmambapy now holds singletons for ChannelContext etc.

* formatting

* Simplified libmambapy singleton handling.

* formatting
  • Loading branch information
Klaim authored May 17, 2023
1 parent 2b7268b commit ea8249b
Show file tree
Hide file tree
Showing 57 changed files with 768 additions and 542 deletions.
1 change: 0 additions & 1 deletion libmamba/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,6 @@ set(LIBMAMBA_PUBLIC_HEADERS
# Core API (low-level)
${LIBMAMBA_INCLUDE_DIR}/mamba/core/activation.hpp
${LIBMAMBA_INCLUDE_DIR}/mamba/core/channel.hpp
${LIBMAMBA_INCLUDE_DIR}/mamba/core/channel_builder.hpp
${LIBMAMBA_INCLUDE_DIR}/mamba/core/palette.hpp
${LIBMAMBA_INCLUDE_DIR}/mamba/core/context.hpp
${LIBMAMBA_INCLUDE_DIR}/mamba/core/environment.hpp
Expand Down
4 changes: 3 additions & 1 deletion libmamba/include/mamba/api/info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

namespace mamba
{
class ChannelContext;

void info();

std::string version();
Expand All @@ -34,7 +36,7 @@ namespace mamba

namespace detail
{
void print_info();
void print_info(ChannelContext& channel_context);
}
}

Expand Down
12 changes: 10 additions & 2 deletions libmamba/include/mamba/api/install.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,25 @@

namespace mamba
{
class ChannelContext;

void install();

void install_specs(
ChannelContext& channel_context,
const std::vector<std::string>& specs,
bool create_env = false,
int solver_flag = SOLVER_INSTALL,
int is_retry = 0
);

void install_explicit_specs(const std::vector<std::string>& specs, bool create_env = false);
void install_explicit_specs(
ChannelContext& channel_context,
const std::vector<std::string>& specs,
bool create_env = false
);
void install_lockfile_specs(
ChannelContext& channel_context,
const std::string& lockfile_specs,
const std::vector<std::string>& categories,
bool create_env = false
Expand Down Expand Up @@ -73,7 +81,7 @@ namespace mamba
yaml_file_contents read_yaml_file(fs::u8path yaml_file);

std::tuple<std::vector<PackageInfo>, std::vector<MatchSpec>>
parse_urls_to_package_info(const std::vector<std::string>& urls);
parse_urls_to_package_info(const std::vector<std::string>& urls, ChannelContext& channel_context);

inline void to_json(nlohmann::json&, const other_pkg_mgr_spec&)
{
Expand Down
4 changes: 3 additions & 1 deletion libmamba/include/mamba/api/list.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@

namespace mamba
{
class ChannelContext;

void list(const std::string& regex);

namespace detail
{
void list_packages(std::string regex);
void list_packages(std::string regex, ChannelContext& channel_context);

struct formatted_pkg;

Expand Down
9 changes: 8 additions & 1 deletion libmamba/include/mamba/api/remove.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,18 @@

namespace mamba
{
class ChannelContext;

void remove(int flags = MAMBA_REMOVE_PRUNE);

namespace detail
{
void remove_specs(const std::vector<std::string>& specs, bool prune, bool force);
void remove_specs(
ChannelContext& channel_context,
const std::vector<std::string>& specs,
bool prune,
bool force
);
}
}

Expand Down
84 changes: 80 additions & 4 deletions libmamba/include/mamba/core/channel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,18 @@

namespace mamba
{
class ChannelContext;

// Note: Channels can only be created using ChannelContext.
class Channel
{
public:

Channel(const Channel&) = delete;
Channel& operator=(const Channel&) = delete;
Channel(Channel&&) noexcept = default;
Channel& operator=(Channel&&) noexcept = default;

const std::string& scheme() const;
const std::string& location() const;
const std::string& name() const;
Expand All @@ -39,9 +47,15 @@ namespace mamba
platform_urls(bool with_credential = true) const;
std::vector<std::string> urls(bool with_credential = true) const;

ChannelContext& channel_context() const
{
return *m_channel_context;
}

private:

Channel(
ChannelContext& channel_context,
const std::string& scheme,
const std::string& location,
const std::string& name,
Expand All @@ -60,17 +74,79 @@ namespace mamba
std::optional<std::string> m_package_filename;
mutable std::optional<std::string> m_canonical_name;
mutable std::unique_ptr<validation::RepoChecker> p_repo_checker;
ChannelContext* m_channel_context = nullptr;

friend class ChannelBuilder;
friend class ChannelContext;
};

bool operator==(const Channel& lhs, const Channel& rhs);
bool operator!=(const Channel& lhs, const Channel& rhs);

const Channel& make_channel(const std::string& value);
std::vector<const Channel*> get_channels(const std::vector<std::string>& channel_names);

void check_whitelist(const std::vector<std::string>& urls);
using ChannelCache = std::map<std::string, Channel>;

class ChannelContext
{
public:

using channel_list = std::vector<std::string>;
using channel_map = std::map<std::string, Channel>;
using multichannel_map = std::map<std::string, std::vector<std::string>>;

ChannelContext();
~ChannelContext();

ChannelContext(const ChannelContext&) = delete;
ChannelContext& operator=(const ChannelContext&) = delete;
ChannelContext(ChannelContext&&) = delete;
ChannelContext& operator=(ChannelContext&&) = delete;

const Channel& make_channel(const std::string& value);
std::vector<const Channel*> get_channels(const std::vector<std::string>& channel_names);

void clear_cache();

void check_whitelist(const std::vector<std::string>& urls);

// internal
const Channel& get_channel_alias() const;
const channel_map& get_custom_channels() const;
const multichannel_map& get_custom_multichannels() const;

const channel_list& get_whitelist_channels() const;

private:

ChannelCache m_channel_cache;
Channel m_channel_alias;
channel_map m_custom_channels;
multichannel_map m_custom_multichannels;
channel_list m_whitelist_channels;

Channel build_channel_alias();
void init_custom_channels();


Channel make_simple_channel(
const Channel& channel_alias,
const std::string& channel_url,
const std::string& channel_name = "",
const std::string& multi_name = ""
);

const Channel& make_cached_channel(const std::string& value);

Channel from_url(const std::string& url);
Channel from_name(const std::string& name);
Channel from_value(const std::string& value);
Channel from_alias(
const std::string& scheme,
const std::string& location,
const std::optional<std::string>& auth = {},
const std::optional<std::string>& token = {}
);
};

} // namespace mamba

#endif
88 changes: 0 additions & 88 deletions libmamba/include/mamba/core/channel_builder.hpp

This file was deleted.

3 changes: 2 additions & 1 deletion libmamba/include/mamba/core/env_lockfile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

namespace mamba
{
class ChannelContext;

enum class file_parsing_error_code
{
Expand Down Expand Up @@ -110,7 +111,7 @@ namespace mamba
/// Read an environment lock YAML file and returns it's structured content or an error if
/// failed.
tl::expected<EnvironmentLockFile, mamba_error>
read_environment_lockfile(const fs::u8path& lockfile_location);
read_environment_lockfile(ChannelContext& channel_context, const fs::u8path& lockfile_location);


/// Returns `true` if the filename matches names of files which should be interpreted as conda
Expand Down
3 changes: 2 additions & 1 deletion libmamba/include/mamba/core/history.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ namespace mamba
{
public:

History(const fs::u8path& prefix);
History(const fs::u8path& prefix, ChannelContext& channel_context);

struct ParseResult
{
Expand Down Expand Up @@ -54,6 +54,7 @@ namespace mamba

fs::u8path m_prefix;
fs::u8path m_history_file_path;
ChannelContext& m_channel_context;
};

} // namespace mamba
Expand Down
8 changes: 5 additions & 3 deletions libmamba/include/mamba/core/match_spec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,17 @@

namespace mamba
{
class ChannelContext;

class MatchSpec
{
public:

MatchSpec() = default;
// TODO make explicit
MatchSpec(std::string_view i_spec);

void parse();
MatchSpec(std::string_view i_spec, ChannelContext& channel_context);

void parse(ChannelContext& channel_context);
std::string conda_build_form() const;
std::string str() const;

Expand Down
2 changes: 1 addition & 1 deletion libmamba/include/mamba/core/pinning.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

namespace mamba
{
std::string python_pin(const PrefixData& prefix_data, const std::vector<std::string>& specs);
std::string python_pin(PrefixData& prefix_data, const std::vector<std::string>& specs);

std::vector<std::string> file_pins(const fs::u8path& file);
}
Expand Down
5 changes: 4 additions & 1 deletion libmamba/include/mamba/core/pool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
namespace mamba
{
class MatchSpec;
class ChannelContext;

namespace solv
{
Expand All @@ -35,7 +36,7 @@ namespace mamba
{
public:

MPool();
MPool(ChannelContext& channel_context);
~MPool();

void set_debuglevel();
Expand All @@ -57,6 +58,8 @@ namespace mamba

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

ChannelContext& channel_context() const;

private:

struct MPoolData;
Expand Down
Loading

0 comments on commit ea8249b

Please sign in to comment.