commit efe4600857b849a7b04df2e029f3be260fb0ed44 Author: MSVSphere Packaging Team Date: Tue Nov 26 16:59:57 2024 +0300 import libdnf-0.73.1-5.el10 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..edcef67 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/libdnf-0.73.1.tar.gz diff --git a/.libdnf.metadata b/.libdnf.metadata new file mode 100644 index 0000000..46011d0 --- /dev/null +++ b/.libdnf.metadata @@ -0,0 +1 @@ +317b564ada6b63d238865d657ff00f59ec6672df SOURCES/libdnf-0.73.1.tar.gz diff --git a/SOURCES/0001-context-use-rpmtsAddReinstallElement-when-doing-a-re.patch b/SOURCES/0001-context-use-rpmtsAddReinstallElement-when-doing-a-re.patch new file mode 100644 index 0000000..9dea089 --- /dev/null +++ b/SOURCES/0001-context-use-rpmtsAddReinstallElement-when-doing-a-re.patch @@ -0,0 +1,229 @@ +From 85432dfd048912083897ab687488087038a9ac96 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Mon, 8 Apr 2024 07:32:31 +0200 +Subject: [PATCH] context: use `rpmtsAddReinstallElement()` when doing a + reinstall +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +`rpmtsAddInstallElement()` doesn't work for all reinstall cases, such as +when a package `Provides` and `Conflicts` with the same capability. + +Fixes: https://github.com/rpm-software-management/microdnf/issues/137 +Signed-off-by: Petr Písař +--- + libdnf/dnf-rpmts-private.hpp | 6 ++ + libdnf/dnf-rpmts.cpp | 108 +++++++++++++++++++++++------------ + libdnf/dnf-transaction.cpp | 8 ++- + 3 files changed, 85 insertions(+), 37 deletions(-) + +diff --git a/libdnf/dnf-rpmts-private.hpp b/libdnf/dnf-rpmts-private.hpp +index 94ad6b45..7a8f70fb 100644 +--- a/libdnf/dnf-rpmts-private.hpp ++++ b/libdnf/dnf-rpmts-private.hpp +@@ -31,4 +31,10 @@ gboolean dnf_rpmts_add_install_filename2(rpmts ts, + DnfPackage *pkg, + GError **error); + ++gboolean dnf_rpmts_add_reinstall_filename(rpmts ts, ++ const gchar *filename, ++ gboolean allow_untrusted, ++ GError **error); ++ ++ + #endif /* __DNF_RPMTS_PRIVATE_HPP */ +diff --git a/libdnf/dnf-rpmts.cpp b/libdnf/dnf-rpmts.cpp +index ec3d3706..9c0152fc 100644 +--- a/libdnf/dnf-rpmts.cpp ++++ b/libdnf/dnf-rpmts.cpp +@@ -88,94 +88,132 @@ test_fail_safe(Header * hdr, DnfPackage * pkg, GError **error) + return ret; + } + +-gboolean +-dnf_rpmts_add_install_filename2(rpmts ts, +- const gchar *filename, +- gboolean allow_untrusted, +- gboolean is_update, +- DnfPackage * pkg, +- GError **error) try +-{ +- gboolean ret = TRUE; +- gint res; +- Header hdr; +- FD_t fd; +- +- /* open this */ +- fd = Fopen(filename, "r.ufdio"); +- res = rpmReadPackageFile(ts, fd, filename, &hdr); +- ++static gboolean ++result_is_accepted(gint result, gboolean allow_untrusted, const gchar *filename, GError **error) { + /* be less strict when we're allowing untrusted transactions */ + if (allow_untrusted) { +- switch(res) { ++ switch(result) { + case RPMRC_NOKEY: + case RPMRC_NOTFOUND: + case RPMRC_NOTTRUSTED: + case RPMRC_OK: +- break; ++ return TRUE; + case RPMRC_FAIL: +- ret = FALSE; + g_set_error(error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, + _("signature does not verify for %s"), + filename); +- goto out; ++ return FALSE; + default: +- ret = FALSE; + g_set_error(error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, + _("failed to open(generic error): %s"), + filename); +- goto out; ++ return FALSE; + } + } else { +- switch(res) { ++ switch(result) { + case RPMRC_OK: +- break; ++ return TRUE; + case RPMRC_NOTTRUSTED: +- ret = FALSE; + g_set_error(error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, + _("failed to verify key for %s"), + filename); +- goto out; ++ return FALSE; + case RPMRC_NOKEY: +- ret = FALSE; + g_set_error(error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, + _("public key unavailable for %s"), + filename); +- goto out; ++ return FALSE; + case RPMRC_NOTFOUND: +- ret = FALSE; + g_set_error(error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, + _("signature not found for %s"), + filename); +- goto out; ++ return FALSE; + case RPMRC_FAIL: +- ret = FALSE; + g_set_error(error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, + _("signature does not verify for %s"), + filename); +- goto out; ++ return FALSE; + default: +- ret = FALSE; + g_set_error(error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, + _("failed to open(generic error): %s"), + filename); +- goto out; ++ return FALSE; + } + } ++} ++ ++gboolean ++dnf_rpmts_add_reinstall_filename(rpmts ts, ++ const gchar *filename, ++ gboolean allow_untrusted, ++ GError **error) try ++{ ++ gboolean ret = TRUE; ++ gint res; ++ Header hdr; ++ FD_t fd; ++ ++ /* open this */ ++ fd = Fopen(filename, "r.ufdio"); ++ res = rpmReadPackageFile(ts, fd, filename, &hdr); ++ ++ if (!result_is_accepted(res, allow_untrusted, filename, error)) { ++ ret = FALSE; ++ goto out; ++ } ++ ++ /* add to the transaction */ ++ res = rpmtsAddReinstallElement(ts, hdr, (fnpyKey) filename); ++ if (res != 0) { ++ ret = FALSE; ++ g_set_error(error, ++ DNF_ERROR, ++ DNF_ERROR_INTERNAL_ERROR, ++ _("failed to add reinstall element: %1$s [%2$i]"), ++ filename, res); ++ goto out; ++ } ++out: ++ Fclose(fd); ++ headerFree(hdr); ++ return ret; ++} CATCH_TO_GERROR(FALSE) ++ ++gboolean ++dnf_rpmts_add_install_filename2(rpmts ts, ++ const gchar *filename, ++ gboolean allow_untrusted, ++ gboolean is_update, ++ DnfPackage * pkg, ++ GError **error) try ++{ ++ gboolean ret = TRUE; ++ gint res; ++ Header hdr; ++ FD_t fd; ++ ++ /* open this */ ++ fd = Fopen(filename, "r.ufdio"); ++ res = rpmReadPackageFile(ts, fd, filename, &hdr); ++ ++ if (!result_is_accepted(res, allow_untrusted, filename, error)) { ++ ret = FALSE; ++ goto out; ++ } + if (pkg) { + if (!test_fail_safe(&hdr, pkg, error)) { + ret = FALSE; +diff --git a/libdnf/dnf-transaction.cpp b/libdnf/dnf-transaction.cpp +index c4c5e02b..35b2ff95 100644 +--- a/libdnf/dnf-transaction.cpp ++++ b/libdnf/dnf-transaction.cpp +@@ -1222,8 +1222,12 @@ dnf_transaction_commit(DnfTransaction *transaction, HyGoal goal, DnfState *state + filename = dnf_package_get_filename(pkg); + allow_untrusted = (priv->flags & DNF_TRANSACTION_FLAG_ONLY_TRUSTED) == 0; + is_update = action == DNF_STATE_ACTION_UPDATE || action == DNF_STATE_ACTION_DOWNGRADE; +- ret = dnf_rpmts_add_install_filename2( +- priv->ts, filename, allow_untrusted, is_update, pkg, error); ++ if (action == DNF_STATE_ACTION_REINSTALL) { ++ ret = dnf_rpmts_add_reinstall_filename(priv->ts, filename, allow_untrusted, error); ++ } else { ++ ret = dnf_rpmts_add_install_filename2( ++ priv->ts, filename, allow_untrusted, is_update, pkg, error); ++ } + if (!ret) + goto out; + +-- +2.45.2 + diff --git a/SOURCES/0002-Since-we-use-rpmtsAddReinstallElement-rpm-also-unins.patch b/SOURCES/0002-Since-we-use-rpmtsAddReinstallElement-rpm-also-unins.patch new file mode 100644 index 0000000..373886e --- /dev/null +++ b/SOURCES/0002-Since-we-use-rpmtsAddReinstallElement-rpm-also-unins.patch @@ -0,0 +1,78 @@ +From bc371683ab69d51127952b037bde209a56e44105 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Fri, 3 May 2024 08:55:47 +0200 +Subject: [PATCH] Since we use rpmtsAddReinstallElement rpm also uninstalls the + package +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It calls callbacks for `RPMCALLBACK_INST_START` and +`RPMCALLBACK_INST_PROGRESS` just like before when the reinstall was done +through regural install (rpmtsAddInstallElement) but in addition it also +calls `RPMCALLBACK_UNINST_START` and `RPMCALLBACK_UNINST_PROGRESS`. To +ensure they find the `DnfPackage` add it to `remove_helper` array. + +Unfortunaly this means that the reinstall action is reported twice to +the clients (one install and one uninstall). We could try to hide one of +the them but I think a better solution is to report what is actually +happening and report one install and one uninstall. + +This is for the context part of libdnf (microdnf, packagekit, ...) + +Fixes: https://github.com/rpm-software-management/libdnf/issues/1653 +Signed-off-by: Petr Písař +--- + libdnf/dnf-transaction.cpp | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +diff --git a/libdnf/dnf-transaction.cpp b/libdnf/dnf-transaction.cpp +index 35b2ff95..fcb1152f 100644 +--- a/libdnf/dnf-transaction.cpp ++++ b/libdnf/dnf-transaction.cpp +@@ -602,7 +602,7 @@ dnf_transaction_ts_progress_cb(const void *arg, + + /* map to correct action code */ + action = dnf_package_get_action(pkg); +- if (action == DNF_STATE_ACTION_UNKNOWN) ++ if (action == DNF_STATE_ACTION_UNKNOWN || action == DNF_STATE_ACTION_REINSTALL) + action = DNF_STATE_ACTION_INSTALL; + + /* set the pkgid if not already set */ +@@ -641,7 +641,7 @@ dnf_transaction_ts_progress_cb(const void *arg, + + /* map to correct action code */ + action = dnf_package_get_action(pkg); +- if (action == DNF_STATE_ACTION_UNKNOWN) ++ if (action == DNF_STATE_ACTION_UNKNOWN || action == DNF_STATE_ACTION_REINSTALL) + action = DNF_STATE_ACTION_REMOVE; + + /* remove start */ +@@ -716,7 +716,7 @@ dnf_transaction_ts_progress_cb(const void *arg, + + /* map to correct action code */ + action = dnf_package_get_action(pkg); +- if (action == DNF_STATE_ACTION_UNKNOWN) ++ if (action == DNF_STATE_ACTION_UNKNOWN || action == DNF_STATE_ACTION_REINSTALL) + action = DNF_STATE_ACTION_REMOVE; + + dnf_state_set_package_progress( +@@ -1354,6 +1354,15 @@ dnf_transaction_commit(DnfTransaction *transaction, HyGoal goal, DnfState *state + g_ptr_array_unref(pkglist); + } + ++ /* add reinstalled packages to a helper array which is used to ++ * map removed packages auto-added by rpm to actual DnfPackage's */ ++ pkglist = dnf_goal_get_packages(goal, DNF_PACKAGE_INFO_REINSTALL, -1); ++ for (i = 0; i < pkglist->len; i++) { ++ pkg_tmp = static_cast< DnfPackage * >(g_ptr_array_index(pkglist, i)); ++ g_ptr_array_add(priv->remove_helper, g_object_ref(pkg_tmp)); ++ } ++ g_ptr_array_unref(pkglist); ++ + /* this section done */ + ret = dnf_state_done(state, error); + if (!ret) +-- +2.45.2 + diff --git a/SOURCES/0003-MergedTransaction-Fix-invalid-memory-access-when-dro.patch b/SOURCES/0003-MergedTransaction-Fix-invalid-memory-access-when-dro.patch new file mode 100644 index 0000000..0988f62 --- /dev/null +++ b/SOURCES/0003-MergedTransaction-Fix-invalid-memory-access-when-dro.patch @@ -0,0 +1,91 @@ +From 90d2ffad964a91a7a798b81e15c16eb1e840f257 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Tue, 23 Apr 2024 14:11:19 +0000 +Subject: [PATCH] MergedTransaction: Fix invalid memory access when dropping + items +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When an item is dropped from the merged transaction, the `ItemPair` reference becomes invalid and should no longer be used. + +Signed-off-by: Petr Písař +--- + libdnf/transaction/MergedTransaction.cpp | 18 +++++++++++------- + libdnf/transaction/MergedTransaction.hpp | 2 +- + 2 files changed, 12 insertions(+), 8 deletions(-) + +diff --git a/libdnf/transaction/MergedTransaction.cpp b/libdnf/transaction/MergedTransaction.cpp +index 8f26882f..75d2c1e7 100644 +--- a/libdnf/transaction/MergedTransaction.cpp ++++ b/libdnf/transaction/MergedTransaction.cpp +@@ -264,14 +264,15 @@ getItemIdentifier(ItemPtr item) + + /** + * Resolve the difference between RPMs in the first and second transaction item +- * and create a ItemPair of Upgrade, Downgrade or drop the item from the merged +- * transaction set in case of both packages are of the same version. +- * Method is called when original package is being removed and than installed again. ++ * and create a ItemPair of Upgrade, Downgrade or remove the item from the merged ++ * transaction set in case of both packages are the same. ++ * Method is called when original package is being removed and then installed again. + * \param itemPairMap merged transaction set + * \param previousItemPair original item pair + * \param mTransItem new transaction item ++ * \return true if the original and new transaction item differ + */ +-void ++bool + MergedTransaction::resolveRPMDifference(ItemPairMap &itemPairMap, + ItemPair &previousItemPair, + TransactionItemBasePtr mTransItem) +@@ -287,7 +288,7 @@ MergedTransaction::resolveRPMDifference(ItemPairMap &itemPairMap, + firstRPM->getRelease() == secondRPM->getRelease()) { + // Drop the item from merged transaction + itemPairMap.erase(getItemIdentifier(firstItem)); +- return; ++ return false; + } else if ((*firstRPM) < (*secondRPM)) { + // Upgrade to secondRPM + previousItemPair.first->setAction(TransactionItemAction::UPGRADED); +@@ -298,6 +299,7 @@ MergedTransaction::resolveRPMDifference(ItemPairMap &itemPairMap, + mTransItem->setAction(TransactionItemAction::DOWNGRADE); + } + previousItemPair.second = mTransItem; ++ return true; + } + + void +@@ -308,12 +310,14 @@ MergedTransaction::resolveErase(ItemPairMap &itemPairMap, + /* + * The original item has been removed - it has to be installed now unless the rpmdb + * has changed. Resolve the difference between packages and mark it as Upgrade, +- * Reinstall or Downgrade ++ * Downgrade or remove it from the transaction + */ + if (mTransItem->getAction() == TransactionItemAction::INSTALL) { + if (mTransItem->getItem()->getItemType() == ItemType::RPM) { + // resolve the difference between RPM packages +- resolveRPMDifference(itemPairMap, previousItemPair, mTransItem); ++ if (!resolveRPMDifference(itemPairMap, previousItemPair, mTransItem)) { ++ return; ++ } + } else { + // difference between comps can't be resolved + mTransItem->setAction(TransactionItemAction::REINSTALL); +diff --git a/libdnf/transaction/MergedTransaction.hpp b/libdnf/transaction/MergedTransaction.hpp +index f85b133a..50212159 100644 +--- a/libdnf/transaction/MergedTransaction.hpp ++++ b/libdnf/transaction/MergedTransaction.hpp +@@ -76,7 +76,7 @@ protected: + typedef std::map< std::string, ItemPair > ItemPairMap; + + void mergeItem(ItemPairMap &itemPairMap, TransactionItemBasePtr transItem); +- void resolveRPMDifference(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem); ++ bool resolveRPMDifference(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem); + void resolveErase(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem); + void resolveAltered(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem); + }; +-- +2.45.2 + diff --git a/SOURCES/0004-Set-pool-flag-to-fix-pool_addfileprovides_queue-with.patch b/SOURCES/0004-Set-pool-flag-to-fix-pool_addfileprovides_queue-with.patch new file mode 100644 index 0000000..63cf3ef --- /dev/null +++ b/SOURCES/0004-Set-pool-flag-to-fix-pool_addfileprovides_queue-with.patch @@ -0,0 +1,40 @@ +From a6d89d66698f75c01539cd03c04a87ab52b6db7c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 25 Jun 2024 13:38:14 +0200 +Subject: [PATCH] Set pool flag to fix pool_addfileprovides_queue() without + filelists.xml +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Since dnf4 now also conditionally load filelists it ran into the same +problem as dnf5 here: https://github.com/rpm-software-management/dnf5/issues/520 + +Additional details in: https://github.com/openSUSE/libsolv/pull/531 + +Signed-off-by: Petr Písař +--- + libdnf/dnf-sack.cpp | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/libdnf/dnf-sack.cpp b/libdnf/dnf-sack.cpp +index 3c3a7657..e95009fb 100644 +--- a/libdnf/dnf-sack.cpp ++++ b/libdnf/dnf-sack.cpp +@@ -185,6 +185,13 @@ dnf_sack_init(DnfSack *sack) + DnfSackPrivate *priv = GET_PRIVATE(sack); + priv->pool = pool_create(); + pool_set_flag(priv->pool, POOL_FLAG_WHATPROVIDESWITHDISABLED, 1); ++ ++ // Configures the pool_addfileprovides_queue() method to only add files from primary.xml. ++ // This ensures the method works correctly even if filelist.xml metadata are not loaded. ++ // At the same time when filelist.xml are loaded libsolv is able to search them for required ++ // files if needed. ++ pool_set_flag(priv->pool, POOL_FLAG_ADDFILEPROVIDESFILTERED, 1); ++ + priv->running_kernel_id = -1; + priv->running_kernel_fn = running_kernel; + priv->considered_uptodate = TRUE; +-- +2.45.2 + diff --git a/SOURCES/0005-ConfigParser-fix-use-out-of-scope-leaks.patch b/SOURCES/0005-ConfigParser-fix-use-out-of-scope-leaks.patch new file mode 100644 index 0000000..636d757 --- /dev/null +++ b/SOURCES/0005-ConfigParser-fix-use-out-of-scope-leaks.patch @@ -0,0 +1,128 @@ +From 1f6c2479260e2d26a861b871c443a5b960523a71 Mon Sep 17 00:00:00 2001 +From: Evan Goode +Date: Tue, 7 May 2024 16:33:03 +0000 +Subject: [PATCH] ConfigParser: fix use-out-of-scope leaks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + libdnf/conf/ConfigParser.cpp | 48 ++++++++++++++++++++++++------------ + 1 file changed, 32 insertions(+), 16 deletions(-) + +diff --git a/libdnf/conf/ConfigParser.cpp b/libdnf/conf/ConfigParser.cpp +index 76e7f9cc..977da757 100644 +--- a/libdnf/conf/ConfigParser.cpp ++++ b/libdnf/conf/ConfigParser.cpp +@@ -95,7 +95,9 @@ std::pair ConfigParser::substitute_expression(const std::st + const auto & variable_key = res.substr(pos_variable, pos_after_variable - pos_variable); + const auto variable_mapping = substitutions.find(variable_key); + +- const std::string * variable_value = nullptr; ++ // No std::optional here. ++ bool variable_value_has_value{false}; ++ std::string variable_value{""}; + + if (variable_mapping == substitutions.end()) { + if (variable_key == "releasever_major" || variable_key == "releasever_minor") { +@@ -103,17 +105,22 @@ std::pair ConfigParser::substitute_expression(const std::st + if (releasever_mapping != substitutions.end()) { + const auto & releasever_split = ConfigParser::split_releasever(releasever_mapping->second); + if (variable_key == "releasever_major") { +- variable_value = &std::get<0>(releasever_split); ++ variable_value = std::get<0>(releasever_split); ++ variable_value_has_value = true; + } else { +- variable_value = &std::get<1>(releasever_split); ++ variable_value = std::get<1>(releasever_split); ++ variable_value_has_value = true; + } + } + } + } else { +- variable_value = &variable_mapping->second; ++ variable_value = variable_mapping->second; ++ variable_value_has_value = true; + } + +- const std::string * subst_str = nullptr; ++ // No std::optional here ++ std::string subst_str{""}; ++ bool subst_str_has_value{false}; + + size_t pos_after_variable_expression; + +@@ -153,20 +160,23 @@ std::pair ConfigParser::substitute_expression(const std::st + // If variable is unset or empty, the expansion of word is + // substituted. Otherwise, the value of variable is + // substituted. +- if (variable_value == nullptr || variable_value->empty()) { +- subst_str = &expanded_word; ++ if (!variable_value_has_value || variable_value.empty()) { ++ subst_str = expanded_word; ++ subst_str_has_value = true; + } else { + subst_str = variable_value; ++ subst_str_has_value = true; + } + } else if (expansion_mode == '+') { + // ${variable:+word} (alternate value) + // If variable is unset or empty nothing is substituted. + // Otherwise, the expansion of word is substituted. +- if (variable_value == nullptr || variable_value->empty()) { +- const std::string empty{}; +- subst_str = ∅ ++ if (!variable_value_has_value || variable_value.empty()) { ++ subst_str = ""; ++ subst_str_has_value = true; + } else { +- subst_str = &expanded_word; ++ subst_str = expanded_word; ++ subst_str_has_value = true; + } + } else { + // Unknown expansion mode, continue after the ':' +@@ -176,7 +186,10 @@ std::pair ConfigParser::substitute_expression(const std::st + pos_after_variable_expression = pos_after_word + 1; + } else if (res[pos_after_variable] == '}') { + // ${variable} +- subst_str = variable_value; ++ if (variable_value_has_value) { ++ subst_str = variable_value; ++ subst_str_has_value = true; ++ } + // Move past the closing '}' + pos_after_variable_expression = pos_after_variable + 1; + } else { +@@ -186,20 +199,23 @@ std::pair ConfigParser::substitute_expression(const std::st + } + } else { + // No braces, we have a $variable +- subst_str = variable_value; ++ if (variable_value_has_value) { ++ subst_str = variable_value; ++ subst_str_has_value = true; ++ } + pos_after_variable_expression = pos_after_variable; + } + + // If there is no substitution to make, move past the variable expression and continue. +- if (subst_str == nullptr) { ++ if (!subst_str_has_value) { + total_scanned += pos_after_variable_expression - pos; + pos = pos_after_variable_expression; + continue; + } + +- res.replace(pos, pos_after_variable_expression - pos, *subst_str); ++ res.replace(pos, pos_after_variable_expression - pos, subst_str); + total_scanned += pos_after_variable_expression - pos; +- pos += subst_str->length(); ++ pos += subst_str.length(); + } else { + total_scanned += 1; + pos += 1; +-- +2.45.2 + diff --git a/SOURCES/0006-Add-tests-for-shell-style-variable-expansion.patch b/SOURCES/0006-Add-tests-for-shell-style-variable-expansion.patch new file mode 100644 index 0000000..7929439 --- /dev/null +++ b/SOURCES/0006-Add-tests-for-shell-style-variable-expansion.patch @@ -0,0 +1,42 @@ +From 18f49a49be14f80233613710e84dda47c5958252 Mon Sep 17 00:00:00 2001 +From: Evan Goode +Date: Tue, 7 May 2024 16:28:59 +0000 +Subject: [PATCH] Add tests for shell-style variable expansion +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + tests/libdnf/conf/ConfigParserTest.cpp | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/tests/libdnf/conf/ConfigParserTest.cpp b/tests/libdnf/conf/ConfigParserTest.cpp +index 70278196..1448d8d3 100644 +--- a/tests/libdnf/conf/ConfigParserTest.cpp ++++ b/tests/libdnf/conf/ConfigParserTest.cpp +@@ -30,4 +30,21 @@ void ConfigParserTest::testConfigParserReleasever() + libdnf::ConfigParser::substitute(text, substitutions); + CPPUNIT_ASSERT(text == "major: , minor: "); + } ++ { ++ std::map substitutions = { ++ {"var1", "value123"}, ++ {"var2", "456"}, ++ }; ++ std::string text = "foo$var1-bar"; ++ libdnf::ConfigParser::substitute(text, substitutions); ++ CPPUNIT_ASSERT(text == "foovalue123-bar"); ++ ++ text = "${var1:+alternate}-${unset:-default}-${nn:+n${nn:-${nnn:}"; ++ libdnf::ConfigParser::substitute(text, substitutions); ++ CPPUNIT_ASSERT(text == "alternate-default-${nn:+n${nn:-${nnn:}"); ++ ++ text = "${unset:-${var1:+${var2:+$var2}}}"; ++ libdnf::ConfigParser::substitute(text, substitutions); ++ CPPUNIT_ASSERT(text == "456"); ++ } + } +-- +2.45.2 + diff --git a/SPECS/libdnf.spec b/SPECS/libdnf.spec new file mode 100644 index 0000000..f21dde7 --- /dev/null +++ b/SPECS/libdnf.spec @@ -0,0 +1,1072 @@ +%global libsolv_version 0.7.21 +%global libmodulemd_version 2.13.0 +%global librepo_version 1.15.0 +%global dnf_conflict 4.11.0 +%global swig_version 3.0.12 +%global libdnf_major_version 0 +%global libdnf_minor_version 73 +%global libdnf_micro_version 1 + +%define __cmake_in_source_build 1 + +# set sphinx package name according to distro +%global requires_python2_sphinx python2-sphinx +%global requires_python3_sphinx python3-sphinx +%if 0%{?rhel} == 7 + %global requires_python2_sphinx python-sphinx +%endif +%if 0%{?suse_version} + %global requires_python2_sphinx python2-Sphinx + %global requires_python3_sphinx python3-Sphinx +%endif + +%bcond_with valgrind + +# Do not build bindings for python3 for RHEL <= 7 +%if 0%{?rhel} && 0%{?rhel} <= 7 +%bcond_with python3 +%else +%bcond_without python3 +%endif + +%if 0%{?rhel} > 7 || 0%{?fedora} > 29 +# Disable python2 build by default +%bcond_with python2 +%else +%bcond_without python2 +%endif + +%if 0%{?rhel} && ! 0%{?centos} +%bcond_without rhsm +%else +%bcond_with rhsm +%endif + +%if 0%{?rhel} +%bcond_with zchunk +%else +%bcond_without zchunk +%endif + +%bcond_with sanitizers + +%global _cmake_opts \\\ + -DENABLE_RHSM_SUPPORT=%{?with_rhsm:ON}%{!?with_rhsm:OFF} \\\ + %{nil} + +Name: libdnf +Version: %{libdnf_major_version}.%{libdnf_minor_version}.%{libdnf_micro_version} +Release: 5%{?dist} +Summary: Library providing simplified C and Python API to libsolv +License: LGPL-2.1-or-later +URL: https://github.com/rpm-software-management/libdnf +Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +Patch1: 0001-context-use-rpmtsAddReinstallElement-when-doing-a-re.patch +Patch2: 0002-Since-we-use-rpmtsAddReinstallElement-rpm-also-unins.patch +Patch3: 0003-MergedTransaction-Fix-invalid-memory-access-when-dro.patch +Patch4: 0004-Set-pool-flag-to-fix-pool_addfileprovides_queue-with.patch +Patch5: 0005-ConfigParser-fix-use-out-of-scope-leaks.patch +Patch6: 0006-Add-tests-for-shell-style-variable-expansion.patch + +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: libsolv-devel >= %{libsolv_version} +BuildRequires: pkgconfig(librepo) >= %{librepo_version} +BuildRequires: pkgconfig(check) +%if %{with valgrind} +BuildRequires: valgrind +%endif +BuildRequires: pkgconfig(gio-unix-2.0) >= 2.46.0 +BuildRequires: pkgconfig(gtk-doc) +BuildRequires: rpm-devel >= 4.15.0 +%if %{with rhsm} +BuildRequires: pkgconfig(librhsm) >= 0.0.3 +%endif +%if %{with zchunk} +BuildRequires: pkgconfig(zck) >= 0.9.11 +%endif +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(json-c) +BuildRequires: pkgconfig(cppunit) +BuildRequires: pkgconfig(modulemd-2.0) >= %{libmodulemd_version} +BuildRequires: pkgconfig(smartcols) +BuildRequires: gettext + +%if %{with sanitizers} +BuildRequires: libasan +BuildRequires: liblsan +BuildRequires: libubsan +%endif + +Requires: libmodulemd%{?_isa} >= %{libmodulemd_version} +Requires: libsolv%{?_isa} >= %{libsolv_version} +Requires: librepo%{?_isa} >= %{librepo_version} + +%if %{without python2} +# Obsoleted from here so we can track the fast growing version easily. +# We intentionally only obsolete and not provide, this is a broken upgrade +# prevention, not providing the removed functionality. +Obsoletes: python2-%{name} < %{version}-%{release} +Obsoletes: python2-hawkey < %{version}-%{release} +Obsoletes: python2-hawkey-debuginfo < %{version}-%{release} +Obsoletes: python2-libdnf-debuginfo < %{version}-%{release} +%endif + +%description +A Library providing simplified C and Python API to libsolv. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: libsolv-devel%{?_isa} >= %{libsolv_version} + +%description devel +Development files for %{name}. + +%if %{with python2} +%package -n python2-%{name} +%{?python_provide:%python_provide python2-%{name}} +Summary: Python 2 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python2-devel +%if !0%{?mageia} +BuildRequires: %{requires_python2_sphinx} +%endif +%if 0%{?rhel} == 7 +BuildRequires: swig3 >= %{swig_version} +%else +BuildRequires: swig >= %{swig_version} +%endif + +%description -n python2-%{name} +Python 2 bindings for the libdnf library. +%endif +# endif with python2 + +%if %{with python3} +%package -n python3-%{name} +%{?python_provide:%python_provide python3-%{name}} +Summary: Python 3 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python3-devel +BuildRequires: %{requires_python3_sphinx} +BuildRequires: swig >= %{swig_version} + +%description -n python3-%{name} +Python 3 bindings for the libdnf library. +%endif + +%if %{with python2} +%package -n python2-hawkey +Summary: Python 2 bindings for the hawkey library +%{?python_provide:%python_provide python2-hawkey} +BuildRequires: python2-devel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python2-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python2-dnf >= 2.0.0 +Conflicts: python2-dnf < %{dnf_conflict} +Conflicts: python-dnf < %{dnf_conflict} + +%description -n python2-hawkey +Python 2 bindings for the hawkey library. +%endif +# endif with python2 + +%if %{with python3} +%package -n python3-hawkey +Summary: Python 3 bindings for the hawkey library +%{?python_provide:%python_provide python3-hawkey} +BuildRequires: python3-devel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python3-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python3-dnf >= 2.0.0 +Conflicts: python3-dnf < %{dnf_conflict} +# Obsoletes F27 packages +Obsoletes: platform-python-hawkey < %{version}-%{release} + +%description -n python3-hawkey +Python 3 bindings for the hawkey library. +%endif + +%prep +%autosetup -p1 +%if %{with python2} +mkdir build-py2 +%endif +%if %{with python3} +mkdir build-py3 +%endif + +%build +%if %{with python2} +pushd build-py2 + %if 0%{?mageia} || 0%{?suse_version} + cd .. + %define _cmake_builddir build-py2 + %define __builddir build-py2 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} -DWITH_MAN=OFF ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ + -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} + %make_build +popd +%endif +# endif with python2 + +%if %{with python3} +pushd build-py3 + %if 0%{?mageia} || 0%{?suse_version} + cd .. + %define _cmake_builddir build-py3 + %define __builddir build-py3 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} -DWITH_GIR=0 -DWITH_MAN=0 -Dgtkdoc=0 ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ + -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} + %make_build +popd +%endif + +%check +%if %{with python2} +pushd build-py2 + make ARGS="-V" test +popd +%endif +%if %{with python3} +# If we didn't run the general tests yet, do it now. +%if %{without python2} +pushd build-py3 + make ARGS="-V" test +popd +%else +# Otherwise, run just the Python tests, not all of +# them, since we have coverage of the core from the +# first build +pushd build-py3/python/hawkey/tests + make ARGS="-V" test +popd +%endif +%endif + +%install +%if %{with python2} +pushd build-py2 + %make_install +popd +%endif +%if %{with python3} +pushd build-py3 + %make_install +popd +%endif + +%find_lang %{name} + +%if (0%{?rhel} && 0%{?rhel} <= 7) || 0%{?suse_version} +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig +%else +%ldconfig_scriptlets +%endif + +%files -f %{name}.lang +%license COPYING +%doc README.md AUTHORS +%{_libdir}/%{name}.so.* +%dir %{_libdir}/libdnf/ +%dir %{_libdir}/libdnf/plugins/ +%{_libdir}/libdnf/plugins/README +%if %{with sanitizers} +%{_sysconfdir}/profile.d/dnf-sanitizers.sh +%endif + +%files devel +%doc %{_datadir}/gtk-doc/html/%{name}/ +%{_libdir}/%{name}.so +%{_libdir}/pkgconfig/%{name}.pc +%{_includedir}/%{name}/ + +%if %{with python2} +%files -n python2-%{name} +%{python2_sitearch}/%{name}/ +%endif + +%if %{with python3} +%files -n python3-%{name} +%{python3_sitearch}/%{name}-*.dist-info +%{python3_sitearch}/%{name}/ +%endif + +%if %{with python2} +%files -n python2-hawkey +%{python2_sitearch}/hawkey/ +%endif + +%if %{with python3} +%files -n python3-hawkey +%{python3_sitearch}/hawkey/ +%endif + +%changelog +* Tue Jul 16 2024 Petr Pisar - 0.73.1-5 +- Fix invalid memory uses in libdnf::ConfigParser::substitute_expression() (RHEL-36777) + +* Tue Jul 02 2024 Petr Pisar - 0.73.1-4 +- Fix sack initialization to enable postponed addition of filelists (RHEL-12355) + +* Mon Jun 24 2024 Troy Dawson - 0.73.1-3 +- Bump release for June 2024 mass rebuild + +* Tue Jun 11 2024 Petr Pisar - 0.73.1-2 +- Fix reinstalling packages which conflicts with themselves in + dnf_transaction_commit() (RHEL-32919) +- Fix an invalid memory access when dropping an item in MergedTransaction + class (RHEL-33541) + +* Thu Mar 28 2024 Evan Goode - 0.73.1-1 +- Update to 0.73.1 (RHEL-38831) +- Fix https://issues.redhat.com/browse/RHEL-27657 (RHEL-32935) +- subject-py: Fix memory leak (RHEL-32924) +- MergedTransaction: Calculate RPM difference between two same versions as + no-op (RHEL-33541) +- Onboard packit tests +- Add virtual destructor to TransactionItem (RHEL-32943) + +* Thu Feb 08 2024 Fedora Release Engineering - 0.73.0-1 +- Update to 0.73.0 +- filelists metadata loading on demand +- deltarpm disabled on Fedora +- conf: Introduce new optional_metadata_types option to load filelists on demand +- goal: Method for detecting file dependency problems + +* Thu Jan 25 2024 Fedora Release Engineering - 0.72.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Sun Jan 21 2024 Fedora Release Engineering - 0.72.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Wed Oct 18 2023 Jan Kolarik - 0.72.0-1 +- Update to 0.72.0 +- Avoid reinstalling installonly packages marked for ERASE (RhBug:2163474) +- transaction: Save the reason for installing (RhBug:1733274) +- hawkey.subject: get_best_selectors only obsoleters of latest (RhBug:2183279,2176263) +- conf: Add limited shell-style variable expansion (RhBug:1789346) +- conf: Add support for $releasever_major, $releasever_minor (RhBug:1789346) +- repo: Don't download the repository if the local cache is up to date +- Allow DNF to be removed by DNF 5 (RhBug:2221907) +- Include dist-info for python3-libdnf +- bindings: Load all modules with RTLD_GLOBAL +- Update translations + +* Wed Sep 20 2023 Adam Williamson - 0.71.0-2 +- Rebuild with no changes for Bodhi reasons + +* Fri Sep 01 2023 Jan Kolarik - 0.71.0-1 +- Update to 0.71.0 +- PGP: Use new librepo PGP API, remove gpgme dependency +- API: Basic support for OpenPGP public keys +- Avoid using GNU extensions in the dependency splitter regex +- filterAdvisory: match installed_solvables sort with lower_bound (RhBug:2212838) +- Make code C++20 compatible + +* Fri Jul 28 2023 Nicola Sella - 0.70.2-1 +- Update to 0.70.2 +- Support "proxy=none" in main config (RhBug:2155713) +- Fix #1558: Don't assume inclusion of cstdint +- Disconnect monitors in dnf_repo_loader_finalize() (RhBug:2070153) + +* Thu Jul 20 2023 Fedora Release Engineering - 0.70.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Wed Jun 14 2023 Python Maint - 0.70.1-4 +- Rebuilt for Python 3.12 + +* Wed May 17 2023 Jan Kolarik - 0.70.1-3 +- Rebuild for rpm-4.18.90-4 + +* Tue May 16 2023 Jan Kolarik - 0.70.1-2 +- Rebuild for rpm-4.18.90 + +* Mon May 15 2023 Jan Kolarik - 0.70.1-1 +- Update to 0.70.1 +- Add repoid to solver errors for RPMs (RhBug:2179413) +- Avoid using obsolete RPM API and drop redundant calls +- Remove DNF from list of protected packages + +* Fri Mar 03 2023 Jan Kolarik - 0.70.0-1 +- Update to 0.70.0 +- Allow change of architecture for packages during security updates with noarch involved (RhBug:2124483) +- "dnf_keyring_add_public_keys": reset localError to NULL after free (RhBug:2121222) +- context: Get RPM db path from RPM +- Fix memory leak of SolvUserdata + +* Thu Jan 19 2023 Fedora Release Engineering - 0.68.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Tue Aug 16 2022 Jaroslav Rohel - 0.68.0-1 +- Update to 0.68.0 +- context: Support (NEVRA forms, provides, file provides) including globs in the dnf_context_remove func (RhBug:2084602) +- dnf-context: Disconnect signal handler before dropping file monitor ref +- Filter out advisory pkgs with different arch during advisory upgrade, fixes possible problems in dependency resulution (RhBug:2088149) +- Gracefully handle failure to open repo primary file +- Fix listing a repository without cpeid (RhBug:2066334) + +* Thu Jul 21 2022 Fedora Release Engineering - 0.67.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Mon Jun 13 2022 Python Maint - 0.67.0-3 +- Rebuilt for Python 3.11 + +* Thu May 05 2022 Jaroslav Rohel - 0.67.0-2 +- Increase required libsolv version for cache versioning to 0.7.21 + +* Thu May 05 2022 Jaroslav Rohel - 0.67.0-1 +- Update to 0.67.0 +- Add 'loongarch' support +- Use dnf solv userdata to check versions and checksum (RhBug:2027445) +- context: Substitute all repository config options (RhBug:2076853) +- Add more specific error handling for loading repomd and primary + +* Mon Mar 14 2022 Pavla Kratochvilova - 0.66.0-1 +- Use `rpmdbCookie` from librpm, remove `hawkey.Sack._rpmdb_version` +- Fix handling transaction id in resolveTransactionItemReason (RhBug:2010259,2053014) +- Remove deprecated assertions (RhBug:2027383) +- Increase required rpm version since we use `rpmdbCookie()` + +* Mon Feb 21 2022 Pavla Kratochvilova - 0.65.0-3 +- Skip rich deps for autodetection of unmet dependencies (RhBug:2033130) + +* Thu Jan 20 2022 Fedora Release Engineering - 0.65.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Oct 21 2021 Pavla Kratochvilova - 0.65.0-1 +- Update to 0.65.0 +- Add support for excluding packages to be installed as weak dependencies +- Add support for autodetecting packages to be excluded from being installed as weak dependencies +- Turn off strict validation of modulemd documents (RhBug:2004853,2007166,2007167) + +* Thu Sep 23 2021 Pavla Kratochvilova - 0.64.0-1 +- Update to 0.64.0 +- Implement logic for demodularization of modular rpms (RhBug:1805260) +- DnfContext: fix handling of default module profiles +- ModuleMetadata: gracefully handle modules with no defaults +- Remove failovermethod config option (RhBug:1961083) + +* Tue Sep 14 2021 Sahana Prasad - 0.63.1-4 +- Rebuilt with OpenSSL 3.0.0 + +* Thu Jul 22 2021 Fedora Release Engineering - 0.63.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Sat Jul 10 2021 Björn Esser - 0.63.1-2 +- Rebuild for versioned symbols in json-c + +* Tue Jun 15 2021 Pavla Kratochvilova - 0.63.1-1 +- Update to 0.63.1 +- ModuleProfile: add isDefault() +- ModulePackage: add getDefaultProfile() +- Add new dnf_context_module_install() C API +- Fix a crash when [media] section in .treeinfo is missing for bootable media (RhBug:1946024) +- Add hy_query_get_advisory_pkgs to C API (RhBug:1960561) +- Add dnf_advisorypkg_get_advisory() +- DNF does not fail on non UTF-8 file names in a package (RhBug:1893176) +- Improve error-reporting for modular functions + +* Thu Jun 03 2021 Python Maint - 0.62.0-2 +- Rebuilt for Python 3.10 + +* Thu Apr 15 2021 Nicola Sella - 0.62.0-1 +- Fix: Fully set ssl in newHandle function +- [conf] Add options for working with certificates used with proxy +- lock: Switch return-if-fail to assert to quiet gcc -fanalyzer +- Modify module NSVCA parsing - context definition (RhBug:1926771) +- libdnf.h: Remove overall extern "C" +- [context] Fix: dnf_package_is_installonly (RhBug:1928056) +- Fix problematic language +- Add getApplicablePackages to advisory and isApplicable to advisorymodule +- Keep isAdvisoryApplicable to preserve API +- Run ModulePackageContainerTest tests in tmpdir, merge interdependent +- [context] Support config file option "proxy_auth_method", defaults "any" +- Hardening: add signature check with rpmcliVerifySignatures (RhBug:1932079) +- do not allow 1 as installonly_limit value (RhBug:1926261) +- Add a config option to check TLS certificate revocation status (using OCSP stapling), defaults to false (RhBug:1814383) + +* Tue Mar 02 2021 Nicola Sella - 0.60.0-1 +- Fix repo.fresh() implementation +- build-sys: Add ENABLE_STATIC option +- Fix: Fully set ssl in newHandle function +- [conf] Add options for working with certificates used with proxy +- Apply proxy certificate options +- lock: Switch return-if-fail to assert to quiet gcc -fanalyzer +- build-sys: Clean up message about Python bindings +- Modify module NSVCA parsing - context definition (RhBug:1926771) +- [context] Fix: dnf_package_is_installonly (RhBug:1928056) +- Fix problematic language +- Add getApplicablePackages to advisory and isApplicable to advisorymodule +- Keep isAdvisoryApplicable to preserve API +- Run ModulePackageContainerTest tests in tmpdir, merge interdependent +- [context] Support config file option "proxy_auth_method", defaults "any" +- Support main config file option "installonlypkgs". +- Support main config file option "protected_packages". +- Properly handle multiple collections in updateinfo.xml (RhBug:1804234) + +* Thu Jan 28 2021 Nicola Sella - 0.58.0-1 +- Update to 0.58.0 +- Option: Add reset() method +- Add OptionBinds::getOption() method +- [context] Add dnf_repo_conf_from_gkeyfile() and dnf_repo_conf_reset() +- [context] Add support for options: minrate, throttle, bandwidth, timeout +- [context] Remove g_key_file_get_string() from dnf_repo_set_keyfile_data() +- Allow loading ext metadata even if only cache (solv) is present +- Add ASAN_OPTIONS for test_libdnf_main +- [context,API] Functions for accessing main/global configuration options +- [context,API] Function for adding setopt +- Add getter for modular obsoletes from ModuleMetadata +- Add ModulePackage.getStaticContext() and getRequires() +- Add compatible layer for MdDocuments v2 +- Fix modular queries with the new solver +- Improve formatting of error string for modules +- Change mechanism of module conflicts +- Fix load/update FailSafe + +* Tue Jan 26 2021 Fedora Release Engineering - 0.55.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Dec 02 2020 Nicola Sella - 0.55.2-1 +- Update to 0.55.2 +- Improve performance of query installed() and available() +- Swdb: Add a method to get the current transaction +- [modules] Add special handling for src artifacts (RhBug:1809314) +- Better msgs if "basecachedir" or "proxy_password" isn't set (RhBug:1888946) +- Add new options module_stream_switch +- Support allow_vendor_change setting in dnf context API +- Fix couple of sanitizer builds in specfile + +* Mon Nov 23 2020 Nicola Sella - 0.55.0-1 +- Update to 0.55.0 +- Add vendor to dnf API (RhBug:1876561) +- Add formatting function for solver error +- Add error types in ModulePackageContainer +- Implement module enable for context part +- Improve string formatting for translation +- Remove redundant printf and change logging info to notice (RhBug:1827424) +- Add allow_vendor_change option (RhBug:1788371) (RhBug:1788371) + +* Thu Oct 29 2020 Adam Williamson - 0.54.2-3 +- Rebuild to keep NVR ahead of Fedora 32 + +* Tue Oct 13 2020 Ales Matej - 0.54.2-2 +- Increase needed conflicting dnf version + +* Wed Oct 07 2020 Nicola Sella - 0.54.2-1 +- Update to 0.54.2 +- history: Fix dnf history rollback when a package was removed (RhBug:1683134) +- Add support for HY_GT, HY_LT in query nevra_strict +- Fix parsing empty lines in config files +- Accept '==' as an operator in reldeps (RhBug:1847946) +- Add log file level main config option (RhBug:1802074) +- Add protect_running_kernel configuration option (RhBug:1698145) +- Context part of libdnf cannot assume zchunk is on (RhBug:1851841,1779104) +- Fix memory leak of resultingModuleIndex and handle g_object refs +- Redirect librepo logs to libdnf logs with different source +- Introduce changelog metadata in commit messages +- Add hy_goal_lock +- Update Copr targets for packit and use alias +- Enum/String conversions for Transaction Store/Replay +- utils: Add a method to decode URLs +- Unify hawkey.log line format with the rest of the logs + +* Mon Aug 10 2020 Nicola Sella - 0.48.0-4 +- spec: Fix building with new cmake macros +- tests: Fix incorrect usage of the fail_unless macros + +* Sat Aug 01 2020 Fedora Release Engineering - 0.48.0-3 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 0.48.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jun 02 2020 Nicola Sella - 0.48.0-1 +- Update to 0.48.0 +- swdb: Catch only SQLite3 exceptions and simplify the messages +- MergedTransaction list multiple comments (RhBug:1773679) +- Modify CMake to pull *.po files from weblate +- Optimize DependencyContainer creation from an existing queue +- fix a memory leak in dnf_package_get_requires() +- Fix memory leaks on g_build_filename() +- Fix memory leak in dnf_context_setup() +- Add `hy_goal_favor` and `hy_goal_disfavor` +- Define a cleanup function for `DnfPackageSet` +- dnf-repo: fix dnf_repo_get_public_keys double-free +- Do not cache RPMDB +- Use single-quotes around string literals used in SQL statements +- SQLite3: Do not close the database if it wasn't opened (RhBug:1761976) +- Don't create a new history DB connection for in-memory DB +- transaction/Swdb: Use a single logger variable in constructor +- utils: Add a safe version of pathExists() +- swdb: Handle the case when pathExists() fails on e.g. permission +- Repo: prepend "file://" if a local path is used as baseurl +- Move urlEncode() to utils +- utils: Add 'exclude' argument to urlEncode() +- Encode package URL for downloading through librepo (RhBug:1817130) +- Replace std::runtime_error with libdnf::RepoError +- Fixes and error handling improvements of the File class +- [context] Use ConfigRepo for gpgkey and baseurl (RhBug:1807864) +- [context] support "priority" option in .repo config file (RhBug:1797265) + +* Fri May 22 2020 Miro Hrončok - 0.47.0-3 +- Rebuilt for Python 3.9 + +* Tue Apr 21 2020 Björn Esser - 0.47.0-2 +- Rebuild (json-c) + +* Wed Apr 01 2020 Ales Matej - 0.47.0-1 +- Update to 0.47.0 +- Add prereq_ignoreinst & regular_requires properties for pkg (RhBug:1543449) +- Reset active modules when no module enabled or default (RhBug:1767351) +- Add comment option to transaction (RhBug:1773679) +- Failing to get module defauls is a recoverable error +- Baseurl is not exclusive with mirrorlist/metalink (RhBug: 1775184) +- Add new function to reset all modules in C API (dnf_context_reset_all_modules) +- [context] Fix to preserve additionalMetadata content (RhBug:1808677) +- Fix filtering of DepSolvables with source rpms (RhBug:1812596) +- Add setter for running kernel protection setting +- Handle situation when an unprivileged user cannot create history database (RhBug:1634385) +- Add query filter: latest by priority +- Add DNF_NO_PROTECTED flag to allow empty list of protected packages +- Remove 'dim' option from terminal colors to make them more readable (RhBug:1807774,1814563) +- [context] Error when main config file can't be opened (RhBug:1794864) +- [context] Add function function dnf_context_is_set_config_file_path + +* Mon Feb 24 2020 Ales Matej - 0.45.0-1 +- Config options: only first empty value clears existing (RhBug:1788154) +- Make parsing of reldeps more strict (RhBug:1788107) +- [context] Support repositories defined in main configuration file +- Fix filtering packages by advisory when more versions and arches are available (RhBug:1770125) +- Add expanding solvable provides for dependency matching (RhBug:1534123) +- DnfRepo: fix module_hotfixes keyfile priority level +- Add custom exceptions to libdnf interface +- [conf] Set useful default colors when color is enabled +- Port to libmodulemd-2 API (RhBug:1693683) + +* Tue Feb 04 2020 Adam Williamson - 0.43.1-3 +- [context] Create new repo instead of reusing old one (RhBug:1795004) + +* Wed Jan 29 2020 Fedora Release Engineering - 0.43.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Wed Jan 15 2020 Ales Matej - 0.43.1-1 +- Allow excluding packages with "excludepkgs" and globs +- Add two new query filters: obsoletes_by_priority, upgrades_by_priority +- [context] Use installonly_limit from global config (RhBug:1256108) +- [context] Add API to get/set "install_weak_deps" +- [context] Add wildcard support for repo_id in dnf_context_repo_enable/disable (RhBug:1781420) +- [context] Adds support for includepkgs in repository configuration. +- [context] Adds support for excludepkgs, exclude, includepkgs, and disable_excludes in main configuration. +- [context] Added function dnf_transaction_set_dont_solve_goal +- [context] Added functions dnf_context_get/set_config_file_path +- [context] Respect "plugins" global conf value +- [context] Add API to disable/enable plugins + +* Fri Nov 29 2019 Ales Matej - 0.39.1-1 +- Update to 0.39.1 +- Report reason how package was excluded (RhBug:1649754) +- Additional Arm detection improvements (RhBug:1691430) +- Set skip_if_unavailable for media repos to skip their update (RhBug:1716067) +- Add support of xml:base for remote and local url in context (RhBug:1734350, 1717865) +- Handle NoModuleException in dnf_context_reset_modules (RhBug:1767453) +- Add missing C function hy_nevra_free() for HyNevra deallocation +- Context part of libdnf now uses metadata_expire from global configuration + +* Wed Nov 13 2019 Pavla Kratochvilova - 0.37.2-2 +- Fix accidental code removal from hy_subject_get_best_solution() + +* Wed Nov 06 2019 Pavla Kratochvilova - 0.37.2-1 +- Update to 0.37.2 +- Use more descriptive message when failed to retrieve GPG key (RhBug:1605117) +- Add removeMetadataTypeFromDownload function to the API +- Context part of libdnf can now read vars (urlvars) from dirs and environment +- Throw exception immediately if file cannot be opened +- Add test when there is no primary metadata in compatible format (RhBug:1744960) +- Various improvements to countme features +- Don't abort on rpmdb checksum calculation failure +- Enable module dependency trees when using set_modules_enabled_by_pkgset() (RhBug:1762314) +- New method "Query::filterSubject()", replaces Solution::getBestSolution() +- The Solution class was removed +- Add query argument into get_best_query and get_best_solution +- Add module reset function into dnf_context +- Add method to get all repository metadata locations +- Catch NoModuleException in case of not existent value was used in persistor (RhBug:1761773) + +* Wed Oct 23 2019 Peter Robinson 0.35.5-5 +- Fixes for some issues on Arm platforms (rhbz 1691430) + +* Tue Oct 22 2019 Ales Matej - 0.35.5-4 +- Fix leaking log handlers in Sack that can cause a crash (RhBug:1758737) + +* Mon Oct 14 2019 Jaroslav Mracek - 0.35.5-3 +- Add POOL_FLAG_WHATPROVIDESWITHDISABLED flag into pool. +- Resolves: 1737469 + +* Tue Oct 01 2019 Ales Matej - 0.35.5-2 +- Fix dnf-conflict version + +* Tue Oct 01 2019 Ales Matej - 0.35.5-1 +- Update to 0.35.5 +- Fix crash in PackageKit (RhBug:1636803) +- Do not create @System.solv files (RhBug:1707995) +- Set LRO_CACHEDIR so zchunk works again (RhBug:1739867) +- Don't reinstall modified packages with the same NEVRA (RhBug:1644241) +- Fix bug when moving temporary repository metadata after download (RhBug:1700341) +- Improve detection of extras packages by comparing (name, arch) pair instead of full NEVRA (RhBuh:1684517) +- Improve handling multilib packages in the history command (RhBug:1728637) +- Repo download: use full error description into the exception text (RhBug:1741442) +- Properly close hawkey.log (RhBug:1594016) +- Fix dnf updateinfo --update to not list advisories for packages updatable only from non-enabled modules +- Apply modular filtering by package name (RhBug:1702729) +- Fully enable the modular fail safe mechanism (RhBug:1616167) + +* Sat Sep 14 2019 Jonathan Dieter - 0.35.3-5 +- Set LRO_CACHEDIR so zchunk works again + +* Wed Sep 11 2019 Jaroslav Mracek - 0.35.3-4 +- Backport patch to fix reinstalling packages with a different buildtime - part II + +* Tue Sep 10 2019 Jaroslav Mracek - 0.35.3-3 +- Backport patch to fix reinstalling packages with a different buildtime + +* Thu Aug 15 2019 Miro Hrončok - 0.35.3-2 +- Rebuilt for Python 3.8 + +* Tue Aug 13 2019 Pavla Kratochvilova - 0.35.3-1 +- Update to 0.35.3 +- Make libdnf own its plugin directory (RhBug:1714265) +- Don't disable nonexistent but required repositories (RhBug:1689331) +- Set priority of dnf.conf.d drop-ins +- Fix toString() to not insert [] (RhBug:1584442) +- Ignore trailing blank lines in config (RhBug:1722493) +- Fix handling large number of filenames on input (RhBug:1690915) +- Detect armv7 with crypto extension only on arm version >= 8 +- A new standardized User-Agent field consisting of the libdnf and OS version + (including the variant) (RhBug:1156007) +- Add basic countme support (RhBug:1647454) + +* Mon Jul 29 2019 Pavla Kratochvilova - 0.35.1-4 +- Rebuilt for librepo 1.10.5 + +* Thu Jul 25 2019 Fedora Release Engineering - 0.35.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Jul 22 2019 Pavla Kratochvilova - 0.35.1-2 +- Backport patch to fix attaching and detaching of libsolvRepo and + repo_internalize_trigger() (RhBug:1727343,1727424) + +* Thu Jul 04 2019 Pavla Kratochvilova - 0.35.1-1 +- Update to 0.35.1 +- Enhance logging handling +- Do not log DEBUG messages by default +- Also add subkeys when adding GPG keys +- [module] Fix swig binding for getModuleDependencies() +- Skip invalid key files in "/etc/pki/rpm-gpg" with warning (RhBug:1644040) +- Enable timestamp preserving for downloaded data (RhBug:1688537) +- Set default to skip_if_unavailable=false (RhBug:1679509) +- Add configuration option skip_if_unavailable (RhBug:1689931) +- Fix 'database is locked' error (RhBug:1631533) +- Replace the 'Failed to synchronize cache' message (RhBug:1712055) +- Fix 'no such table: main.trans_cmdline' error (RhBug:1596540) +- Add support of modular FailSafe (RhBug:1623128) (temporarily with warnings + instead of errors when installing modular RPMs without modular metadata) +- Add support of DNF main config file in context; used by PackageKit and + microdnf (RhBug:1689331) +- Exit gpg-agent after repokey import (RhBug:1650266) + +* Mon Jun 10 22:13:19 CET 2019 Igor Gnatenko - 0.31.0-5 +- Rebuild for RPM 4.15 + +* Mon Jun 10 15:42:02 CET 2019 Igor Gnatenko - 0.31.0-4 +- Rebuild for RPM 4.15 + +* Fri May 03 2019 Pavla Kratochvilova - 0.31.0-3 +- Backport patches to reintroduce hawkeyRepo + +* Thu Apr 25 2019 Pavla Kratochvilova - 0.31.0-1 +- Update to 0.31.0 +- Installroot now requires absolute path +- Support "_none_" value for repo option "proxy" (RhBug:1680272) +- Add support for Module advisories +- Add support for xml:base attribute from primary.xml (RhBug:1691315) +- Improve detection of Platform ID (RhBug:1688462) + +* Wed Mar 27 2019 Pavla Kratochvilova - 0.28.1-1 +- Update to 0.28.1 +- Return empty query if incorrect reldep (RhBug:1687135) +- ConfigParser: Improve compatibility with Python ConfigParser and dnf-plugin-spacewalk (RhBug:1692044) +- ConfigParser: Unify default set of string represenation of boolean values +- Fix segfault when interrupting dnf process (RhBug:1610456) + +* Mon Mar 11 2019 Pavla Kratochvilova - 0.28.0-1 +- Update to 0.28.0 +- Exclude module pkgs that have conflict +- Enhance config parser to preserve order of data, and keep comments and format +- Improve ARM detection +- Add support for SHA-384 + +* Tue Feb 19 2019 Jaroslav Mracek - 0.26.0-2 +- Backport patches for zchunk + +* Wed Feb 13 2019 Pavla Kratochvilova - 0.26.0-1 +- Update to 0.26.0-1 +- Enhance modular solver to handle enabled and default module streams differently (RhBug:1648839) +- Add support of wild cards for modules (RhBug:1644588) +- Revert commit that adds best as default behavior + +* Fri Feb 01 2019 Fedora Release Engineering - 0.24.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Wed Dec 12 2018 Jaroslav Mracek - 0.24.1-1 +- Update to 0.24.1 +- Add support for zchunk +- Enhance LIBDNF plugins support +- Enhance sorting for module list (RhBug:1590358) +- [repo] Check whether metadata cache is expired (RhBug:1539620,1648274) +- [DnfRepo] Add methods for alternative repository metadata type and download (RhBug:1656314) +- Remove installed profile on module enable or disable (RhBug:1653623) +- [sack] Implement dnf_sack_get_rpmdb_version() + +* Thu Nov 22 2018 Jaroslav Mracek - 0.22.3-1 +- Permanently disable Python2 build for Fedora 30+ +- Update to 0.22.3 +- Modify solver_describe_decision to report cleaned (RhBug:1486749) +- [swdb] create persistent WAL files (RhBug:1640235) +- Relocate ModuleContainer save hook (RhBug:1632518) +- [transaction] Fix transaction item lookup for obsoleted packages (RhBug: 1642796) +- Fix memory leaks and memory allocations +- [repo] Possibility to extend downloaded repository metadata + +* Wed Nov 07 2018 Jaroslav Mracek - 0.22.0-8 +- Backport fixes for RHBZ#1642796 from upstream master + +* Tue Oct 30 2018 Igor Gnatenko - 0.22.0-7 +- Rebuild for libsolv 0.7 + +* Tue Oct 23 2018 Jaroslav Mracek - 0.22.0-6 +- Add patch Relocate-ModuleContainer-save-hook-RhBug1632518 +- Add patch Test-if-sack-is-present-and-run-save-module-persistor-RhBug1632518 + +* Sat Oct 20 2018 Jaroslav Mracek - 0.22.0-5 +- remove problematic patch Relocate-ModuleContainer-save-hook-RhBug1632518 + +* Fri Oct 19 2018 Jaroslav Mracek - 0.22.0-4 +- backport Relocate-ModuleContainer-save-hook-RhBug1632518 + +* Thu Oct 18 2018 Jaroslav Mracek - 0.22.0-3 +- bacport swdb-create-persistent-WAL-files-RhBug1640235 + +* Wed Oct 17 2018 Jaroslav Mracek - 0.22.0-2 +- backport Modify-solver_describe_decision-to-report-cleaned-RhBug1486749 +- backport history-Fix-crash-in-TransactionItemaddReplacedBy + +* Mon Oct 15 2018 Jaroslav Mracek - 0.22.0-1 +- Update to 0.22.0 +- Fix segfault in repo_internalize_trigger (RhBug:1375895) +- Change sorting of installonly packages (RhBug:1627685) +- [swdb] Fixed pattern searching in history db (RhBug:1635542) +- Check correctly gpg for repomd when refresh is used (RhBug:1636743) +- [conf] Provide additional VectorString methods for compatibility with Python list. +- [plugins] add plugin loading and hooks into libdnf + +* Sat Sep 29 2018 Kevin Fenzi - 0.20.0-2 +- Temp re-enable python2 subpackages to get rawhide composing again. + +* Tue Sep 25 2018 Jaroslav Mracek - 0.20.0-1 +- [module] Report module solver errors +- [module] Enhance module commands and errors +- [transaction] Fixed several problems with SWDB +- Remove unneeded regex URL tests (RhBug:1598336) +- Allow quoted values in ini files (RhBug:1624056) +- Filter out not unique set of solver problems (RhBug:1564369) +- Disable python2 build for Fedora 30+ + +* Tue Sep 18 2018 Adam Williamson - 0.19.1-3 +- Backport PR #585 for an update crash bug (#1629340) + +* Fri Sep 14 2018 Kalev Lember - 0.19.1-2 +- Backport a fix for a packagekit crasher / F29 Beta blocker (#1626851) + +* Mon Sep 10 2018 Jaroslav Mracek - 0.19.1-1 +- Fix compilation errors on gcc-4.8.5 +- [module] Allow module queries on disabled modules + +* Fri Sep 07 2018 Jaroslav Mracek - 0.19.0-1 +- [query] Reldeps can contain a space char (RhBug:1612462) +- [transaction] Avoid adding duplicates via Transaction::addItem() +- Fix compilation errors on gcc-4.8.5 +- [module] Make available ModuleProfile using SWIG +- [module] Redesign module disable and reset + +* Mon Aug 13 2018 Daniel Mach - 0.17.2-1 +- [sqlite3] Change db locking mode to DEFAULT. +- [doc] Add libsmartcols-devel to devel deps. + +* Mon Aug 13 2018 Daniel Mach - 0.17.1-1 +- [module] Solve a problem in python constructor of NSVCAP if no version. +- [translations] Update translations from zanata. +- [transaction] Fix crash after using dnf.comps.CompsQuery and forking the process in Anaconda. +- [module] Support for resetting module state. +- [output] Introduce wrapper for smartcols. + +* Fri Aug 10 2018 Adam Williamson - 0.17.0-2 +- Backport fix that prevented anaconda running dnf in a subprocess (#546) + +* Tue Aug 07 2018 Daniel Mach - 0.17.0-1 +- [conf] Add module_platform_id option. +- [module] Add ModulePackageContainer class. +- [module] Add ModulePersistor class. +- [sack] Module filtering made available in python API +- [sack] Module auto-enabling according to installed packages + +* Fri Jul 27 2018 Igor Gnatenko - 0.16.1-3 +- Rebuild for new binutils + +* Fri Jul 27 2018 Daniel Mach - 0.16.1-2 +- [module] Implement 'module_hotfixes' conf option to skip filtering RPMs from hotfix repos. +- [goal] Fix distupgrade filter, allow downgrades. +- [context] Allow to set module platform in context. +- [module] Introduce proper modular dependency solving. +- [module] Platform pseudo-module based on /etc/os-release. +- [goal] Add Goal::listSuggested(). +- [l10n] Support for translations, add gettext build dependency. + +* Sun Jul 22 2018 Daniel Mach - 0.16.0-1 +- Fix RHSM plugin +- Add support for logging +- Bump minimal libmodulemd version to 1.6.1 + +* Fri Jul 13 2018 Fedora Release Engineering - 0.15.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Fri Jun 29 2018 Jaroslav Mracek - 0.15.2-1 +- Update to 0.15.1 +- Resolves: rhbz#1595487 + +* Fri Jun 29 2018 Igor Gnatenko - 0.15.1-2 +- Restore proper ldconfig_scriptlets + +* Tue Jun 26 2018 Jaroslav Mracek - 0.15.1-1 +- Update to 0.15.1 + +* Fri Jun 15 2018 Miro Hrončok - 0.11.1-6 +- Rebuilt for Python 3.7 + +* Wed Feb 07 2018 Fedora Release Engineering - 0.11.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 30 2018 Igor Gnatenko - 0.11.1-4 +- Switch to %%ldconfig_scriptlets + +* Tue Nov 07 2017 Igor Gnatenko - 0.11.1-3 +- Use better Obsoletes for platform-python + +* Fri Nov 03 2017 Igor Gnatenko - 0.11.1-2 +- Remove platform-python subpackage + +* Mon Oct 16 2017 Jaroslav Mracek - 0.11.1-1 +- Rerelease of 0.11.1-1 +- Improvement query performance +- Run file query in hy_subject_get_best_solution only for files (arguments that start with ``/`` or + ``*/``) +- Resolves: rhbz#1498207 - DNF crash during upgrade installation F26 -> F27 + +* Tue Oct 10 2017 Igor Gnatenko - 0.11.0-1 +- Update to 0.11.0 + +* Mon Oct 02 2017 Jaroslav Mracek - 0.10.1-2 +- Rerelease of 0.10.1-1 + +* Wed Sep 27 2017 Jaroslav Mracek - 0.10.1-1 +- Update to 0.10.1 +- It improves query performance with name and arch filters. Also nevra filter will now + handle string with or without epoch. +- Additionally for python bindings it renames NEVRA._has_just_name() to NEVRA.has_just_name() due + to movement of code into c part of library. +- Resolves: rhbz#1260242 - --exclude does not affect dnf remove's removal of requirements +- Resolves: rhbz#1485881 - DNF claims it cannot install package, which have been already installed +- Resolves: rhbz#1361187 - [abrt] python-ipython-console: filter_updown(): python3.5 killed by SIGABRT + +* Fri Sep 15 2017 Igor Gnatenko - 0.9.3-8 +- Disable platform python on old releases + +* Tue Aug 15 2017 Lumír Balhar - 0.9.3-7 +- Add platform-python subpackage + +* Fri Aug 11 2017 Igor Gnatenko - 0.9.3-6 +- Rebuilt after RPM update (№ 3) + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-5 +- Rebuilt for RPM soname bump + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-4 +- Rebuilt for RPM soname bump + +* Thu Aug 03 2017 Fedora Release Engineering - 0.9.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 0.9.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 24 2017 Jaroslav Mracek - 0.9.3-1 +- Update to 0.9.3 + +* Sat Jul 01 2017 Igor Gnatenko - 0.9.2-1 +- Update to 0.9.2 + +* Mon Jun 12 2017 Jaroslav Mracek - 0.9.1-1 +- Update to 0.9.1 + +* Mon May 22 2017 Jaroslav Mracek - 0.9.0-1 +- Update to 0.9.0 + +* Tue May 02 2017 Jaroslav Mracek - 0.8.2-1 +- Update to 0.8.2 + +* Fri Mar 24 2017 Igor Gnatenko - 0.8.1-1 +- Update to 0.8.1 + +* Tue Mar 21 2017 Jaroslav Mracek - 0.8.0-1 +- Update to 0.8.0 + +* Mon Feb 20 2017 Igor Gnatenko - 0.7.4-1 +- Update to 0.7.4 + +* Fri Feb 10 2017 Igor Gnatenko - 0.7.3-1 +- Update to 0.7.3 + +* Wed Feb 08 2017 Igor Gnatenko - 0.7.2-1 +- 0.7.2 + +* Fri Jan 06 2017 Igor Gnatenko - 0.7.1-1 +- 0.7.1 + +* Wed Dec 21 2016 Peter Robinson 0.7.0-0.7gitf9b798c +- Rebuild for Python 3.6 + +* Mon Dec 19 2016 Igor Gnatenko - 0.7.0-0.6gitf9b798c +- Use new upstream URL + +* Tue Dec 13 2016 Stratakis Charalampos - 0.7.0-0.5gitf9b798c +- Rebuild for Python 3.6 + +* Tue Dec 06 2016 Martin Hatina - 0.7.0-0.4gitf9b798c +- Increase conflict version of dnf + +* Thu Dec 01 2016 Igor Gnatenko - 0.7.0-0.3gitf9b798c +- Update to latest snapshot + +* Fri Nov 04 2016 Igor Gnatenko - 0.7.0-0.2git8bd77f8 +- Update to latest snapshot + +* Thu Sep 29 2016 Igor Gnatenko - 0.7.0-0.1git179c0a6 +- Initial package