Skip to content

Commit

Permalink
[libdnf5 API] Base::get_plugins_info
Browse files Browse the repository at this point in the history
Introduces the `Base::get_plugins_info` method, which returns a list
of information about plugins found during `Base::setup`.

It also introduces the `plugin::PluginInfo` class, which provides
information about one libdnf5 plugin.
  • Loading branch information
jrohel committed Apr 23, 2024
1 parent a0c44d5 commit ea407b3
Show file tree
Hide file tree
Showing 11 changed files with 300 additions and 16 deletions.
9 changes: 9 additions & 0 deletions bindings/libdnf5/base.i
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@
%template(BaseWeakPtr) libdnf5::WeakPtr<libdnf5::Base, false>;
%template(VarsWeakPtr) libdnf5::WeakPtr<libdnf5::Vars, false>;

%ignore std::vector<libdnf5::plugin::PluginInfo>::insert;
%ignore std::vector<libdnf5::plugin::PluginInfo>::pop;
%ignore std::vector<libdnf5::plugin::PluginInfo>::pop_back;
%ignore std::vector<libdnf5::plugin::PluginInfo>::push;
%ignore std::vector<libdnf5::plugin::PluginInfo>::push_back;
%ignore std::vector<libdnf5::plugin::PluginInfo>::reserve;
%ignore std::vector<libdnf5::plugin::PluginInfo>::resize;
%template(VectorPluginInfo) std::vector<libdnf5::plugin::PluginInfo>;

%include "libdnf5/base/base.hpp"

%include "libdnf5/base/solver_problems.hpp"
Expand Down
17 changes: 11 additions & 6 deletions bindings/libdnf5/plugin.i
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,20 @@

%{
#include "libdnf5/plugin/iplugin.hpp"
#include "libdnf5/plugin/plugin_info.hpp"
%}

#define CV __perl_CV

%include "libdnf5/plugin/plugin_version.hpp"

%extend libdnf5::plugin::Version {
Version(std::uint16_t major, std::uint16_t minor, std::uint16_t micro) {
libdnf5::plugin::Version * ver = new libdnf5::plugin::Version({major, minor, micro});
return ver;
}
}

%ignore PluginError;
%ignore libdnf_plugin_get_api_version;
%ignore libdnf_plugin_get_name;
Expand All @@ -29,9 +39,4 @@
%feature("director") IPlugin;
%include "libdnf5/plugin/iplugin.hpp"

