From 9a92f14f2bd3706c0370282e35dc2edb8644223d Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Wed, 6 Sep 2023 11:49:36 +0200 Subject: [PATCH 1/3] [dnf5] Implement new argument "--dump-variables" If dnf5 is run with this argument, variable values are added to standard output. The old DNF4 supports this argument only with the `config-manager` plugin. If the user wants to know the values of the variables with which a certain command will run, he must first use `config-manager` and then run the desired command with the same settings (same environment and configuration files) and hope that nothing changed in between (e.g. thanks to a plugin). This implements part of the functionality of the dnf4 config-manager plugin, but for general use. --- dnf5/include/dnf5/context.hpp | 6 ++++++ dnf5/main.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/dnf5/include/dnf5/context.hpp b/dnf5/include/dnf5/context.hpp index 4dde2f83b..74a1d1ace 100644 --- a/dnf5/include/dnf5/context.hpp +++ b/dnf5/include/dnf5/context.hpp @@ -97,6 +97,11 @@ class Context : public libdnf5::cli::session::Session { bool get_quiet() const { return quiet; } + /// Set to true to print information about variables + void set_dump_variables(bool enable) { this->dump_variables = enable; } + + bool get_dump_variables() const { return dump_variables; } + Plugins & get_plugins() { return *plugins; } libdnf5::Goal * get_goal(bool new_if_not_exist = true); @@ -125,6 +130,7 @@ class Context : public libdnf5::cli::session::Session { const char * comment{nullptr}; bool quiet{false}; + bool dump_variables{false}; std::unique_ptr plugins; std::unique_ptr goal; diff --git a/dnf5/main.cpp b/dnf5/main.cpp index c1165fcc7..235ecc468 100644 --- a/dnf5/main.cpp +++ b/dnf5/main.cpp @@ -507,6 +507,20 @@ void RootCommand::set_argument_parser() { global_options_group->register_argument(debug_solver); } + { + auto dump_variables = parser.add_new_named_arg("dump-variables"); + dump_variables->set_long_name("dump-variables"); + dump_variables->set_description("Print variable values to stdout"); + dump_variables->set_parse_hook_func([&ctx]( + [[maybe_unused]] ArgumentParser::NamedArg * arg, + [[maybe_unused]] const char * option, + [[maybe_unused]] const char * value) { + ctx.set_dump_variables(true); + return true; + }); + global_options_group->register_argument(dump_variables); + } + { auto version = parser.add_new_named_arg("version"); version->set_long_name("version"); @@ -695,6 +709,14 @@ static void print_transaction_size_stats(Context & context) { } } +static void dump_variables(Context & context) { + std::cout << _("======== Variables: ========") << std::endl; + for (const auto & var : context.base.get_vars()->get_variables()) { + const auto & val = var.second; + std::cout << fmt::format("{} = {}", var.first, val.value) << std::endl; + } +} + } // namespace dnf5 @@ -810,6 +832,10 @@ int main(int argc, char * argv[]) try { // Write messages from memory buffer logger to stream logger dynamic_cast(*file_logger).write_to_logger(log_router); + if (context.get_dump_variables()) { + dump_variables(context); + } + auto repo_sack = base.get_repo_sack(); repo_sack->create_repos_from_system_configuration(); any_repos_from_system_configuration = repo_sack->size() > 0; From 16ba885881bc46ab9f8ac3f86dc0fd7a52875432 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Thu, 21 Sep 2023 13:55:16 +0200 Subject: [PATCH 2/3] [dnf5] Allow use of "dnf5 --dump-variables" without command --- dnf5/main.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dnf5/main.cpp b/dnf5/main.cpp index 235ecc468..f9cdc19a1 100644 --- a/dnf5/main.cpp +++ b/dnf5/main.cpp @@ -101,7 +101,7 @@ class RootCommand : public Command { explicit RootCommand(libdnf5::cli::session::Session & context) : Command(context, "dnf5") {} void set_parent_command() override { get_session().set_root_command(*this); } void set_argument_parser() override; - void pre_configure() override { throw_missing_command(); } + void pre_configure() override; }; void RootCommand::set_argument_parser() { @@ -555,6 +555,14 @@ void RootCommand::set_argument_parser() { } } +void RootCommand::pre_configure() { + auto & arg_parser = get_context().get_argument_parser(); + if (arg_parser.get_named_arg("dump-variables", false).get_parse_count() > 0) { + return; + } + throw_missing_command(); +} + static void add_commands(Context & context) { // First, add the "root" command. context.add_and_initialize_command(std::make_unique(context)); From 13c21d29b8397bc9732e66f3e85ced0a735c6437 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Thu, 21 Sep 2023 14:15:20 +0200 Subject: [PATCH 3/3] [dnf5] Document "--dump-variables" --- doc/dnf5.8.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/dnf5.8.rst b/doc/dnf5.8.rst index 128d08d0e..057a6f6b1 100644 --- a/doc/dnf5.8.rst +++ b/doc/dnf5.8.rst @@ -175,6 +175,9 @@ Following options are applicable in the general context for any ``dnf5`` command | This is a list option which can be specified multiple times. | Accepted values are ids, or a glob of ids. +``--dump-variables`` + | Print variable values to stdout. + ``--enable-plugin=PLUGIN_NAME,...`` | Enable specified plugins for the purpose of the current ``DNF5`` command. | This is a list option which can be specified multiple times.