import libdnf-0.48.0-2.el8

This commit is contained in:
CentOS Sources 2020-07-28 05:06:41 -04:00 committed by Stepan Oksanichenko
parent bee9b9d50e
commit 574533247f
5 changed files with 352 additions and 149 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/libdnf-0.39.1.tar.gz
SOURCES/libdnf-0.48.0.tar.gz

View File

@ -1 +1 @@
a74a37b029439749298705ff3c1ccfbd0f0fd821 SOURCES/libdnf-0.39.1.tar.gz
452c2195741b627bd97b0be11cd4a4dc4118e330 SOURCES/libdnf-0.48.0.tar.gz

View File

@ -0,0 +1,244 @@
From a96d701f7f55ff475e11ac9cda63b81c31c54e7a Mon Sep 17 00:00:00 2001
From: Daniel Mach <dmach@redhat.com>
Date: Wed, 6 May 2020 08:34:46 +0200
Subject: [PATCH] history: Fix dnf history rollback when a package was removed
(RhBug:1683134)
---
libdnf/transaction/MergedTransaction.cpp | 25 +++-
.../transaction/MergedTransactionTest.cpp | 120 ++++++++++++++++--
.../transaction/MergedTransactionTest.hpp | 6 +-
3 files changed, 137 insertions(+), 14 deletions(-)
diff --git a/libdnf/transaction/MergedTransaction.cpp b/libdnf/transaction/MergedTransaction.cpp
index a7c06ffa9..a8d878cb5 100644
--- a/libdnf/transaction/MergedTransaction.cpp
+++ b/libdnf/transaction/MergedTransaction.cpp
@@ -19,6 +19,7 @@
*/
#include "MergedTransaction.hpp"
+#include <algorithm>
#include <vector>
namespace libdnf {
@@ -171,6 +172,21 @@ MergedTransaction::getConsoleOutput()
return output;
}
+
+static bool transaction_item_sort_function(const std::shared_ptr<TransactionItemBase> lhs, const std::shared_ptr<TransactionItemBase> rhs) {
+ if (lhs->isForwardAction() && rhs->isForwardAction()) {
+ return false;
+ }
+ if (lhs->isBackwardAction() && rhs->isBackwardAction()) {
+ return false;
+ }
+ if (lhs->isBackwardAction()) {
+ return true;
+ }
+ return false;
+}
+
+
/**
* Get list of transaction items involved in the merged transaction
* Actions are merged using following rules:
@@ -203,6 +219,9 @@ MergedTransaction::getItems()
// iterate over transaction
for (auto t : transactions) {
auto transItems = t->getItems();
+ // sort transaction items by their action type - forward/backward
+ // this fixes behavior of the merging algorithm in several edge cases
+ std::sort(transItems.begin(), transItems.end(), transaction_item_sort_function);
// iterate over transaction items
for (auto transItem : transItems) {
// get item and its type
@@ -383,10 +402,6 @@ MergedTransaction::mergeItem(ItemPairMap &itemPairMap, TransactionItemBasePtr mT
auto firstState = previousItemPair.first->getAction();
auto newState = mTransItem->getAction();
- if (firstState == TransactionItemAction::INSTALL && mTransItem->isBackwardAction()) {
- return;
- }
-
switch (firstState) {
case TransactionItemAction::REMOVE:
case TransactionItemAction::OBSOLETED:
@@ -399,6 +414,8 @@ MergedTransaction::mergeItem(ItemPairMap &itemPairMap, TransactionItemBasePtr mT
// Install -> Remove = (nothing)
itemPairMap.erase(name);
break;
+ } else if (mTransItem->isBackwardAction()) {
+ break;
}
// altered -> transfer install to the altered package
mTransItem->setAction(TransactionItemAction::INSTALL);
diff --git a/tests/libdnf/transaction/MergedTransactionTest.cpp b/tests/libdnf/transaction/MergedTransactionTest.cpp
index 90ad182cf..52507700b 100644
--- a/tests/libdnf/transaction/MergedTransactionTest.cpp
+++ b/tests/libdnf/transaction/MergedTransactionTest.cpp
@@ -700,7 +700,7 @@ MergedTransactionTest::test_downgrade()
}
void
-MergedTransactionTest::test_install_downgrade()
+MergedTransactionTest::test_install_downgrade_upgrade_remove()
{
auto trans1 = std::make_shared< libdnf::swdb_private::Transaction >(conn);
trans1->addItem(
@@ -724,19 +724,123 @@ MergedTransactionTest::test_install_downgrade()
TransactionItemReason::USER
);
+ auto trans3 = std::make_shared< libdnf::swdb_private::Transaction >(conn);
+ trans3->addItem(
+ nevraToRPMItem(conn, "tour-0:4.6-1.noarch"),
+ "repo2",
+ TransactionItemAction::UPGRADED,
+ TransactionItemReason::USER
+ );
+ trans3->addItem(
+ nevraToRPMItem(conn, "tour-0:4.8-1.noarch"),
+ "repo1",
+ TransactionItemAction::UPGRADE,
+ TransactionItemReason::USER
+ );
+
+ auto trans4 = std::make_shared< libdnf::swdb_private::Transaction >(conn);
+ trans4->addItem(
+ nevraToRPMItem(conn, "tour-0:4.8-1.noarch"),
+ "repo1",
+ TransactionItemAction::REMOVE,
+ TransactionItemReason::USER
+ );
+
MergedTransaction merged(trans1);
+
+ // test merging trans1, trans2
merged.merge(trans2);
+ auto items2 = merged.getItems();
+ CPPUNIT_ASSERT_EQUAL(1, (int)items2.size());
+ auto item2 = items2.at(0);
+ CPPUNIT_ASSERT_EQUAL(std::string("tour-4.6-1.noarch"), item2->getItem()->toStr());
+ CPPUNIT_ASSERT_EQUAL(std::string("repo2"), item2->getRepoid());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemAction::INSTALL, item2->getAction());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemReason::USER, item2->getReason());
- auto items = merged.getItems();
- CPPUNIT_ASSERT_EQUAL(1, (int)items.size());
+ // test merging trans1, trans2, trans3
+ merged.merge(trans3);
+ auto items3 = merged.getItems();
+ CPPUNIT_ASSERT_EQUAL(1, (int)items3.size());
+ auto item3 = items3.at(0);
+ CPPUNIT_ASSERT_EQUAL(std::string("tour-4.8-1.noarch"), item3->getItem()->toStr());
+ CPPUNIT_ASSERT_EQUAL(std::string("repo1"), item3->getRepoid());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemAction::INSTALL, item3->getAction());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemReason::USER, item3->getReason());
- auto item = items.at(0);
- CPPUNIT_ASSERT_EQUAL(std::string("tour-4.6-1.noarch"), item->getItem()->toStr());
- CPPUNIT_ASSERT_EQUAL(std::string("repo2"), item->getRepoid());
- CPPUNIT_ASSERT_EQUAL(TransactionItemAction::INSTALL, item->getAction());
- CPPUNIT_ASSERT_EQUAL(TransactionItemReason::USER, item->getReason());
+ // test merging trans1, trans2, trans3, trans4
+ merged.merge(trans4);
+ auto items4 = merged.getItems();
+ CPPUNIT_ASSERT_EQUAL(0, (int)items4.size());
+ // trans4 removes the package, empty output is expected
}
+
+void
+MergedTransactionTest::test_downgrade_upgrade_remove()
+{
+ auto trans1 = std::make_shared< libdnf::swdb_private::Transaction >(conn);
+ trans1->addItem(
+ nevraToRPMItem(conn, "tour-0:4.6-1.noarch"),
+ "repo2",
+ TransactionItemAction::DOWNGRADE,
+ TransactionItemReason::USER
+ );
+ trans1->addItem(
+ nevraToRPMItem(conn, "tour-0:4.8-1.noarch"),
+ "repo1",
+ TransactionItemAction::DOWNGRADED,
+ TransactionItemReason::USER
+ );
+
+ // items are in reversed order than in test_install_downgrade_upgrade_remove()
+ // fixing this required ordering transaction items by forward/backward action
+ auto trans2 = std::make_shared< libdnf::swdb_private::Transaction >(conn);
+ trans2->addItem(
+ nevraToRPMItem(conn, "tour-0:4.8-1.noarch"),
+ "repo1",
+ TransactionItemAction::UPGRADE,
+ TransactionItemReason::USER
+ );
+ trans2->addItem(
+ nevraToRPMItem(conn, "tour-0:4.6-1.noarch"),
+ "repo2",
+ TransactionItemAction::UPGRADED,
+ TransactionItemReason::USER
+ );
+
+ auto trans3 = std::make_shared< libdnf::swdb_private::Transaction >(conn);
+ trans3->addItem(
+ nevraToRPMItem(conn, "tour-0:4.8-1.noarch"),
+ "repo1",
+ TransactionItemAction::REMOVE,
+ TransactionItemReason::USER
+ );
+
+ MergedTransaction merged(trans1);
+
+ // test merging trans1, trans2
+ merged.merge(trans2);
+ auto items2 = merged.getItems();
+ CPPUNIT_ASSERT_EQUAL(1, (int)items2.size());
+ auto item2 = items2.at(0);
+ CPPUNIT_ASSERT_EQUAL(std::string("tour-4.8-1.noarch"), item2->getItem()->toStr());
+ CPPUNIT_ASSERT_EQUAL(std::string("repo1"), item2->getRepoid());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemAction::REINSTALL, item2->getAction());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemReason::USER, item2->getReason());
+
+ // test merging trans1, trans2, trans3
+ merged.merge(trans3);
+ auto items3 = merged.getItems();
+ CPPUNIT_ASSERT_EQUAL(1, (int)items3.size());
+ auto item3 = items3.at(0);
+ CPPUNIT_ASSERT_EQUAL(std::string("tour-4.8-1.noarch"), item3->getItem()->toStr());
+ CPPUNIT_ASSERT_EQUAL(std::string("repo1"), item3->getRepoid());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemAction::REMOVE, item3->getAction());
+ CPPUNIT_ASSERT_EQUAL(TransactionItemReason::USER, item3->getReason());
+}
+
+
void
MergedTransactionTest::test_multilib_identity()
{
diff --git a/tests/libdnf/transaction/MergedTransactionTest.hpp b/tests/libdnf/transaction/MergedTransactionTest.hpp
index 9f1ed660a..77585e865 100644
--- a/tests/libdnf/transaction/MergedTransactionTest.hpp
+++ b/tests/libdnf/transaction/MergedTransactionTest.hpp
@@ -26,7 +26,8 @@ class MergedTransactionTest : public CppUnit::TestCase {
CPPUNIT_TEST(test_add_obsoleted_obsoleted);
CPPUNIT_TEST(test_downgrade);
- CPPUNIT_TEST(test_install_downgrade);
+ CPPUNIT_TEST(test_install_downgrade_upgrade_remove);
+ CPPUNIT_TEST(test_downgrade_upgrade_remove);
CPPUNIT_TEST(test_multilib_identity);
@@ -56,7 +57,8 @@ class MergedTransactionTest : public CppUnit::TestCase {
// END: tests ported from DNF unit tests
void test_downgrade();
- void test_install_downgrade();
+ void test_install_downgrade_upgrade_remove();
+ void test_downgrade_upgrade_remove();
void test_multilib_identity();
private:

View File

@ -1,131 +0,0 @@
From 1dffef87fc2f07763f64eeabc1ea891e68d23541 Mon Sep 17 00:00:00 2001
From: Michal Domonkos <mdomonko@redhat.com>
Date: Tue, 26 Nov 2019 13:05:49 +0100
Subject: [PATCH] [user-agent] Drop the whitelist
- Stop checking os-release(5) data against a hard-coded whitelist and
just use them as they are, to avoid a maintenance burden in the
future (see [1] for details)
- Clean up the getUserAgent() function a bit
Note that, by removing the whitelist, there's a risk of leaking a
"unique" value from the os-release file now, but a rather small one.
[1] https://github.com/rpm-software-management/libdnf/pull/851
---
libdnf/utils/os-release.cpp | 58 ++++++++++++++++++++--------------------------------------
libdnf/utils/os-release.hpp | 7 ++-----
2 files changed, 22 insertions(+), 43 deletions(-)
diff --git a/libdnf/utils/os-release.cpp b/libdnf/utils/os-release.cpp
index 57be110..1d8a95b 100644
--- a/libdnf/utils/os-release.cpp
+++ b/libdnf/utils/os-release.cpp
@@ -36,17 +36,8 @@
namespace libdnf {
// sorted by precedence (see os-release(5) for details)
-static const std::array<const std::string, 2> paths = {"/etc/os-release", "/usr/lib/os-release"};
-// whitelists used for sanity-checking the os-release data when constructing a
-// User-Agent string (to avoid reporting rare systems or platforms that could
-// be tracked)
-static const std::map<std::string, std::vector<std::string>> distros = {
- // taken from the {fedora,generic}-release.spec files
- { "Fedora", { "cinnamon", "cloud", "container", "coreos", "generic", "iot",
- "kde", "matecompiz", "server", "silverblue", "snappy", "soas",
- "workstation", "xfce" } },
-};
-std::array<const std::string, 1> canons = { "Linux" };
+static const std::array<const std::string, 2>
+paths = {"/etc/os-release", "/usr/lib/os-release"};
std::map<std::string, std::string> getOsReleaseData()
{
@@ -118,47 +109,38 @@ std::string getUserAgent(const std::map<std::string, std::string> & osReleaseDat
{
std::ostringstream oss;
auto logger(Log::getLogger());
- std::string msg = "os-release: falling back to basic User-Agent";
- // start with the basic libdnf string
oss << USER_AGENT;
+ std::string fallback = oss.str();
- // mandatory OS data (bail out if missing or unknown)
if (!osReleaseData.count("NAME") || !osReleaseData.count("VERSION_ID")) {
- logger->debug(tfm::format("%s: missing NAME or VERSION_ID", msg));
- return oss.str();
+ logger->debug(tfm::format(
+ "User-Agent: falling back to '%s': missing NAME or VERSION_ID",
+ fallback
+ ));
+ return fallback;
}
std::string name = osReleaseData.at("NAME");
std::string version = osReleaseData.at("VERSION_ID");
- if (!distros.count(name)) {
- logger->debug(tfm::format("%s: distro %s not whitelisted", msg, name));
- return oss.str();
- }
+ std::string variant = "generic";
+ if (osReleaseData.count("VARIANT_ID"))
+ variant = osReleaseData.at("VARIANT_ID");
- // mandatory platform data from RPM (bail out if missing or unknown)
std::string canon = getCanonOs();
std::string arch = getBaseArch();
- if (canon.empty() || arch.empty()
- || std::find(canons.begin(), canons.end(), canon) == canons.end()) {
- logger->debug(tfm::format("%s: could not detect canonical OS or basearch", msg));
- return oss.str();
- }
-
- // optional OS data (use fallback values if missing or unknown)
- std::string variant = "generic";
- auto list = distros.at(name);
- if (osReleaseData.count("VARIANT_ID")) {
- std::string value = osReleaseData.at("VARIANT_ID");
- if (std::find(list.begin(), list.end(), value) != list.end())
- variant = value;
+ if (canon.empty() || arch.empty()) {
+ logger->debug(tfm::format(
+ "User-Agent: falling back to '%s': could not detect OS or basearch",
+ fallback
+ ));
+ return fallback;
}
- // good to go!
- oss << " (" << name << " " << version << "; " << variant << "; "
- << canon << "." << arch << ")";
+ oss << " (" << name << " " << version << "; " << variant << "; " << canon
+ << "." << arch << ")";
std::string result = oss.str();
- logger->debug(tfm::format("os-release: User-Agent constructed: %s", result));
+ logger->debug(tfm::format("User-Agent: constructed: '%s'", result));
return result;
}
diff --git a/libdnf/utils/os-release.hpp b/libdnf/utils/os-release.hpp
index ef4d14f..e7b24a7 100644
--- a/libdnf/utils/os-release.hpp
+++ b/libdnf/utils/os-release.hpp
@@ -50,11 +50,8 @@ getOsReleaseData();
* libdnf (NAME VERSION_ID; VARIANT_ID; OS.BASEARCH)
*
* where NAME, VERSION_ID and VARIANT_ID are OS identifiers read from the
- * passed os-release data, and OS and BASEARCH (if found) are the canonical OS
- * name and base architecture, respectively, detected using RPM.
- *
- * Note that the OS part (enclosed in parentheses) will only be included for
- * whitelisted values.
+ * passed os-release data, and OS and BASEARCH are the canonical OS name and
+ * base architecture, respectively, detected using RPM.
*
* @param osReleaseData a map containing os-release data (will be loaded from
* disk if not specified)
--
libgit2 0.28.2

View File

@ -1,8 +1,11 @@
%global libsolv_version 0.7.7
%global libmodulemd_version 1.6.1
%global librepo_version 1.11.0
%global dnf_conflict 4.2.13
%global libmodulemd_version 2.5.0
%global librepo_version 1.12.0
%global dnf_conflict 4.2.23
%global swig_version 3.0.12
%global libdnf_major_version 0
%global libdnf_minor_version 48
%global libdnf_micro_version 0
# set sphinx package name according to distro
%global requires_python2_sphinx python2-sphinx
@ -43,18 +46,20 @@
%bcond_without zchunk
%endif
%bcond_with sanitizers
%global _cmake_opts \\\
-DENABLE_RHSM_SUPPORT=%{?with_rhsm:ON}%{!?with_rhsm:OFF} \\\
%{nil}
Name: libdnf
Version: 0.39.1
Version: %{libdnf_major_version}.%{libdnf_minor_version}.%{libdnf_micro_version}
Release: 2%{?dist}
Summary: Library providing simplified C and Python API to libsolv
License: LGPLv2+
URL: https://github.com/rpm-software-management/libdnf
Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz
Patch1: 0001-user-agent-Drop-the-whitelist.patch
Patch1: 0001-history-Fix-dnf-history-rollback-when-a-package-was-removed-RhBug1683134.patch
BuildRequires: cmake
BuildRequires: gcc
@ -78,11 +83,17 @@ BuildRequires: pkgconfig(sqlite3)
BuildRequires: pkgconfig(json-c)
BuildRequires: pkgconfig(cppunit)
BuildRequires: pkgconfig(libcrypto)
BuildRequires: pkgconfig(modulemd) >= %{libmodulemd_version}
BuildRequires: pkgconfig(modulemd-2.0) >= %{libmodulemd_version}
BuildRequires: pkgconfig(smartcols)
BuildRequires: gettext
BuildRequires: gpgme-devel
%if %{with sanitizers}
BuildRequires: libasan-static
BuildRequires: liblsan-static
BuildRequires: libubsan-static
%endif
Requires: libmodulemd%{?_isa} >= %{libmodulemd_version}
Requires: libsolv%{?_isa} >= %{libsolv_version}
Requires: librepo%{?_isa} >= %{librepo_version}
@ -125,7 +136,8 @@ BuildRequires: swig >= %{swig_version}
%description -n python2-%{name}
Python 2 bindings for the libdnf library.
%endif # with python2
%endif
# endif with python2
%if %{with python3}
%package -n python3-%{name}
@ -159,7 +171,8 @@ Conflicts: python-dnf < %{dnf_conflict}
%description -n python2-hawkey
Python 2 bindings for the hawkey library.
%endif # with python2
%endif
# endif with python2
%if %{with python3}
%package -n python3-hawkey
@ -183,7 +196,7 @@ Python 3 bindings for the hawkey library.
%autosetup -p1
%if %{with python2}
mkdir build-py2
%endif # with python2
%endif
%if %{with python3}
mkdir build-py3
%endif
@ -196,10 +209,12 @@ pushd build-py2
%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}
%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 # with python2
%endif
# endif with python2
%if %{with python3}
pushd build-py3
@ -208,7 +223,8 @@ pushd build-py3
%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}
%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
@ -218,7 +234,7 @@ popd
pushd build-py2
make ARGS="-V" test
popd
%endif # with python2
%endif
%if %{with python3}
# If we didn't run the general tests yet, do it now.
%if %{without python2}
@ -240,7 +256,7 @@ popd
pushd build-py2
%make_install
popd
%endif # with python2
%endif
%if %{with python3}
pushd build-py3
%make_install
@ -273,7 +289,7 @@ popd
%if %{with python2}
%files -n python2-%{name}
%{python2_sitearch}/%{name}/
%endif # with python2
%endif
%if %{with python3}
%files -n python3-%{name}
@ -283,7 +299,7 @@ popd
%if %{with python2}
%files -n python2-hawkey
%{python2_sitearch}/hawkey/
%endif # with python2
%endif
%if %{with python3}
%files -n python3-hawkey
@ -291,6 +307,80 @@ popd
%endif
%changelog
* Wed Jun 10 2020 Ales Matej <amatej@redhat.com> - 0.48.0-2
- [history] Fix dnf history rollback when a package was removed (RhBug:1683134)
* Wed Jun 03 2020 Nicola Sella <nsella@redhat.com> - 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 Apr 03 2020 Ales Matej <amatej@redhat.com> - 0.47.0-1
- Update to 0.47.0
- Allow excluding packages with "excludepkgs" and globs
- Make parsing of reldeps more strict (RhBug:1788107)
- Add expanding solvable provides for dependency matching (RhBug:1534123)
- DnfRepo: fix module_hotfixes keyfile priority level
- Add custom exceptions to libdnf interface
- Port to libmodulemd-2 API (RhBug:1693683)
- 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)
- Baseurl is not exclusive with mirrorlist/metalink (RhBug:1775184)
- Add new function to reset all modules in C API (dnf_context_reset_all_modules)
- Handle situation when an unprivileged user cannot create history database (RhBug:1634385)
- Add query filter: latest by priority
- Add setter for running kernel protection setting
- Add DNF_NO_PROTECTED flag to allow empty list of protected packages
- Config options: only first empty value clears existing (RhBug:1788154)
- [conf] Set useful default colors when color is enabled
- [context] Use installonly_limit from global config (RhBug:1256108)
- [context] Add API to get/set "install_weak_deps"
- [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
- [context] Create new repo instead of reusing old one (RhBug:1795004)
- [context] Error when main config file can't be opened (RhBug:1794864)
- [context] Add function function dnf_context_is_set_config_file_path
- [context] Support repositories defined in main configuration file
* Tue Feb 18 2020 Ales Matej <amatej@redhat.com> - 0.39.1-5
- Fix filtering of packages by advisory (RhBug:1770125)
* Fri Jan 31 2020 Marek Blaha <mblaha@redhat.com> - 0.39.1-4
- [translations] Update translations from zanata (RhBug:1754965)
* Mon Jan 13 2020 Ales Matej <amatej@redhat.com> - 0.39.1-3
- Add two new query filters: obsoletes_by_priority, upgrades_by_priority (RhBug:1769466)
- [context] Add wildcard support in dnf_context_repo_set_data (RhBug:1781420)
- Remove killGpgAgent function (RhBug:1781601)
* Thu Dec 12 2019 Pavla Kratochvilova <pkratoch@redhat.com> - 0.39.1-2
- [user-agent] Stop checking os-release(5) data against a hard-coded whitelist (RhBug:1777255)