From e588234b3aa4c7c20d9a7e4d67817c7abb47acf8 Mon Sep 17 00:00:00 2001
From: Jan Kolarik <jkolarik@redhat.com>
Date: Tue, 17 Oct 2023 13:48:13 +0000
Subject: [PATCH 1/4] repo: Load filelists based on the configuration

Prepare libdnf to not load the filelists metadata by default in the future.
They will be loaded only when requested through the `optional_metadata_types`
configuration option.
---
 libdnf/repo/Repo.cpp | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp
index 28bcf0b30..73a3d7b42 100644
--- a/libdnf/repo/Repo.cpp
+++ b/libdnf/repo/Repo.cpp
@@ -432,12 +432,18 @@ std::string Repo::getMetadataContent(const std::string &metadataType)
 std::unique_ptr<LrHandle> Repo::Impl::lrHandleInitBase()
 {
     std::unique_ptr<LrHandle> h(lr_handle_init());
-    std::vector<const char *> dlist = {MD_TYPE_PRIMARY, MD_TYPE_FILELISTS, MD_TYPE_PRESTODELTA,
-        MD_TYPE_GROUP_GZ, MD_TYPE_UPDATEINFO};
+    std::vector<const char *> dlist = {MD_TYPE_PRIMARY, MD_TYPE_PRESTODELTA, MD_TYPE_GROUP_GZ, MD_TYPE_UPDATEINFO};
+
+    auto & optionalMetadataTypes = conf->getMainConfig().optional_metadata_types().getValue();
+    auto loadFilelists = std::find(optionalMetadataTypes.begin(), optionalMetadataTypes.end(), "filelists") !=
+                         optionalMetadataTypes.end();
 
 #ifdef MODULEMD
     dlist.push_back(MD_TYPE_MODULES);
 #endif
+    if (loadFilelists) {
+        dlist.push_back(MD_TYPE_FILELISTS);
+    }
     if (loadMetadataOther) {
         dlist.push_back(MD_TYPE_OTHER);
     }

From 3cfe9d7bbdbe6d9d3206f598ea3bb65ee3eb5e77 Mon Sep 17 00:00:00 2001
From: Jan Kolarik <jkolarik@redhat.com>
Date: Fri, 20 Oct 2023 07:09:28 +0000
Subject: [PATCH 2/4] config: Add optional_metadata_types option

A new optional_metadata_types option was created to be used for configuring if filelists metadata should be downloaded by default.
---
 libdnf/conf/ConfigMain.cpp | 4 ++++
 libdnf/conf/ConfigMain.hpp | 1 +
 2 files changed, 5 insertions(+)

diff --git a/libdnf/conf/ConfigMain.cpp b/libdnf/conf/ConfigMain.cpp
index 40ae7b8fc..620711ee4 100644
--- a/libdnf/conf/ConfigMain.cpp
+++ b/libdnf/conf/ConfigMain.cpp
@@ -191,6 +191,8 @@ class ConfigMain::Impl {
     OptionBool debug_solver{false};
     OptionStringList installonlypkgs{INSTALLONLYPKGS};
     OptionStringList group_package_types{GROUP_PACKAGE_TYPES};
+    // TODO(jkolarik): Change to empty list when dropping the filelists for Fedora 40
+    OptionStringList optional_metadata_types{std::vector<std::string>{"filelists"}};
 
     OptionNumber<std::uint32_t> installonly_limit{3, 0,
         [](const std::string & value)->std::uint32_t{
@@ -399,6 +401,7 @@ ConfigMain::Impl::Impl(Config & owner)
     );
 
     owner.optBinds().add("group_package_types", group_package_types);
+    owner.optBinds().add("optional_metadata_types", optional_metadata_types);
     owner.optBinds().add("installonly_limit", installonly_limit);
 
     owner.optBinds().add("tsflags", tsflags,
@@ -564,6 +567,7 @@ OptionStringList & ConfigMain::reposdir() { return pImpl->reposdir; }
 OptionBool & ConfigMain::debug_solver() { return pImpl->debug_solver; }
 OptionStringList & ConfigMain::installonlypkgs() { return pImpl->installonlypkgs; }
 OptionStringList & ConfigMain::group_package_types() { return pImpl->group_package_types; }
+OptionStringList & ConfigMain::optional_metadata_types() { return pImpl->optional_metadata_types; }
 OptionNumber<std::uint32_t> & ConfigMain::installonly_limit() { return pImpl->installonly_limit; }
 OptionStringList & ConfigMain::tsflags() { return pImpl->tsflags; }
 OptionBool & ConfigMain::assumeyes() { return pImpl->assumeyes; }
diff --git a/libdnf/conf/ConfigMain.hpp b/libdnf/conf/ConfigMain.hpp
index 59f65c489..c63c9a827 100644
--- a/libdnf/conf/ConfigMain.hpp
+++ b/libdnf/conf/ConfigMain.hpp
@@ -72,6 +72,7 @@ class ConfigMain : public Config {
     OptionBool & debug_solver();
     OptionStringList & installonlypkgs();
     OptionStringList & group_package_types();
+    OptionStringList & optional_metadata_types();
 
     /*  NOTE: If you set this to 2, then because it keeps the current
     kernel it means if you ever install an "old" kernel it'll get rid

From edc343c20b0a9b6eaa777c3a62e1efb3bd29e16d Mon Sep 17 00:00:00 2001
From: Jan Kolarik <jkolarik@redhat.com>
Date: Mon, 30 Oct 2023 16:57:12 +0100
Subject: [PATCH 3/4] dnf-context: Load default filelists value from config

Use the default value for enabling filelists metadata from main configuration. Override the value when explicitly using the setter.
---
 libdnf/dnf-context.cpp | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp
index e775f51f9..1ec782d00 100644
--- a/libdnf/dnf-context.cpp
+++ b/libdnf/dnf-context.cpp
@@ -162,7 +162,7 @@ typedef struct
     gboolean         check_disk_space;
     gboolean         check_transaction;
     gboolean         only_trusted;
-    gboolean         enable_filelists;
+    gboolean         *enable_filelists;
     gboolean         enrollment_valid;
     gboolean         write_history;
     DnfLock         *lock;
@@ -252,6 +252,7 @@ dnf_context_finalize(GObject *object)
     g_free(priv->http_proxy);
     g_free(priv->user_agent);
     g_free(priv->arch);
+    g_free(priv->enable_filelists);
     g_strfreev(priv->native_arches);
     g_object_unref(priv->lock);
     g_object_unref(priv->state);
@@ -364,7 +365,6 @@ dnf_context_init(DnfContext *context)
     priv->install_root = g_strdup("/");
     priv->check_disk_space = TRUE;
     priv->check_transaction = TRUE;
-    priv->enable_filelists = TRUE;
     priv->write_history = TRUE;
     priv->state = dnf_state_new();
     priv->lock = dnf_lock_new();
@@ -1086,7 +1086,15 @@ gboolean
 dnf_context_get_enable_filelists (DnfContext     *context)
 {
     DnfContextPrivate *priv = GET_PRIVATE(context);
-    return priv->enable_filelists;
+    if (priv->enable_filelists == NULL) {
+        priv->enable_filelists = g_new(gboolean, 1);
+
+        auto & optional_metadata_types = libdnf::getGlobalMainConfig(false).optional_metadata_types().getValue();
+        *priv->enable_filelists = std::find(optional_metadata_types.begin(),
+                                            optional_metadata_types.end(),
+                                            "filelists") != optional_metadata_types.end();
+    }
+    return *priv->enable_filelists;
 }
 
 /**
@@ -1567,7 +1575,10 @@ dnf_context_set_enable_filelists (DnfContext     *context,
                                   gboolean        enable_filelists)
 {
     DnfContextPrivate *priv = GET_PRIVATE(context);
-    priv->enable_filelists = enable_filelists;
+    if (priv->enable_filelists == NULL) {
+        priv->enable_filelists = g_new(gboolean, 1);
+    }
+    *priv->enable_filelists = enable_filelists;
 }
 
 /**
@@ -1824,7 +1835,7 @@ dnf_context_setup_sack_with_flags(DnfContext               *context,
     DnfSackAddFlags add_flags = DNF_SACK_ADD_FLAG_NONE;
     if ((flags & DNF_CONTEXT_SETUP_SACK_FLAG_LOAD_UPDATEINFO) > 0)
         add_flags = static_cast<DnfSackAddFlags>(add_flags | DNF_SACK_ADD_FLAG_UPDATEINFO);
-    if (priv->enable_filelists && !((flags & DNF_CONTEXT_SETUP_SACK_FLAG_SKIP_FILELISTS) > 0))
+    if (dnf_context_get_enable_filelists(context) && !((flags & DNF_CONTEXT_SETUP_SACK_FLAG_SKIP_FILELISTS) > 0))
         add_flags = static_cast<DnfSackAddFlags>(add_flags | DNF_SACK_ADD_FLAG_FILELISTS);
 
     /* add remote */

From 2986bdbe5b21321d52fb9d167039d7121a80faf9 Mon Sep 17 00:00:00 2001
From: Jan Kolarik <jkolarik@redhat.com>
Date: Mon, 22 Jan 2024 09:25:34 +0100
Subject: [PATCH 4/4] Version bump due to new optional_metadata_types option

---
 VERSION.cmake | 2 +-
 libdnf.spec   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/VERSION.cmake b/VERSION.cmake
index f049e5f66..f0b6a83a2 100644
--- a/VERSION.cmake
+++ b/VERSION.cmake
@@ -1,5 +1,5 @@
 set (DEFAULT_LIBDNF_MAJOR_VERSION 0)
-set (DEFAULT_LIBDNF_MINOR_VERSION 72)
+set (DEFAULT_LIBDNF_MINOR_VERSION 73)
 set (DEFAULT_LIBDNF_MICRO_VERSION 0)
 
 if(DEFINED LIBDNF_MAJOR_VERSION)
diff --git a/libdnf.spec b/libdnf.spec
index 38163767d..f411db0a7 100644
--- a/libdnf.spec
+++ b/libdnf.spec
@@ -4,7 +4,7 @@
 %global dnf_conflict 4.11.0
 %global swig_version 3.0.12
 %global libdnf_major_version 0
-%global libdnf_minor_version 72
+%global libdnf_minor_version 73
 %global libdnf_micro_version 0
 
 %define __cmake_in_source_build 1