%extend libdnf5::plugin::Version {
Version(std::uint16_t major, std::uint16_t minor, std::uint16_t micro) {
libdnf5::plugin::Version * ver = new libdnf5::plugin::Version({major, minor, micro});
return ver;
}
}
%include "libdnf5/plugin/plugin_info.hpp"
5 changes: 5 additions & 0 deletions include/libdnf5/base/base.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ along with libdnf. If not, see <https://www.gnu.org/licenses/>.
#include "libdnf5/conf/vars.hpp"
#include "libdnf5/logger/log_router.hpp"
#include "libdnf5/module/module_sack.hpp"
#include "libdnf5/plugin/plugin_info.hpp"
#include "libdnf5/repo/download_callbacks.hpp"
#include "libdnf5/repo/repo_sack.hpp"
#include "libdnf5/rpm/package_sack.hpp"
Expand Down Expand Up @@ -94,6 +95,10 @@ class Base {
/// @exception libdnf5::UserAssertionError When called after Base::setup
void enable_disable_plugins(const std::vector<std::string> & plugin_names, bool enable);

/// @return a list of information about plugins found during Base::setup
/// @exception libdnf5::UserAssertionError When called before Base::setup
const std::vector<plugin::PluginInfo> & get_plugins_info() const;

/// Loads libdnf plugins, vars from environment, varsdirs and installroot (releasever, arch) and resolves
/// configuration of protected_packages (glob:).
/// To prevent differences between configuration and internal Base settings, following configurations
Expand Down
10 changes: 2 additions & 8 deletions include/libdnf5/plugin/iplugin.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ along with libdnf. If not, see <https://www.gnu.org/licenses/>.
#ifndef LIBDNF5_PLUGIN_IPLUGIN_HPP
#define LIBDNF5_PLUGIN_IPLUGIN_HPP

#include "plugin_version.hpp"

#include "libdnf5/common/impl_ptr.hpp"
#include "libdnf5/version.hpp"

#include <cstdint>
#include <string>
#include <vector>

Expand All @@ -40,13 +41,6 @@ class Transaction;

namespace libdnf5::plugin {

/// Plugin version
struct Version {
std::uint16_t major;
std::uint16_t minor;
std::uint16_t micro;
};

class IPluginData;

/// @brief A base class for implementing LIBDNF5 plugins that introduce additional logic into the library using hooks.
Expand Down
75 changes: 75 additions & 0 deletions include/libdnf5/plugin/plugin_info.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
Copyright Contributors to the libdnf project.
This file is part of li
bdnf: https://github.com/rpm-software-management/libdnf/
Libdnf is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 of the License, or
(at your option) any later version.
Libdnf is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with libdnf. If not, see <https://www.gnu.org/licenses/>.
*/

#ifndef LIBDNF5_PLUGIN_PLUGIN_INFO_HPP
#define LIBDNF5_PLUGIN_PLUGIN_INFO_HPP

#include "plugin_version.hpp"

#include "libdnf5/common/impl_ptr.hpp"
#include "libdnf5/version.hpp"

namespace libdnf5::plugin {

class PluginInfo {
public:
~PluginInfo();

PluginInfo(const PluginInfo & src);
PluginInfo(PluginInfo && src) noexcept;
PluginInfo & operator=(const PluginInfo & src);
PluginInfo & operator=(PluginInfo && src) noexcept;

PluginInfo() = delete;

/// @return the real name of the plugin or derived from the configuration file if the plugin is not loaded
const std::string & get_name() const noexcept;

/// @return true if the plugin is loaded
bool is_loaded() const noexcept;

/// @return the version of the API supported by the plugin, or zeros if the plugin is not loaded
PluginAPIVersion get_api_version() const noexcept;

/// @return the real plugin name (returned from plugin) or nullptr if the plugin is not loaded
const char * get_real_name() const noexcept;

/// @return the version of the plugin, or zeros if the plugin is not loaded
Version get_version() const noexcept;

/// @return a nullptr terminated array of attributes supported by the plugin or nullptr if the plugin is not loaded
const char * const * get_attributes() const noexcept;

/// Gets the value of the attribute from the plugin.
/// Returns nullptr if the attribute does not exist or plugin is not loaded.
/// @return the value of the `name` attribute or nullptr
const char * get_attribute(const char * name) const noexcept;

class Impl;

private:
explicit PluginInfo(Impl & p_impl);

ImplPtr<Impl> p_impl;
};

} // namespace libdnf5::plugin

#endif
36 changes: 36 additions & 0 deletions include/libdnf5/plugin/plugin_version.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
Copyright Contributors to the libdnf project.
This file is part of libdnf: https://github.com/rpm-software-management/libdnf/
Libdnf is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 of the License, or
(at your option) any later version.
Libdnf is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with libdnf. If not, see <https://www.gnu.org/licenses/>.
*/

#ifndef LIBDNF5_PLUGIN_PLUGIN_VERSION_HPP
#define LIBDNF5_PLUGIN_PLUGIN_VERSION_HPP

#include <cstdint>

namespace libdnf5::plugin {

/// Plugin version
struct Version {
std::uint16_t major;
std::uint16_t minor;
std::uint16_t micro;
};

} // namespace libdnf5::plugin

#endif
5 changes: 5 additions & 0 deletions libdnf5/base/base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,11 @@ void Base::enable_disable_plugins(const std::vector<std::string> & plugin_names,
}
}

const std::vector<plugin::PluginInfo> & Base::get_plugins_info() const {
libdnf_user_assert(p_impl->pool, "Base::get_plugins_info must not be called before Base::setup");
return p_impl->get_plugins_info();
}

void Base::setup() {
auto & pool = p_impl->pool;
libdnf_user_assert(!pool, "Base was already initialized");
Expand Down
10 changes: 9 additions & 1 deletion libdnf5/base/base_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ class Base::Impl {

plugin::Plugins & get_plugins() { return plugins; }

std::vector<plugin::PluginInfo> & get_plugins_info() { return plugins_info; }

const std::vector<plugin::PluginInfo> & get_plugins_info() const { return plugins_info; }

/// Call a function that loads the config file, catching errors appropriately
void with_config_file_path(std::function<void(const std::string &)> func);

Expand Down Expand Up @@ -94,6 +98,7 @@ class Base::Impl {

/// map of plugin names (global patterns) that we want to enable (true) or disable (false)
PreserveOrderMap<std::string, bool> plugins_enablement;
std::vector<plugin::PluginInfo> plugins_info;

WeakPtrGuard<LogRouter, false> log_router_guard;
WeakPtrGuard<Vars, false> vars_guard;
Expand All @@ -102,10 +107,13 @@ class Base::Impl {

class InternalBaseUser {
public:
static solv::RpmPool & get_rpm_pool(const libdnf5::BaseWeakPtr & base) { return base->p_impl->get_rpm_pool(); }
static solv::CompsPool & get_comps_pool(const libdnf5::BaseWeakPtr & base) {
return base->p_impl->get_comps_pool();
}

static std::vector<plugin::PluginInfo> & get_plugins_info(Base * base) { return base->p_impl->get_plugins_info(); }

static solv::RpmPool & get_rpm_pool(const libdnf5::BaseWeakPtr & base) { return base->p_impl->get_rpm_pool(); }
};

} // namespace libdnf5
Expand Down
64 changes: 64 additions & 0 deletions libdnf5/plugin/plugin_info.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
Copyright Contributors to the libdnf project.
This file is part of libdnf: https://github.com/rpm-software-management/libdnf/
Libdnf is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 of the License, or
(at your option) any later version.
Libdnf is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with libdnf. If not, see <https://www.gnu.org/licenses/>.
*/

#include "plugin_info_impl.hpp"

namespace libdnf5::plugin {

PluginInfo::PluginInfo(Impl & p_impl) : p_impl{&p_impl} {}

PluginInfo::~PluginInfo() = default;

PluginInfo::PluginInfo(const PluginInfo & src) = default;

PluginInfo::PluginInfo(PluginInfo && src) noexcept = default;

PluginInfo & PluginInfo::operator=(const PluginInfo & src) = default;

PluginInfo & PluginInfo::operator=(PluginInfo && src) noexcept = default;

const std::string & PluginInfo::get_name() const noexcept {
return p_impl->get_name();
}

bool PluginInfo::is_loaded() const noexcept {
return p_impl->is_loaded();
}

PluginAPIVersion PluginInfo::get_api_version() const noexcept {
return p_impl->get_api_version();
}

const char * PluginInfo::get_real_name() const noexcept {
return p_impl->get_real_name();
}

Version PluginInfo::get_version() const noexcept {
return p_impl->get_version();
}

const char * const * PluginInfo::get_attributes() const noexcept {
return p_impl->get_attributes();
}

const char * PluginInfo::get_attribute(const char * name) const noexcept {
return p_impl->get_attribute(name);
}

} // namespace libdnf5::plugin
70 changes: 70 additions & 0 deletions libdnf5/plugin/plugin_info_impl.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
Copyright Contributors to the libdnf project.
This file is part of libdnf: https://github.com/rpm-software-management/libdnf/
Libdnf is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 of the License, or
(at your option) any later version.
Libdnf is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with libdnf. If not, see <https://www.gnu.org/licenses/>.
*/

#ifndef LIBDNF5_PLUGIN_PLUGIN_INFO_IMPL_HPP
#define LIBDNF5_PLUGIN_PLUGIN_INFO_IMPL_HPP

#include "libdnf5/plugin/iplugin.hpp"
#include "libdnf5/plugin/plugin_info.hpp"

namespace libdnf5::plugin {

class PluginInfo::Impl {
public:
static PluginInfo create_plugin_info(std::string name_from_config, const IPlugin * iplugin) {
return PluginInfo(*new Impl(name_from_config, iplugin));
}

Impl() = delete;
Impl(const Impl & src) = default;
Impl(Impl && src) = delete;

~Impl() = default;

Impl & operator=(const Impl & src) = default;
Impl & operator=(Impl &&) = delete;

const std::string & get_name() const noexcept { return name; }

bool is_loaded() const noexcept { return iplugin; }

PluginAPIVersion get_api_version() const noexcept {
return iplugin ? iplugin->get_api_version() : PluginAPIVersion{0, 0};
}

const char * get_real_name() const noexcept { return iplugin ? iplugin->get_name() : nullptr; }

Version get_version() const noexcept { return iplugin ? iplugin->get_version() : Version{0, 0, 0}; }

const char * const * get_attributes() const noexcept { return iplugin ? iplugin->get_attributes() : nullptr; }

const char * get_attribute(const char * name) const noexcept {
return iplugin ? iplugin->get_attribute(name) : nullptr;
}

private:
explicit Impl(std::string name, const IPlugin * iplugin) : name{name}, iplugin{iplugin} {}

std::string name;
const IPlugin * iplugin;
};

} // namespace libdnf5::plugin

#endif
Loading

0 comments on commit ea407b3

Please sign in to comment.