diff --git a/SOURCES/0001-Add-module-enable-disable-reset-command.patch b/SOURCES/0001-Add-module-enable-disable-reset-command.patch new file mode 100644 index 0000000..f53eee7 --- /dev/null +++ b/SOURCES/0001-Add-module-enable-disable-reset-command.patch @@ -0,0 +1,997 @@ +From fa7e624c50dbfc0e47c0466e47f2f6acd20a6dff Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Fri, 30 Oct 2020 13:45:17 +0100 +Subject: [PATCH 1/5] Add subcommands support + +Plugins with a '_' character in command name will implement subcommands. +Needed for modularity subcommands. +E.g. the "command_module_enable" plugin will implement the "enable" +subcommand of the "module" command. +--- + dnf/dnf-main.c | 96 +++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 76 insertions(+), 20 deletions(-) + +diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c +index b6a5a69..6cb8c0e 100644 +--- a/dnf/dnf-main.c ++++ b/dnf/dnf-main.c +@@ -305,6 +305,33 @@ new_global_opt_group (DnfContext *ctx) + return opt_grp; + } + ++/* ++ * The first non-option is the command/subcommand. ++ * Get it and remove it from arguments. ++ */ ++static const gchar * ++get_command (int *argc, ++ char *argv[]) ++{ ++ const gchar *cmd_name = NULL; ++ for (gint in = 1; in < *argc; in++) ++ { ++ if (cmd_name != NULL) ++ argv[in-1] = argv[in]; ++ else if (argv[in][0] != '-') ++ cmd_name = argv[in]; ++ } ++ if (cmd_name != NULL) --*argc; ++ return cmd_name; ++} ++ ++static gint ++compare_strings (gconstpointer a, ++ gconstpointer b) ++{ ++ return strcmp (a, b); ++} ++ + int + main (int argc, + char *argv[]) +@@ -316,6 +343,7 @@ main (int argc, + g_autoptr(GOptionContext) opt_ctx = g_option_context_new ("COMMAND"); + g_autoptr(GOptionContext) subcmd_opt_ctx = NULL; + g_autofree gchar *subcmd_opt_param = NULL; ++ GSList *cmds_with_subcmds = NULL; /* list of commands with subcommands */ + + setlocale (LC_ALL, ""); + +@@ -353,11 +381,26 @@ main (int argc, + if (!peas_engine_load_plugin (engine, info)) + continue; + if (peas_engine_provides_extension (engine, info, DNF_TYPE_COMMAND)) +- /* +- * At least 2 spaces between the command and its description are needed +- * so that help2man formats it correctly. +- */ +- g_string_append_printf (cmd_summary, "\n %-16s %s", peas_plugin_info_get_name (info), peas_plugin_info_get_description (info)); ++ { ++ g_autofree gchar *command_name = g_strdup (peas_plugin_info_get_name (info)); ++ ++ /* Plugins with a '_' character in command name implement subcommands. ++ E.g. the "command_module_enable" plugin implements the "enable" subcommand of the "module" command. */ ++ for (gchar *ptr = command_name; *ptr != '\0'; ++ptr) ++ { ++ if (*ptr == '_') ++ { ++ *ptr = ' '; ++ cmds_with_subcmds = g_slist_append (cmds_with_subcmds, g_strndup (command_name, ptr - command_name)); ++ break; ++ } ++ } ++ /* ++ * At least 2 spaces between the command and its description are needed ++ * so that help2man formats it correctly. ++ */ ++ g_string_append_printf (cmd_summary, "\n %-16s %s", command_name, peas_plugin_info_get_description (info)); ++ } + } + g_option_context_set_summary (opt_ctx, cmd_summary->str); + g_string_free (cmd_summary, TRUE); +@@ -471,19 +514,7 @@ main (int argc, + } + } + +- /* +- * The first non-option is the command. +- * Get it and remove it from arguments. +- */ +- const gchar *cmd_name = NULL; +- for (gint in = 1; in < argc; in++) +- { +- if (cmd_name != NULL) +- argv[in-1] = argv[in]; +- else if (argv[in][0] != '-') +- cmd_name = argv[in]; +- } +- if (cmd_name != NULL) --argc; ++ const gchar *cmd_name = get_command (&argc, argv); + + g_option_context_set_help_enabled (opt_ctx, TRUE); + +@@ -500,10 +531,25 @@ main (int argc, + + PeasPluginInfo *plug = NULL; + PeasExtension *exten = NULL; +- if (cmd_name != NULL) ++ const gchar *subcmd_name = NULL; ++ gboolean with_subcmds = FALSE; ++ ++ /* Find the plugin that implements the command cmd_name or its subcommand. ++ * Command name (cmd_name) can not contain '_' character. It is reserved for subcomands. */ ++ if (cmd_name != NULL && strchr(cmd_name, '_') == NULL) + { ++ with_subcmds = g_slist_find_custom (cmds_with_subcmds, cmd_name, compare_strings) != NULL; + g_autofree gchar *mod_name = g_strdup_printf ("command_%s", cmd_name); + plug = peas_engine_get_plugin_info (engine, mod_name); ++ if (plug == NULL && with_subcmds) ++ { ++ subcmd_name = get_command (&argc, argv); ++ if (subcmd_name != NULL) ++ { ++ g_autofree gchar *submod_name = g_strdup_printf ("command_%s_%s", cmd_name, subcmd_name); ++ plug = peas_engine_get_plugin_info (engine, submod_name); ++ } ++ } + if (plug != NULL) + exten = peas_extension_set_get_extension (cmd_exts, plug); + } +@@ -513,10 +559,18 @@ main (int argc, + error = g_error_new_literal (G_IO_ERROR, + G_IO_ERROR_FAILED, + "No command specified"); +- else ++ else if (!with_subcmds) + error = g_error_new (G_IO_ERROR, + G_IO_ERROR_FAILED, + "Unknown command: '%s'", cmd_name); ++ else if (subcmd_name) ++ error = g_error_new (G_IO_ERROR, ++ G_IO_ERROR_FAILED, ++ "Unknown subcommand: '%s'", subcmd_name); ++ else ++ error = g_error_new (G_IO_ERROR, ++ G_IO_ERROR_FAILED, ++ "Missing subcommand for command: '%s'", cmd_name); + + g_autofree gchar *help = g_option_context_get_help (opt_ctx, TRUE, NULL); + g_printerr ("This is microdnf, which implements subset of `dnf'.\n" +@@ -533,6 +587,8 @@ main (int argc, + goto out; + + out: ++ g_slist_free_full(cmds_with_subcmds, g_free); ++ + if (error != NULL) + { + const gchar *prefix = ""; +-- +2.26.2 + + +From 88a2b95ebdc424091b93c381623bdb458a368b48 Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Fri, 30 Oct 2020 14:16:34 +0100 +Subject: [PATCH 2/5] Add "module enable" command + +--- + dnf/CMakeLists.txt | 9 +- + dnf/meson.build | 9 ++ + .../module_enable/dnf-command-module_enable.c | 97 +++++++++++++++++++ + .../dnf-command-module_enable.gresource.xml | 6 ++ + .../module_enable/dnf-command-module_enable.h | 33 +++++++ + .../module_enable/module_enable.plugin | 9 ++ + microdnf.spec | 2 +- + 7 files changed, 163 insertions(+), 2 deletions(-) + create mode 100644 dnf/plugins/module_enable/dnf-command-module_enable.c + create mode 100644 dnf/plugins/module_enable/dnf-command-module_enable.gresource.xml + create mode 100644 dnf/plugins/module_enable/dnf-command-module_enable.h + create mode 100644 dnf/plugins/module_enable/module_enable.plugin + +diff --git a/dnf/CMakeLists.txt b/dnf/CMakeLists.txt +index 0705390..b673ce4 100644 +--- a/dnf/CMakeLists.txt ++++ b/dnf/CMakeLists.txt +@@ -35,6 +35,12 @@ glib_compile_resources (DNF_COMMAND_CLEAN plugins/clean/dnf-command-clean.gresou + INTERNAL) + list (APPEND DNF_COMMAND_CLEAN "plugins/clean/dnf-command-clean.c") + ++glib_compile_resources (DNF_COMMAND_MODULE_ENABLE plugins/module_enable/dnf-command-module_enable.gresource.xml ++ C_PREFIX dnf_command_module_enable ++ INTERNAL) ++list (APPEND DNF_COMMAND_MODULE_ENABLE "plugins/module_enable/dnf-command-module_enable.c") ++ ++ + include_directories (${CMAKE_CURRENT_SOURCE_DIR}) + add_executable (microdnf dnf-main.c ${DNF_SRCS} + ${DNF_COMMAND_INSTALL} +@@ -43,7 +49,8 @@ add_executable (microdnf dnf-main.c ${DNF_SRCS} + ${DNF_COMMAND_UPDATE} + ${DNF_COMMAND_REPOLIST} + ${DNF_COMMAND_REPOQUERY} +- ${DNF_COMMAND_CLEAN}) ++ ${DNF_COMMAND_CLEAN} ++ ${DNF_COMMAND_MODULE_ENABLE}) + + target_link_libraries (microdnf + ${GLIB_LIBRARIES} +diff --git a/dnf/meson.build b/dnf/meson.build +index 12e11ac..d617453 100644 +--- a/dnf/meson.build ++++ b/dnf/meson.build +@@ -65,6 +65,15 @@ microdnf_srcs = [ + source_dir : 'plugins/clean', + ), + 'plugins/clean/dnf-command-clean.c', ++ ++ # module enable ++ gnome.compile_resources( ++ 'dnf-module_enable', ++ 'plugins/module_enable/dnf-command-module_enable.gresource.xml', ++ c_name : 'dnf_command_module_enable', ++ source_dir : 'plugins/module_enable', ++ ), ++ 'plugins/module_enable/dnf-command-module_enable.c', + ] + + microdnf = executable( +diff --git a/dnf/plugins/module_enable/dnf-command-module_enable.c b/dnf/plugins/module_enable/dnf-command-module_enable.c +new file mode 100644 +index 0000000..3081042 +--- /dev/null ++++ b/dnf/plugins/module_enable/dnf-command-module_enable.c +@@ -0,0 +1,97 @@ ++/* ++ * Copyright (C) 2020 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library 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. ++ * ++ * This library 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 this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include "dnf-command-module_enable.h" ++#include "dnf-utils.h" ++ ++struct _DnfCommandModuleEnable ++{ ++ PeasExtensionBase parent_instance; ++}; ++ ++static void dnf_command_module_enable_iface_init (DnfCommandInterface *iface); ++ ++G_DEFINE_DYNAMIC_TYPE_EXTENDED (DnfCommandModuleEnable, ++ dnf_command_module_enable, ++ PEAS_TYPE_EXTENSION_BASE, ++ 0, ++ G_IMPLEMENT_INTERFACE (DNF_TYPE_COMMAND, ++ dnf_command_module_enable_iface_init)) ++ ++static void ++dnf_command_module_enable_init (DnfCommandModuleEnable *self) ++{ ++} ++ ++static gboolean ++dnf_command_module_enable_run (DnfCommand *cmd, ++ int argc, ++ char *argv[], ++ GOptionContext *opt_ctx, ++ DnfContext *ctx, ++ GError **error) ++{ ++ g_auto(GStrv) pkgs = NULL; ++ const GOptionEntry opts[] = { ++ { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &pkgs, NULL, NULL }, ++ { NULL } ++ }; ++ g_option_context_add_main_entries (opt_ctx, opts, NULL); ++ ++ if (!g_option_context_parse (opt_ctx, &argc, &argv, error)) ++ return FALSE; ++ ++ if (pkgs == NULL) ++ { ++ g_set_error_literal (error, ++ G_IO_ERROR, ++ G_IO_ERROR_FAILED, ++ "Modules are not specified"); ++ return FALSE; ++ } ++ ++ return dnf_context_enable_modules (ctx, (const char **)pkgs, error); ++} ++ ++static void ++dnf_command_module_enable_class_init (DnfCommandModuleEnableClass *klass) ++{ ++} ++ ++static void ++dnf_command_module_enable_iface_init (DnfCommandInterface *iface) ++{ ++ iface->run = dnf_command_module_enable_run; ++} ++ ++static void ++dnf_command_module_enable_class_finalize (DnfCommandModuleEnableClass *klass) ++{ ++} ++ ++G_MODULE_EXPORT void ++dnf_command_module_enable_register_types (PeasObjectModule *module) ++{ ++ dnf_command_module_enable_register_type (G_TYPE_MODULE (module)); ++ ++ peas_object_module_register_extension_type (module, ++ DNF_TYPE_COMMAND, ++ DNF_TYPE_COMMAND_MODULE_ENABLE); ++} +diff --git a/dnf/plugins/module_enable/dnf-command-module_enable.gresource.xml b/dnf/plugins/module_enable/dnf-command-module_enable.gresource.xml +new file mode 100644 +index 0000000..4b99047 +--- /dev/null ++++ b/dnf/plugins/module_enable/dnf-command-module_enable.gresource.xml +@@ -0,0 +1,6 @@ ++ ++ ++ ++ module_enable.plugin ++ ++ +diff --git a/dnf/plugins/module_enable/dnf-command-module_enable.h b/dnf/plugins/module_enable/dnf-command-module_enable.h +new file mode 100644 +index 0000000..d489331 +--- /dev/null ++++ b/dnf/plugins/module_enable/dnf-command-module_enable.h +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (C) 2020 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library 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. ++ * ++ * This library 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 this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#pragma once ++ ++#include "dnf-command.h" ++#include ++ ++G_BEGIN_DECLS ++ ++#define DNF_TYPE_COMMAND_MODULE_ENABLE dnf_command_module_enable_get_type () ++G_DECLARE_FINAL_TYPE (DnfCommandModuleEnable, dnf_command_module_enable, DNF, COMMAND_MODULE_ENABLE, PeasExtensionBase) ++ ++G_MODULE_EXPORT void dnf_command_module_enable_register_types (PeasObjectModule *module); ++ ++G_END_DECLS +diff --git a/dnf/plugins/module_enable/module_enable.plugin b/dnf/plugins/module_enable/module_enable.plugin +new file mode 100644 +index 0000000..91da9fb +--- /dev/null ++++ b/dnf/plugins/module_enable/module_enable.plugin +@@ -0,0 +1,9 @@ ++[Plugin] ++Module = command_module_enable ++Embedded = dnf_command_module_enable_register_types ++Name = module_enable ++Description = Enable a module stream ++Authors = Jaroslav Rohel ++License = GPL-3.0+ ++Copyright = Copyright (C) 2020 Red Hat, Inc. ++X-Command-Syntax = module enable module-spec [module-spec…] +diff --git a/microdnf.spec b/microdnf.spec +index db8e35e..3648e46 100644 +--- a/microdnf.spec ++++ b/microdnf.spec +@@ -1,4 +1,4 @@ +-%global libdnf_version 0.43.1 ++%global libdnf_version 0.55.0 + + Name: microdnf + Version: 3.4.0 +-- +2.26.2 + + +From 7cc7bb7202cb79d6bb6daa63e32109134c273627 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Fri, 23 Oct 2020 16:04:48 +0200 +Subject: [PATCH 3/5] Add reports of module changes + +--- + dnf/dnf-utils.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/dnf/dnf-utils.c b/dnf/dnf-utils.c +index c58f519..5984f22 100644 +--- a/dnf/dnf-utils.c ++++ b/dnf/dnf-utils.c +@@ -68,8 +68,15 @@ dnf_utils_print_transaction (DnfContext *ctx) + + if (pkgs->len == 0) + { +- g_print ("Nothing to do.\n"); +- return FALSE; ++ g_autofree char * report = dnf_context_get_module_report (ctx); ++ if (report) ++ { ++ g_print ("%s\n", report); ++ return TRUE; ++ } else { ++ g_print ("Nothing to do.\n"); ++ return FALSE; ++ } + } + + struct libscols_line *ln; +@@ -147,6 +154,11 @@ dnf_utils_print_transaction (DnfContext *ctx) + g_print (" %-15s %4d packages\n", "Removing:", pkgs_remove->len); + g_print (" %-15s %4d packages\n", "Downgrading:", pkgs_downgrade->len); + ++ g_autofree char * report = dnf_context_get_module_report (ctx); ++ if (report) ++ { ++ g_print ("%s\n", report); ++ } + /* check for test mode */ + DnfTransaction *txn = dnf_context_get_transaction (ctx); + if (dnf_transaction_get_flags (txn) & DNF_TRANSACTION_FLAG_TEST) +-- +2.26.2 + + +From 6c4dceac5012231923187c3bbb16de4bda23789c Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Mon, 2 Nov 2020 12:05:01 +0100 +Subject: [PATCH 4/5] Allow to commit module changes and report module switch + as an error + +--- + .../module_enable/dnf-command-module_enable.c | 28 ++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +diff --git a/dnf/plugins/module_enable/dnf-command-module_enable.c b/dnf/plugins/module_enable/dnf-command-module_enable.c +index 3081042..a5a4701 100644 +--- a/dnf/plugins/module_enable/dnf-command-module_enable.c ++++ b/dnf/plugins/module_enable/dnf-command-module_enable.c +@@ -67,7 +67,33 @@ dnf_command_module_enable_run (DnfCommand *cmd, + return FALSE; + } + +- return dnf_context_enable_modules (ctx, (const char **)pkgs, error); ++ if (!dnf_context_module_enable (ctx, (const char **)pkgs, error)) ++ { ++ return FALSE; ++ } ++ if (!dnf_context_module_switched_check (ctx, error)) ++ { ++ return FALSE; ++ } ++ ++ if (!dnf_goal_depsolve (dnf_context_get_goal (ctx), DNF_NONE, error)) ++ { ++ if (g_error_matches (*error, DNF_ERROR, DNF_ERROR_NO_PACKAGES_TO_UPDATE)) ++ { ++ g_clear_error (error); ++ } else { ++ return FALSE; ++ } ++ } ++ if (!dnf_utils_print_transaction (ctx)) ++ { ++ return TRUE; ++ } ++ if (!dnf_context_run (ctx, NULL, error)) ++ { ++ return FALSE; ++ } ++ return TRUE; + } + + static void +-- +2.26.2 + + +From 6c86306c9c0725c73c3d4ec704f932e372e09585 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Mon, 2 Nov 2020 15:17:29 +0100 +Subject: [PATCH 5/5] Add module enable and disable commands + +--- + dnf/CMakeLists.txt | 14 +- + dnf/meson.build | 18 +++ + .../dnf-command-module_disable.c | 119 +++++++++++++++++ + .../dnf-command-module_disable.gresource.xml | 6 + + .../dnf-command-module_disable.h | 33 +++++ + .../module_disable/module_disable.plugin | 9 ++ + .../module_reset/dnf-command-module_reset.c | 123 ++++++++++++++++++ + .../dnf-command-module_reset.gresource.xml | 6 + + .../module_reset/dnf-command-module_reset.h | 33 +++++ + dnf/plugins/module_reset/module_reset.plugin | 9 ++ + 10 files changed, 369 insertions(+), 1 deletion(-) + create mode 100644 dnf/plugins/module_disable/dnf-command-module_disable.c + create mode 100644 dnf/plugins/module_disable/dnf-command-module_disable.gresource.xml + create mode 100644 dnf/plugins/module_disable/dnf-command-module_disable.h + create mode 100644 dnf/plugins/module_disable/module_disable.plugin + create mode 100644 dnf/plugins/module_reset/dnf-command-module_reset.c + create mode 100644 dnf/plugins/module_reset/dnf-command-module_reset.gresource.xml + create mode 100644 dnf/plugins/module_reset/dnf-command-module_reset.h + create mode 100644 dnf/plugins/module_reset/module_reset.plugin + +diff --git a/dnf/CMakeLists.txt b/dnf/CMakeLists.txt +index b673ce4..1d640be 100644 +--- a/dnf/CMakeLists.txt ++++ b/dnf/CMakeLists.txt +@@ -40,6 +40,16 @@ glib_compile_resources (DNF_COMMAND_MODULE_ENABLE plugins/module_enable/dnf-comm + INTERNAL) + list (APPEND DNF_COMMAND_MODULE_ENABLE "plugins/module_enable/dnf-command-module_enable.c") + ++glib_compile_resources (DNF_COMMAND_MODULE_DISABLE plugins/module_disable/dnf-command-module_disable.gresource.xml ++ C_PREFIX dnf_command_module_disable ++ INTERNAL) ++list (APPEND DNF_COMMAND_MODULE_DISABLE "plugins/module_disable/dnf-command-module_disable.c") ++ ++glib_compile_resources (DNF_COMMAND_MODULE_RESET plugins/module_reset/dnf-command-module_reset.gresource.xml ++ C_PREFIX dnf_command_module_reset ++ INTERNAL) ++list (APPEND DNF_COMMAND_MODULE_RESET "plugins/module_reset/dnf-command-module_reset.c") ++ + + include_directories (${CMAKE_CURRENT_SOURCE_DIR}) + add_executable (microdnf dnf-main.c ${DNF_SRCS} +@@ -50,7 +60,9 @@ add_executable (microdnf dnf-main.c ${DNF_SRCS} + ${DNF_COMMAND_REPOLIST} + ${DNF_COMMAND_REPOQUERY} + ${DNF_COMMAND_CLEAN} +- ${DNF_COMMAND_MODULE_ENABLE}) ++ ${DNF_COMMAND_MODULE_ENABLE} ++ ${DNF_COMMAND_MODULE_DISABLE} ++ ${DNF_COMMAND_MODULE_RESET}) + + target_link_libraries (microdnf + ${GLIB_LIBRARIES} +diff --git a/dnf/meson.build b/dnf/meson.build +index d617453..b456202 100644 +--- a/dnf/meson.build ++++ b/dnf/meson.build +@@ -74,6 +74,24 @@ microdnf_srcs = [ + source_dir : 'plugins/module_enable', + ), + 'plugins/module_enable/dnf-command-module_enable.c', ++ ++ # module disable ++ gnome.compile_resources( ++ 'dnf-module_disable', ++ 'plugins/module_disable/dnf-command-module_disable.gresource.xml', ++ c_name : 'dnf_command_module_disable', ++ source_dir : 'plugins/module_disable', ++ ), ++ 'plugins/module_disable/dnf-command-module_disable.c', ++ ++ # module reset ++ gnome.compile_resources( ++ 'dnf-module_reset', ++ 'plugins/module_reset/dnf-command-module_reset.gresource.xml', ++ c_name : 'dnf_command_module_reset', ++ source_dir : 'plugins/module_reset', ++ ), ++ 'plugins/module_reset/dnf-command-module_reset.c', + ] + + microdnf = executable( +diff --git a/dnf/plugins/module_disable/dnf-command-module_disable.c b/dnf/plugins/module_disable/dnf-command-module_disable.c +new file mode 100644 +index 0000000..eedb77c +--- /dev/null ++++ b/dnf/plugins/module_disable/dnf-command-module_disable.c +@@ -0,0 +1,119 @@ ++/* ++ * Copyright (C) 2020 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library 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. ++ * ++ * This library 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 this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include "dnf-command-module_disable.h" ++#include "dnf-utils.h" ++ ++struct _DnfCommandModuleDisable ++{ ++ PeasExtensionBase parent_instance; ++}; ++ ++static void dnf_command_module_disable_iface_init (DnfCommandInterface *iface); ++ ++G_DEFINE_DYNAMIC_TYPE_EXTENDED (DnfCommandModuleDisable, ++ dnf_command_module_disable, ++ PEAS_TYPE_EXTENSION_BASE, ++ 0, ++ G_IMPLEMENT_INTERFACE (DNF_TYPE_COMMAND, ++ dnf_command_module_disable_iface_init)) ++ ++static void ++dnf_command_module_disable_init (DnfCommandModuleDisable *self) ++{ ++} ++ ++static gboolean ++dnf_command_module_disable_run (DnfCommand *cmd, ++ int argc, ++ char *argv[], ++ GOptionContext *opt_ctx, ++ DnfContext *ctx, ++ GError **error) ++{ ++ g_auto(GStrv) pkgs = NULL; ++ const GOptionEntry opts[] = { ++ { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &pkgs, NULL, NULL }, ++ { NULL } ++ }; ++ g_option_context_add_main_entries (opt_ctx, opts, NULL); ++ ++ if (!g_option_context_parse (opt_ctx, &argc, &argv, error)) ++ return FALSE; ++ ++ if (pkgs == NULL) ++ { ++ g_set_error_literal (error, ++ G_IO_ERROR, ++ G_IO_ERROR_FAILED, ++ "Modules are not specified"); ++ return FALSE; ++ } ++ ++ if (!dnf_context_module_disable (ctx, (const char **)pkgs, error)) ++ { ++ return FALSE; ++ } ++ ++ if (!dnf_goal_depsolve (dnf_context_get_goal (ctx), DNF_NONE, error)) ++ { ++ if (g_error_matches (*error, DNF_ERROR, DNF_ERROR_NO_PACKAGES_TO_UPDATE)) ++ { ++ g_clear_error (error); ++ } else { ++ return FALSE; ++ } ++ } ++ if (!dnf_utils_print_transaction (ctx)) ++ { ++ return TRUE; ++ } ++ if (!dnf_context_run (ctx, NULL, error)) ++ { ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++static void ++dnf_command_module_disable_class_init (DnfCommandModuleDisableClass *klass) ++{ ++} ++ ++static void ++dnf_command_module_disable_iface_init (DnfCommandInterface *iface) ++{ ++ iface->run = dnf_command_module_disable_run; ++} ++ ++static void ++dnf_command_module_disable_class_finalize (DnfCommandModuleDisableClass *klass) ++{ ++} ++ ++G_MODULE_EXPORT void ++dnf_command_module_disable_register_types (PeasObjectModule *module) ++{ ++ dnf_command_module_disable_register_type (G_TYPE_MODULE (module)); ++ ++ peas_object_module_register_extension_type (module, ++ DNF_TYPE_COMMAND, ++ DNF_TYPE_COMMAND_MODULE_DISABLE); ++} +diff --git a/dnf/plugins/module_disable/dnf-command-module_disable.gresource.xml b/dnf/plugins/module_disable/dnf-command-module_disable.gresource.xml +new file mode 100644 +index 0000000..50a1295 +--- /dev/null ++++ b/dnf/plugins/module_disable/dnf-command-module_disable.gresource.xml +@@ -0,0 +1,6 @@ ++ ++ ++ ++ module_disable.plugin ++ ++ +diff --git a/dnf/plugins/module_disable/dnf-command-module_disable.h b/dnf/plugins/module_disable/dnf-command-module_disable.h +new file mode 100644 +index 0000000..55f1786 +--- /dev/null ++++ b/dnf/plugins/module_disable/dnf-command-module_disable.h +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (C) 2020 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library 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. ++ * ++ * This library 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 this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#pragma once ++ ++#include "dnf-command.h" ++#include ++ ++G_BEGIN_DECLS ++ ++#define DNF_TYPE_COMMAND_MODULE_DISABLE dnf_command_module_disable_get_type () ++G_DECLARE_FINAL_TYPE (DnfCommandModuleDisable, dnf_command_module_disable, DNF, COMMAND_MODULE_DISABLE, PeasExtensionBase) ++ ++G_MODULE_EXPORT void dnf_command_module_disable_register_types (PeasObjectModule *module); ++ ++G_END_DECLS +diff --git a/dnf/plugins/module_disable/module_disable.plugin b/dnf/plugins/module_disable/module_disable.plugin +new file mode 100644 +index 0000000..fc1d912 +--- /dev/null ++++ b/dnf/plugins/module_disable/module_disable.plugin +@@ -0,0 +1,9 @@ ++[Plugin] ++Module = command_module_disable ++Embedded = dnf_command_module_disable_register_types ++Name = module_disable ++Description = Disable a module stream ++Authors = Jaroslav Mracek ++License = GPL-3.0+ ++Copyright = Copyright (C) 2020 Red Hat, Inc. ++X-Command-Syntax = module disable module-spec [module-spec…] +diff --git a/dnf/plugins/module_reset/dnf-command-module_reset.c b/dnf/plugins/module_reset/dnf-command-module_reset.c +new file mode 100644 +index 0000000..912c53e +--- /dev/null ++++ b/dnf/plugins/module_reset/dnf-command-module_reset.c +@@ -0,0 +1,123 @@ ++/* ++ * Copyright (C) 2020 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library 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. ++ * ++ * This library 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 this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include "dnf-command-module_reset.h" ++#include "dnf-utils.h" ++ ++struct _DnfCommandModuleReset ++{ ++ PeasExtensionBase parent_instance; ++}; ++ ++static void dnf_command_module_reset_iface_init (DnfCommandInterface *iface); ++ ++G_DEFINE_DYNAMIC_TYPE_EXTENDED (DnfCommandModuleReset, ++ dnf_command_module_reset, ++ PEAS_TYPE_EXTENSION_BASE, ++ 0, ++ G_IMPLEMENT_INTERFACE (DNF_TYPE_COMMAND, ++ dnf_command_module_reset_iface_init)) ++ ++static void ++dnf_command_module_reset_init (DnfCommandModuleReset *self) ++{ ++} ++ ++static gboolean ++dnf_command_module_reset_run (DnfCommand *cmd, ++ int argc, ++ char *argv[], ++ GOptionContext *opt_ctx, ++ DnfContext *ctx, ++ GError **error) ++{ ++ g_auto(GStrv) pkgs = NULL; ++ const GOptionEntry opts[] = { ++ { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &pkgs, NULL, NULL }, ++ { NULL } ++ }; ++ g_option_context_add_main_entries (opt_ctx, opts, NULL); ++ ++ if (!g_option_context_parse (opt_ctx, &argc, &argv, error)) ++ return FALSE; ++ ++ if (pkgs == NULL) ++ { ++ g_set_error_literal (error, ++ G_IO_ERROR, ++ G_IO_ERROR_FAILED, ++ "Modules are not specified"); ++ return FALSE; ++ } ++ ++ if (!dnf_context_module_reset (ctx, (const char **)pkgs, error)) ++ { ++ return FALSE; ++ } ++ if (!dnf_context_module_switched_check (ctx, error)) ++ { ++ return FALSE; ++ } ++ ++ if (!dnf_goal_depsolve (dnf_context_get_goal (ctx), DNF_NONE, error)) ++ { ++ if (g_error_matches (*error, DNF_ERROR, DNF_ERROR_NO_PACKAGES_TO_UPDATE)) ++ { ++ g_clear_error (error); ++ } else { ++ return FALSE; ++ } ++ } ++ if (!dnf_utils_print_transaction (ctx)) ++ { ++ return TRUE; ++ } ++ if (!dnf_context_run (ctx, NULL, error)) ++ { ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++static void ++dnf_command_module_reset_class_init (DnfCommandModuleResetClass *klass) ++{ ++} ++ ++static void ++dnf_command_module_reset_iface_init (DnfCommandInterface *iface) ++{ ++ iface->run = dnf_command_module_reset_run; ++} ++ ++static void ++dnf_command_module_reset_class_finalize (DnfCommandModuleResetClass *klass) ++{ ++} ++ ++G_MODULE_EXPORT void ++dnf_command_module_reset_register_types (PeasObjectModule *module) ++{ ++ dnf_command_module_reset_register_type (G_TYPE_MODULE (module)); ++ ++ peas_object_module_register_extension_type (module, ++ DNF_TYPE_COMMAND, ++ DNF_TYPE_COMMAND_MODULE_RESET); ++} +diff --git a/dnf/plugins/module_reset/dnf-command-module_reset.gresource.xml b/dnf/plugins/module_reset/dnf-command-module_reset.gresource.xml +new file mode 100644 +index 0000000..27e3b15 +--- /dev/null ++++ b/dnf/plugins/module_reset/dnf-command-module_reset.gresource.xml +@@ -0,0 +1,6 @@ ++ ++ ++ ++ module_reset.plugin ++ ++ +diff --git a/dnf/plugins/module_reset/dnf-command-module_reset.h b/dnf/plugins/module_reset/dnf-command-module_reset.h +new file mode 100644 +index 0000000..65dcd47 +--- /dev/null ++++ b/dnf/plugins/module_reset/dnf-command-module_reset.h +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (C) 2020 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library 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. ++ * ++ * This library 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 this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#pragma once ++ ++#include "dnf-command.h" ++#include ++ ++G_BEGIN_DECLS ++ ++#define DNF_TYPE_COMMAND_MODULE_RESET dnf_command_module_reset_get_type () ++G_DECLARE_FINAL_TYPE (DnfCommandModuleReset, dnf_command_module_reset, DNF, COMMAND_MODULE_RESET, PeasExtensionBase) ++ ++G_MODULE_EXPORT void dnf_command_module_reset_register_types (PeasObjectModule *module); ++ ++G_END_DECLS +diff --git a/dnf/plugins/module_reset/module_reset.plugin b/dnf/plugins/module_reset/module_reset.plugin +new file mode 100644 +index 0000000..c680f08 +--- /dev/null ++++ b/dnf/plugins/module_reset/module_reset.plugin +@@ -0,0 +1,9 @@ ++[Plugin] ++Module = command_module_reset ++Embedded = dnf_command_module_reset_register_types ++Name = module_reset ++Description = Reset a module stream ++Authors = Jaroslav Mracek ++License = GPL-3.0+ ++Copyright = Copyright (C) 2020 Red Hat, Inc. ++X-Command-Syntax = module reset module-spec [module-spec…] +-- +2.26.2 + diff --git a/SPECS/microdnf.spec b/SPECS/microdnf.spec index fde7f12..7a01da1 100644 --- a/SPECS/microdnf.spec +++ b/SPECS/microdnf.spec @@ -2,12 +2,13 @@ Name: microdnf Version: 3.4.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Minimal C implementation of DNF License: GPLv3+ URL: https://github.com/rpm-software-management/microdnf Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Patch0: 0001-Add-module-enable-disable-reset-command.patch BuildRequires: gcc BuildRequires: meson >= 0.36.0 @@ -53,6 +54,9 @@ capabilities are intentionally not implemented in Micro DNF. %{_bindir}/%{name} %changelog +* Fri Jan 15 2021 Nicola Sella - 3.4.0-2 +- Patch: Add module enable/disable/reset command + * Mon Apr 06 2020 Ales Matej - 3.4.0-1 - Update to 3.4.0 - Fix: do not download metadata in remove command