diff --git a/.dnf.metadata b/.dnf.metadata
new file mode 100644
index 0000000..cb4f5fb
--- /dev/null
+++ b/.dnf.metadata
@@ -0,0 +1 @@
+2b22746950312972466fb32d74c79ca42a367cf7 SOURCES/dnf-2.7.5-modularity-6.tar.gz
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..20da192
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/dnf-2.7.5-modularity-6.tar.gz
diff --git a/README.md b/README.md
deleted file mode 100644
index 98f42b4..0000000
--- a/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-The master branch has no content
-
-Look at the c7 branch if you are working with CentOS-7, or the c4/c5/c6 branch for CentOS-4, 5 or 6
-If you find this file in a distro specific branch, it means that no content has been checked in yet
diff --git a/SOURCES/0001-Allow-to-set-cacheonly-from-commands-and-conf-RhBug-.patch b/SOURCES/0001-Allow-to-set-cacheonly-from-commands-and-conf-RhBug-.patch
new file mode 100644
index 0000000..703ad04
--- /dev/null
+++ b/SOURCES/0001-Allow-to-set-cacheonly-from-commands-and-conf-RhBug-.patch
@@ -0,0 +1,32 @@
+From bc11bf599ce3102656fa42b0ad0a6c7270822f30 Mon Sep 17 00:00:00 2001
+From: Jaroslav Mracek <jmracek@redhat.com>
+Date: Mon, 27 Nov 2017 14:35:32 +0100
+Subject: [PATCH 1/3] Allow to set cacheonly from commands and conf
+ (RhBug:1492036)
+
+The formal code reacts only to --cacheonly option.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1492036
+---
+ dnf/cli/cli.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
+index f60cdced..11fbed31 100644
+--- a/dnf/cli/cli.py
++++ b/dnf/cli/cli.py
+@@ -741,7 +741,10 @@ class Cli(object):
+             if not os.getegid() == 0:
+                 raise dnf.exceptions.Error(_('This command has to be run under the root user.'))
+ 
+-        if not demands.cacheonly:
++        if demands.cacheonly or self.base.conf.cacheonly:
++            self.base.conf.cacheonly = True
++            repos.all()._md_only_cached = True
++        else:
+             if demands.freshest_metadata:
+                 for repo in repos.iter_enabled():
+                     repo._md_expire_cache()
+-- 
+2.13.6
+
diff --git a/SOURCES/0002-Remove-redundant-conf-option-cacheonly.patch b/SOURCES/0002-Remove-redundant-conf-option-cacheonly.patch
new file mode 100644
index 0000000..8005180
--- /dev/null
+++ b/SOURCES/0002-Remove-redundant-conf-option-cacheonly.patch
@@ -0,0 +1,25 @@
+From 777df1098f4215edb8339a56c1807c9217715142 Mon Sep 17 00:00:00 2001
+From: Jaroslav Mracek <jmracek@redhat.com>
+Date: Mon, 27 Nov 2017 14:38:08 +0100
+Subject: [PATCH 2/3] Remove redundant conf option cacheonly
+
+The option was defined twice in "dnf.conf".
+---
+ dnf/conf/config.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/dnf/conf/config.py b/dnf/conf/config.py
+index f0c39665..f2098fc6 100644
+--- a/dnf/conf/config.py
++++ b/dnf/conf/config.py
+@@ -778,7 +778,6 @@ class MainConf(BaseConfig):
+         # runtime only options
+         self._add_option('downloadonly', BoolOption(False, runtimeonly=True))
+         self._add_option('ignorearch', BoolOption(False))
+-        self._add_option('cacheonly', BoolOption(False))
+ 
+     @property
+     def get_reposdir(self):
+-- 
+2.13.6
+
diff --git a/SOURCES/0003-Remove-unnecessary-code-for-set-cacheonly.patch b/SOURCES/0003-Remove-unnecessary-code-for-set-cacheonly.patch
new file mode 100644
index 0000000..2be79b0
--- /dev/null
+++ b/SOURCES/0003-Remove-unnecessary-code-for-set-cacheonly.patch
@@ -0,0 +1,44 @@
+From aebbc222b85a7949a705360ea51b7c987126c2d8 Mon Sep 17 00:00:00 2001
+From: Jaroslav Mracek <jmracek@redhat.com>
+Date: Tue, 28 Nov 2017 09:21:40 +0100
+Subject: [PATCH 3/3] Remove unnecessary code for set cacheonly
+
+Attribute repo._md_only_cached is set on different place during
+_progress_demands().
+---
+ dnf/repo.py       | 5 -----
+ tests/test_cli.py | 2 --
+ 2 files changed, 7 deletions(-)
+
+diff --git a/dnf/repo.py b/dnf/repo.py
+index e9ce597e..75a11a47 100644
+--- a/dnf/repo.py
++++ b/dnf/repo.py
+@@ -858,11 +858,6 @@ class Repo(dnf.conf.RepoConf):
+         else:
+             return self._try_revive_by_repomd()
+ 
+-    def _configure_from_options(self, opts):
+-        if getattr(opts, 'cacheonly', None):
+-            self._md_only_cached = True
+-        super(Repo, self)._configure_from_options(opts)
+-
+     def disable(self):
+         # :api
+         self.enabled = False
+diff --git a/tests/test_cli.py b/tests/test_cli.py
+index f4ea27ee..8963783a 100644
+--- a/tests/test_cli.py
++++ b/tests/test_cli.py
+@@ -136,8 +136,6 @@ class CliTest(TestCase):
+         self.assertTrue(self.base.repos['comb'].enabled)
+         self.assertFalse(self.base.repos["comb"].gpgcheck)
+         self.assertFalse(self.base.repos["comb"].repo_gpgcheck)
+-        self.assertEqual(self.base.repos["comb"]._sync_strategy,
+-                         dnf.repo.SYNC_ONLY_CACHE)
+ 
+     def test_configure_repos_expired(self, _):
+         """Ensure that --cacheonly beats the expired status."""
+-- 
+2.13.6
+
diff --git a/SOURCES/0005-compatibility-gpgme.patch b/SOURCES/0005-compatibility-gpgme.patch
new file mode 100644
index 0000000..3f7d402
--- /dev/null
+++ b/SOURCES/0005-compatibility-gpgme.patch
@@ -0,0 +1,118 @@
+diff --git a/dnf/crypto.py b/dnf/crypto.py
+index a1839eefe..24a13ed6f 100644
+--- a/dnf/crypto.py
++++ b/dnf/crypto.py
+@@ -26,12 +26,64 @@
+ import dnf.pycomp
+ import dnf.util
+ import dnf.yum.misc
+-import gpg
+ import io
+ import logging
+ import os
+ import tempfile
+ 
++try:
++    from gpg import Context
++    from gpg import Data
++except ImportError:
++    import gpgme
++
++
++    class Context(object):
++        def __init__(self):
++            self.__dict__["ctx"] = gpgme.Context()
++
++        def __enter__(self):
++            return self
++
++        def __exit__(self, type, value, tb):
++            pass
++
++        @property
++        def armor(self):
++            return self.ctx.armor
++
++        @armor.setter
++        def armor(self, value):
++            self.ctx.armor = value
++
++        def op_import(self, key_fo):
++            if isinstance(key_fo, basestring):
++                key_fo = io.BytesIO(key_fo)
++            self.ctx.import_(key_fo)
++
++        def op_export(self, pattern, mode, keydata):
++            self.ctx.export(pattern, keydata)
++
++        def __getattr__(self, name):
++            return getattr(self.ctx, name)
++
++
++    class Data(object):
++        def __init__(self):
++            self.__dict__["buf"] = io.BytesIO()
++
++        def __enter__(self):
++            return self
++
++        def __exit__(self, type, value, tb):
++            pass
++
++        def read(self):
++            return self.buf.getvalue()
++
++        def __getattr__(self, name):
++            return getattr(self.buf, name)
++
+ 
+ GPG_HOME_ENV = 'GNUPGHOME'
+ logger = logging.getLogger('dnf')
+@@ -67,7 +119,7 @@ def keyids_from_pubring(gpgdir):
+     if not os.path.exists(gpgdir):
+         return []
+ 
+-    with pubring_dir(gpgdir), gpg.Context() as ctx:
++    with pubring_dir(gpgdir), Context() as ctx:
+         keyids = []
+         for k in ctx.keylist():
+             subkey = _extract_signing_subkey(k)
+@@ -101,7 +153,7 @@ def pubring_dir(pubring_dir):
+ def rawkey2infos(key_fo):
+     pb_dir = tempfile.mkdtemp()
+     keyinfos = []
+-    with pubring_dir(pb_dir), gpg.Context() as ctx:
++    with pubring_dir(pb_dir), Context() as ctx:
+         ctx.op_import(key_fo)
+         for key in ctx.keylist():
+             subkey = _extract_signing_subkey(key)
+@@ -110,7 +162,7 @@ def rawkey2infos(key_fo):
+             keyinfos.append(Key(key, subkey))
+         ctx.armor = True
+         for info in keyinfos:
+-            with gpg.Data() as sink:
++            with Data() as sink:
+                 ctx.op_export(info.id_, 0, sink)
+                 sink.seek(0, os.SEEK_SET)
+                 info.raw_key = sink.read()
+diff --git a/dnf/yum/misc.py b/dnf/yum/misc.py
+index 97f8be94d..248bff884 100644
+--- a/dnf/yum/misc.py
++++ b/dnf/yum/misc.py
+@@ -32,7 +32,6 @@
+ import dnf.i18n
+ import errno
+ import glob
+-import gpg
+ import gzip
+ import hashlib
+ import io
+@@ -278,7 +277,7 @@ def import_key_to_pubring(rawkey, keyid, gpgdir=None, make_ro_copy=True):
+     if not os.path.exists(gpgdir):
+         os.makedirs(gpgdir)
+ 
+-    with dnf.crypto.pubring_dir(gpgdir), gpg.Context() as ctx:
++    with dnf.crypto.pubring_dir(gpgdir), dnf.crypto.Context() as ctx:
+         # import the key
+         with open(os.path.join(gpgdir, 'gpg.conf'), 'wb') as fp:
+             fp.write(b'')
diff --git a/SOURCES/0006-util-Correctly-source-errno.EEXIST.patch b/SOURCES/0006-util-Correctly-source-errno.EEXIST.patch
new file mode 100644
index 0000000..20b5437
--- /dev/null
+++ b/SOURCES/0006-util-Correctly-source-errno.EEXIST.patch
@@ -0,0 +1,33 @@
+From 199fc9cb11ff004fc752b58b7177aaf8d7fcedfd Mon Sep 17 00:00:00 2001
+From: Neal Gompa <ngompa13@gmail.com>
+Date: Sat, 3 Mar 2018 12:44:54 -0500
+Subject: [PATCH] util: Correctly source errno.EEXIST
+
+---
+ dnf/util.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/dnf/util.py b/dnf/util.py
+index ab7fd279..d0f1a4f2 100644
+--- a/dnf/util.py
++++ b/dnf/util.py
+@@ -28,6 +28,7 @@ from functools import reduce
+ import dnf
+ import dnf.const
+ import dnf.pycomp
++import errno
+ import itertools
+ import librepo
+ import locale
+@@ -120,7 +121,7 @@ def ensure_dir(dname):
+     try:
+         os.makedirs(dname, mode=0o755)
+     except OSError as e:
+-        if e.errno != os.errno.EEXIST or not os.path.isdir(dname):
++        if e.errno != errno.EEXIST or not os.path.isdir(dname):
+             raise e
+ 
+ def empty(iterable):
+-- 
+2.17.0
+
diff --git a/SOURCES/0007-fix-tests.patch b/SOURCES/0007-fix-tests.patch
new file mode 100644
index 0000000..3ce9a76
--- /dev/null
+++ b/SOURCES/0007-fix-tests.patch
@@ -0,0 +1,28 @@
+diff --git a/tests/test_history_undo.py b/tests/test_history_undo.py
+index 5c7e423c..a551336b 100644
+--- a/tests/test_history_undo.py
++++ b/tests/test_history_undo.py
+@@ -30,6 +30,7 @@ from dnf.transaction import (ERASE, DOWNGRADE, INSTALL, REINSTALL,
+ from hawkey import split_nevra
+ from tests.support import mock_sack, Base, ObjectMatcher
+ from unittest import TestCase
++import tempfile
+ 
+ class BaseTest(TestCase):
+     """Unit tests of dnf.Base."""
+@@ -60,6 +61,7 @@ class BaseTest(TestCase):
+     def setUp(self):
+         """Prepare the test fixture."""
+         self._base = Base()
++        self._base.conf.persistdir = tempfile.mkdtemp()
+         self._base._sack = mock_sack('main', 'updates')
+ 
+     def test_history_undo_operations_downgrade(self):
+@@ -113,6 +115,7 @@ class BaseTest(TestCase):
+     def test_history_undo_operations_erase_twoavailable(self):
+         """Test history_undo_operations with an erase available in two repos."""
+         base = Base()
++        base.conf.persistdir = tempfile.mkdtemp()
+         base._sack = mock_sack('main', 'search')
+         operations = NEVRAOperations()
+         operations.add('Erase', 'lotus-3-16.x86_64')
diff --git a/SPECS/dnf.spec b/SPECS/dnf.spec
new file mode 100644
index 0000000..512bf90
--- /dev/null
+++ b/SPECS/dnf.spec
@@ -0,0 +1,984 @@
+# default dependencies
+%global hawkey_version 0.11.1
+%global librepo_version 1.8.1
+%global libcomps_version 0.1.8
+%global libmodulemd_version 1.4.0
+%global python_smartcols_version 0.3.0
+%global rpm_version 4.14.0
+
+# conflicts
+%global conflicts_dnf_plugins_core_version 2.1.3
+
+# override dependencies for rhel 7
+%if 0%{?rhel} == 7
+    %global rpm_version 4.11.3-32
+%endif
+
+%if 0%{?rhel} == 7 && 0%{?centos}
+    %global rpm_version 4.11.3-25.el7.centos.1
+%endif
+
+# override dependencies for fedora 26
+%if 0%{?fedora} == 26
+    %global rpm_version 4.13.0.1-7
+%endif
+
+
+%if 0%{?rhel} && 0%{?rhel} <= 7
+%bcond_with python3
+%else
+%bcond_without python3
+%endif
+
+%if 0%{?rhel} >= 8
+%bcond_with python2
+%else
+%bcond_without python2
+%endif
+
+# configurable name for the compat yum package
+%global yum_subpackage_name %{name}-yum
+
+# provide yum4 on rhel <= 7 to avoid conflict with existing yum
+%if 0%{?rhel} && 0%{?rhel} <= 7
+    %global yum_subpackage_name nextgen-yum4
+%endif
+
+# provide yum on rhel >= 8, it replaces old yum
+%if 0%{?rhel} && 0%{?rhel} >= 8
+    %global yum_subpackage_name yum
+%endif
+
+
+# paths
+%global confdir %{_sysconfdir}/%{name}
+%global pluginconfpath %{confdir}/plugins
+
+%if %{with python2}
+    %global py2pluginpath %{python2_sitelib}/%{name}-plugins
+%endif
+
+%if %{with python3}
+    %global py3pluginpath %{python3_sitelib}/%{name}-plugins
+%endif
+
+# Use the same directory of the main package for subpackage licence and docs
+%global _docdir_fmt %{name}
+
+
+%global pkg_summary     Package manager
+%global pkg_description Utility that allows users to manage packages on their systems. \
+It supports RPMs, modules and comps groups & environments.
+
+Name:           dnf
+Version:        2.7.5
+Release:        17%{?dist}
+Summary:        %{pkg_summary}
+# For a breakdown of the licensing, see PACKAGE-LICENSING
+License:        GPLv2+ and GPLv2 and GPL
+URL:            https://github.com/rpm-software-management/dnf
+Source0:        %{url}/archive/%{version}-modularity-6/%{name}-%{version}-modularity-6.tar.gz
+Patch0:         0001-Allow-to-set-cacheonly-from-commands-and-conf-RhBug-.patch
+Patch1:         0002-Remove-redundant-conf-option-cacheonly.patch
+Patch2:         0003-Remove-unnecessary-code-for-set-cacheonly.patch
+Patch3:         0005-compatibility-gpgme.patch
+Patch4:         0006-util-Correctly-source-errno.EEXIST.patch
+Patch5:         0007-fix-tests.patch
+BuildArch:      noarch
+BuildRequires:  cmake
+BuildRequires:  gettext
+# Documentation
+BuildRequires:  %{_bindir}/sphinx-build
+BuildRequires:  systemd
+BuildRequires:  bash-completion
+%if %{with python3}
+Requires:       python3-%{name} = %{version}-%{release}
+%else
+Requires:       python2-%{name} = %{version}-%{release}
+%endif
+%if 0%{?rhel} && 0%{?rhel} <= 7
+Requires:       python-dbus
+Requires:       %{_bindir}/sqlite3
+%else
+%if %{with python3}
+Recommends:     (python3-dbus if NetworkManager)
+%else
+Recommends:     (python2-dbus if NetworkManager)
+%endif
+Recommends:     (%{_bindir}/sqlite3 if bash-completion)
+%endif
+%{?systemd_requires}
+Provides:       dnf-command(autoremove)
+Provides:       dnf-command(check-update)
+Provides:       dnf-command(clean)
+Provides:       dnf-command(distro-sync)
+Provides:       dnf-command(downgrade)
+Provides:       dnf-command(group)
+Provides:       dnf-command(history)
+Provides:       dnf-command(info)
+Provides:       dnf-command(install)
+Provides:       dnf-command(list)
+Provides:       dnf-command(makecache)
+Provides:       dnf-command(mark)
+Provides:       dnf-command(provides)
+Provides:       dnf-command(reinstall)
+Provides:       dnf-command(remove)
+Provides:       dnf-command(repolist)
+Provides:       dnf-command(repoquery)
+Provides:       dnf-command(repository-packages)
+Provides:       dnf-command(search)
+Provides:       dnf-command(updateinfo)
+Provides:       dnf-command(upgrade)
+Provides:       dnf-command(upgrade-to)
+Conflicts:      python2-dnf-plugins-core < %{conflicts_dnf_plugins_core_version}
+Conflicts:      python3-dnf-plugins-core < %{conflicts_dnf_plugins_core_version}
+
+%description
+%{pkg_description}
+
+%package data
+Summary:        Common data and configuration files for DNF
+Requires:       libreport-filesystem
+Obsoletes:      %{name}-conf <= %{version}-%{release}
+Provides:       %{name}-conf = %{version}-%{release}
+
+%description data
+Common data and configuration files for DNF
+
+%package -n %{yum_subpackage_name}
+Requires:       %{name} = %{version}-%{release}
+Summary:        %{pkg_summary}
+%if 0%{?fedora}
+Conflicts:      yum
+%endif
+
+%description -n %{yum_subpackage_name}
+%{pkg_description}
+
+%if %{with python2}
+%package -n python2-%{name}
+Summary:        Python 2 interface to DNF
+%{?python_provide:%python_provide python2-%{name}}
+BuildRequires:  python2-devel
+BuildRequires:  python2-hawkey >= %{hawkey_version}
+BuildRequires:  python2-libcomps >= %{libcomps_version}
+BuildRequires:  python-librepo >= %{librepo_version}
+BuildRequires:  python2-nose
+%if (0%{?rhel} && 0%{?rhel} <= 7)
+BuildRequires:  pygpgme
+Requires:       pygpgme
+%else
+BuildRequires:  python2-gpg
+Requires:       python2-gpg
+%endif
+BuildRequires:  pyliblzma
+Requires:       pyliblzma
+Requires:       %{name}-data = %{version}-%{release}
+%if 0%{?fedora} || 0%{?centos}
+Requires:       deltarpm
+%endif
+Requires:       python2-hawkey >= %{hawkey_version}
+Requires:       python2-libcomps >= %{libcomps_version}
+Requires:       python-librepo >= %{librepo_version}
+BuildRequires:  libmodulemd >= %{libmodulemd_version}
+Requires:       libmodulemd >= %{libmodulemd_version}
+BuildRequires:  python2-smartcols >= %{python_smartcols_version}
+Requires:       python2-smartcols >= %{python_smartcols_version}
+%if 0%{?rhel} && 0%{?rhel} <= 7
+BuildRequires:  python-iniparse
+Requires:       python-iniparse
+BuildRequires:  rpm-python >= %{rpm_version}
+Requires:       rpm-python >= %{rpm_version}
+BuildRequires:  python-gobject-base
+Requires:       python-gobject-base
+%else
+BuildRequires:  python2-iniparse
+Requires:       python2-iniparse
+BuildRequires:  python2-rpm >= %{rpm_version}
+Requires:       python2-rpm >= %{rpm_version}
+Recommends:     rpm-plugin-systemd-inhibit
+BuildRequires:  python2-gobject-base
+Requires:       python2-gobject-base
+%endif
+
+%description -n python2-%{name}
+Python 2 interface to DNF.
+%endif  # %%{with python2}
+
+%if %{with python3}
+%package -n python3-%{name}
+Summary:        Python 3 interface to DNF
+%{?python_provide:%python_provide python3-%{name}}
+BuildRequires:  python3-devel
+BuildRequires:  python3-hawkey >= %{hawkey_version}
+BuildRequires:  python3-iniparse
+BuildRequires:  python3-libcomps >= %{libcomps_version}
+BuildRequires:  python3-librepo >= %{librepo_version}
+BuildRequires:  python3-nose
+BuildRequires:  python3-gpg
+Requires:       python3-gpg
+Requires:       %{name}-data = %{version}-%{release}
+%if 0%{?fedora} || 0%{?centos}
+Requires:       deltarpm
+%endif
+Requires:       python3-hawkey >= %{hawkey_version}
+Requires:       python3-iniparse
+Requires:       python3-libcomps >= %{libcomps_version}
+Requires:       python3-librepo >= %{librepo_version}
+BuildRequires:  python3-rpm >= %{rpm_version}
+Requires:       python3-rpm >= %{rpm_version}
+%if 0%{?rhel} && 0%{?rhel} <= 7
+Requires:       rpm-plugin-systemd-inhibit
+%else
+Recommends:     rpm-plugin-systemd-inhibit
+BuildRequires:  libmodulemd >= %{libmodulemd_version}
+Requires:       libmodulemd >= %{libmodulemd_version}
+BuildRequires:  python3-gobject-base
+Requires:       python3-gobject-base
+BuildRequires:  python3-smartcols >= %{python_smartcols_version}
+Requires:       python3-smartcols >= %{python_smartcols_version}
+%endif
+
+%description -n python3-%{name}
+Python 3 interface to DNF.
+%endif
+
+%package automatic
+Summary:        %{pkg_summary} - automated upgrades
+BuildRequires:  systemd
+Requires:       %{name} = %{version}-%{release}
+%{?systemd_requires}
+
+%description automatic
+Systemd units that can periodically download package upgrades and apply them.
+
+
+%prep
+%autosetup -p1 -n %{name}-%{version}-modularity-6
+mkdir build-py2
+mkdir build-py3
+
+
+%build
+%if %{with python2}
+    pushd build-py2
+    %cmake .. -DPYTHON_DESIRED:str=2
+    %make_build
+    make doc-man
+    popd
+%endif
+
+%if %{with python3}
+    pushd build-py3
+    %cmake .. -DPYTHON_DESIRED:str=3
+    %make_build
+    make doc-man
+    popd
+%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}
+mkdir -p %{buildroot}%{confdir}/vars
+mkdir -p %{buildroot}%{pluginconfpath}/
+%if %{with python2}
+mkdir -p %{buildroot}%{py2pluginpath}/
+%endif
+%if %{with python3}
+mkdir -p %{buildroot}%{py3pluginpath}/__pycache__/
+%endif
+mkdir -p %{buildroot}%{confdir}/modules.d
+mkdir -p %{buildroot}%{confdir}/modules.defaults.d
+ln -sr  %{buildroot}%{confdir}/%{name}.conf %{buildroot}%{_sysconfdir}/yum.conf
+mkdir -p %{buildroot}%{_localstatedir}/log/
+mkdir -p %{buildroot}%{_var}/cache/dnf/
+touch %{buildroot}%{_localstatedir}/log/%{name}.log
+%if %{with python3}
+ln -sr %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/dnf
+mv %{buildroot}%{_bindir}/dnf-automatic-3 %{buildroot}%{_bindir}/dnf-automatic
+ln -sr  %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/yum
+%else
+ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/dnf
+mv %{buildroot}%{_bindir}/dnf-automatic-2 %{buildroot}%{_bindir}/dnf-automatic
+%if 0%{?rhel} && 0%{?rhel} <= 7
+ln -sr  %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum4
+ln -sr  %{buildroot}%{_mandir}/man8/dnf.8.gz %{buildroot}%{_mandir}/man8/yum4.8.gz
+rm -f %{buildroot}%{_mandir}/man8/yum.8.gz
+%else
+ln -sr  %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum
+%endif
+%endif
+rm -vf %{buildroot}%{_bindir}/dnf-automatic-*
+
+
+%check
+%if %{with python2}
+    pushd build-py2
+    ctest -VV
+    popd
+%endif
+
+%if %{with python3}
+    pushd build-py3
+    ctest -VV
+    popd
+%endif
+
+
+%post
+%systemd_post dnf-makecache.timer
+
+%preun
+%systemd_preun dnf-makecache.timer
+
+%postun
+%systemd_postun_with_restart dnf-makecache.timer
+
+
+%post automatic
+%systemd_post dnf-automatic.timer
+%systemd_post dnf-automatic-notifyonly.timer
+%systemd_post dnf-automatic-download.timer
+%systemd_post dnf-automatic-install.timer
+
+%preun automatic
+%systemd_preun dnf-automatic.timer
+%systemd_preun dnf-automatic-notifyonly.timer
+%systemd_preun dnf-automatic-download.timer
+%systemd_preun dnf-automatic-install.timer
+
+%postun automatic
+%systemd_postun_with_restart dnf-automatic.timer
+%systemd_postun_with_restart dnf-automatic-notifyonly.timer
+%systemd_postun_with_restart dnf-automatic-download.timer
+%systemd_postun_with_restart dnf-automatic-install.timer
+
+
+%files -f %{name}.lang
+%{_bindir}/%{name}
+%if 0%{?rhel} && 0%{?rhel} <= 7
+%{_sysconfdir}/bash_completion.d/%{name}
+%else
+%dir %{_datadir}/bash-completion
+%dir %{_datadir}/bash-completion/completions
+%{_datadir}/bash-completion/completions/%{name}
+%endif
+%{_mandir}/man8/%{name}.8*
+%{_mandir}/man8/yum2dnf.8*
+%{_unitdir}/%{name}-makecache.service
+%{_unitdir}/%{name}-makecache.timer
+%{_var}/cache/%{name}/
+
+%files data
+%license COPYING PACKAGE-LICENSING
+%doc AUTHORS README.rst
+%dir %{confdir}
+%dir %{confdir}/modules.d
+%dir %{confdir}/modules.defaults.d
+%dir %{pluginconfpath}
+%dir %{confdir}/protected.d
+%dir %{confdir}/vars
+%config(noreplace) %{confdir}/%{name}.conf
+%config(noreplace) %{confdir}/protected.d/%{name}.conf
+%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
+%ghost %{_localstatedir}/log/hawkey.log
+%ghost %{_localstatedir}/log/%{name}.log
+%ghost %{_localstatedir}/log/%{name}.librepo.log
+%ghost %{_localstatedir}/log/%{name}.rpm.log
+%ghost %{_localstatedir}/log/%{name}.plugin.log
+%ghost %{_sharedstatedir}/%{name}
+%ghost %{_sharedstatedir}/%{name}/groups.json
+%ghost %{_sharedstatedir}/%{name}/yumdb
+%ghost %{_sharedstatedir}/%{name}/history
+%{_mandir}/man5/%{name}.conf.5*
+%{_tmpfilesdir}/%{name}.conf
+%{_sysconfdir}/libreport/events.d/collect_dnf.conf
+
+%files -n %{yum_subpackage_name}
+%if "%{yum_subpackage_name}" == "yum"
+%{_bindir}/yum
+%{_sysconfdir}/yum.conf
+%{_mandir}/man5/yum.conf.5.*
+%{_mandir}/man8/yum.8*
+%endif
+
+%if "%{yum_subpackage_name}" == "nextgen-yum4"
+%{_bindir}/yum4
+%{_mandir}/man8/yum4.8*
+%exclude %{_sysconfdir}/yum.conf
+%exclude %{_mandir}/man5/yum.conf.5.*
+%exclude %{_mandir}/man8/yum.8*
+%endif
+
+%if "%{yum_subpackage_name}" == "%{name}-yum"
+%{_sysconfdir}/yum.conf
+%{_bindir}/yum
+%{_mandir}/man5/yum.conf.5*
+%{_mandir}/man8/yum.8*
+%endif
+
+%if %{with python2}
+%files -n python2-%{name}
+%{_bindir}/%{name}-2
+%exclude %{python2_sitelib}/%{name}/automatic
+%{python2_sitelib}/%{name}/
+%dir %{py2pluginpath}
+%endif
+
+%if %{with python3}
+%files -n python3-%{name}
+%{_bindir}/%{name}-3
+%exclude %{python3_sitelib}/%{name}/automatic
+%{python3_sitelib}/%{name}/
+%dir %{py3pluginpath}
+%dir %{py3pluginpath}/__pycache__
+%endif
+
+%files automatic
+%{_bindir}/%{name}-automatic
+%config(noreplace) %{confdir}/automatic.conf
+%{_mandir}/man8/%{name}.automatic.8*
+%{_unitdir}/%{name}-automatic.service
+%{_unitdir}/%{name}-automatic.timer
+%{_unitdir}/%{name}-automatic-notifyonly.service
+%{_unitdir}/%{name}-automatic-notifyonly.timer
+%{_unitdir}/%{name}-automatic-download.service
+%{_unitdir}/%{name}-automatic-download.timer
+%{_unitdir}/%{name}-automatic-install.service
+%{_unitdir}/%{name}-automatic-install.timer
+%if %{with python3}
+%{python3_sitelib}/%{name}/automatic/
+%else
+%{python2_sitelib}/%{name}/automatic/
+%endif
+
+%changelog
+* Mon Jul 23 2018 Marek Blaha <mblaha@redhat.com> - 2.7.5-17
+- Rename yum4 subpackage to nextgen-yum4
+- Correct Source0 URL
+
+* Tue May 29 2018 Martin Hatina <mhatina@redhat.com> - 2.7.5-16
+- Apply util-Correctly-source-errno.EEXIST patch
+
+* Mon May 28 2018 Martin Hatina <mhatina@redhat.com> - 2.7.5-15
+- Do not require libdnf
+
+* Fri May 25 2018 Martin Hatina <mhatina@redhat.com> - 2.7.5-14
+- Fix patch applying.
+
+* Fri May 25 2018 Martin Hatina <mhatina@redhat.com> - 2.7.5-13
+- Rebase to dnf from dnf-2-modularity-6 release.
+
+* Wed Apr 18 2018 Daniel Mach <dmach@redhat.com> - 2.7.5-12
+- Fix defaults loading.
+
+* Tue Apr 17 2018 Martin Hatina <mhatina@redhat.com> - 2.7.5-11
+- Rebase to dnf from dnf-2-modularity-4 release.
+
+* Mon Mar 26 2018 Martin Hatina <mhatina@redhat.com> - 2.7.5-10
+- Require libmodulemd.
+
+* Mon Mar 26 2018 Martin Hatina <mhatina@redhat.com> - 2.7.5-9
+- Rebase to dnf from dnf-2-modularity-3 release.
+
+* Mon Feb 12 2018 Daniel Mach <dmach@redhat.com> - 2.7.5-8
+- Rebase to dnf from dnf-2-modularity branch.
+
+* Thu Feb 08 2018 Igor Gnatenko <ignatenko@redhat.com> - 2.7.5-7
+- Demote deltarpm to weak dependencies
+
+* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 2.7.5-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Wed Jan 03 2018 Igor Gnatenko <ignatenko@redhat.com> - 2.7.5-5
+- Use %%systemd_requires
+- Update Python 2 dependency declarations to new packaging standards
+  (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3)
+
+* Wed Nov 29 2017 Jaroslav Mracek <jmracek@redhat.com> - 2.7.5-4
+- Fix problem with demands.cacheonly that caused problems for system-upgrade
+
+* Tue Nov 07 2017 Igor Gnatenko <ignatenko@redhat.com> - 2.7.5-3
+- Remove platform-python subpackage
+
+* Fri Oct 27 2017 Igor Gnatenko <ignatenko@redhat.com> - 2.7.5-2
+- Enable usage of rich deps for NM integration
+
+* Wed Oct 18 2017 Igor Gnatenko <ignatenko@redhat.com> - 2.7.5-1
+- Improve performance for excludes and includes handling (RHBZ #1500361)
+- Fixed problem of handling checksums for local repositories (RHBZ #1502106)
+- Fix traceback when using dnf.Base.close() (RHBZ #1503575)
+
+* Mon Oct 16 2017 Jaroslav Mracek <jmracek@redhat.com> - 2.7.4-1
+- Update to 2.7.4-1
+- Enhanced performance for excludes and includes handling
+- Solved memory leaks at time of closing of dnf.Base()
+- Resolves: rhbz#1480979 - I thought it abnormal that dnf crashed.
+- Resolves: rhbz#1461423 - Memory leak in python-dnf
+- Resolves: rhbz#1499564 - dnf list installed crashes
+- Resolves: rhbz#1499534 - dnf-2 is much slower than dnf-1 when handling groups
+- Resolves: rhbz#1499623 - Mishandling stderr vs stdout (dnf search, dnf repoquery)
+
+* Fri Oct 06 2017 Igor Gnatenko <ignatenko@redhat.com> - 2.7.3-1
+- Fix URL detection (RHBZ #1472847)
+- Do not remove downloaded files with --destdir option (RHBZ #1498426)
+- Fix handling of conditional packages in comps (RHBZ #1427144)
+
+* Mon Oct 02 2017 Jaroslav Mracek <jmracek@redhat.com> - 2.7.2-1
+- Update to 2.7.2-1
+- Added new option ``--comment=<comment>`` that adds a comment to transaction in history
+- :meth:`dnf.Base.pre_configure_plugin` configure plugins by running their pre_configure() method
+- Added pre_configure() methotd for plugins and commands to configure dnf before repos are loaded
+- Resolves: rhbz#1421478 - dnf repository-packages: error: unrecognized arguments: -x rust-rpm-macros
+- Resolves: rhbz#1491560 - 'dnf check' reports spurious "has missing requires of" errors
+- Resolves: rhbz#1465292 - DNF remove protected duplicate package
+- Resolves: rhbz#1279001 - [RFE] Missing dnf --downloaddir option
+- Resolves: rhbz#1212341 - [RFE] Allow plugins to override the core configuration
+- Resolves: rhbz#1299482 - mock --init fails with message "Failed calculating RPMDB checksum"
+- Resolves: rhbz#1488398 - dnf upstream tests failures on f26
+- Resolves: rhbz#1192811 - dnf whatprovides should show which provides matched a pattern
+- Resolves: rhbz#1288845 - "dnf provides" wildcard matching is unreliable (not all packages with matches listed)
+- Resolves: rhbz#1473933 - [abrt] dnf-automatic: resolved(): rpm_conf.py:58:resolved:AttributeError: 'Rpmconf' object has no attribute '_interactive'
+- Resolves: rhbz#1237349 - dnf autoremove not removing what dnf list extras shows
+- Resolves: rhbz#1470050 - the 'priority=' option in /etc/yum.repos.d/*.repo is not respected
+- Resolves: rhbz#1347927 - dnf --cacheonly downloads packages
+- Resolves: rhbz#1478115 - [abrt] dnf: _hcmd_undo(): __init__.py:888:_hcmd_undo:IndexError: list index out of range
+- Resolves: rhbz#1461171 -  RFE: support --advisory= with install
+- Resolves: rhbz#1448874 - "dnf needs-restarting" vanished from bash completion
+- Resolves: rhbz#1495116 - Dnf version fails with traceback in container
+
+* Mon Aug 07 2017 Jaroslav Mracek <jmracek@redhat.com> 2.6.3-1
+- Fix problem with dnf.Package().remote_location() (RhBug:1476215) (Jaroslav
+  Mracek)
+- Change behavior of -C according to documentation (RhBug:1473964) (Jaroslav
+  Mracek)
+- It should prevent to ask attribute of None (RhBug:1359482) (Jaroslav Mracek)
+- Solve a problems with --arch options (RhBug:1476834) (Jaroslav Mracek)
+- Use security plugin code for dnf-automatic (Jaroslav Mracek)
+- Fix unicode error for python2 (Jaroslav Mracek)
+- Inform about packages installed for group (Jaroslav Mracek)
+- Provide info if pkg is removed due to dependency (RhBug:1244755) (Jaroslav
+  Mracek)
+- Unify format of %%{_mandir} paths in dnf.spec (Jaroslav Mracek)
+- Remove test_yumlayer.py as unneeded test (Jaroslav Mracek)
+- Provide yum4 package for rhel7 build (Jaroslav Mracek)
+- Make yum compatible layer very minimal (RhBug:1476748) (Jaroslav Mracek)
+- Remove metadata_expire from yum compatible layer (Jaroslav Mracek)
+- Remove keepcache from yum compatibility layer (Jaroslav Mracek)
+- Remove options from yum conf (Jaroslav Mracek)
+- Remove unused functionality from  yum compatible layer (Jaroslav Mracek)
+- Add deplist command for dnf (Jaroslav Mracek)
+- Fix problems with --downloaddir options (RhBug:1476464) (Jaroslav Mracek)
+- Move description of --forcearch into proper place (Jaroslav Mracek)
+- Provide description of --downloaddir option (Jaroslav Mracek)
+- Fix if in spec file (Jaroslav Mracek)
+- Add description of "test" tsflags (Jaroslav Mracek)
+- Enable import gpg_keys with tsflag test (RhBug:1464192) (Jaroslav Mracek)
+- Keep old reason when undoing erase (RhBug:1463107) (Eduard Čuba)
+- spec: eliminate other weak dependencies for el<=7 (Igor Gnatenko)
+- spec: do not strongly require inhibit plugin (Igor Gnatenko)
+- Inform that packages are only downloaded (RhBug:1426196) (Jaroslav Mracek)
+- Move releasever check after the etc/dnf/vars substitutions. (Alexander
+  Kanavin)
+- Provide substitution for Repodict.add_new_repo() (RhBug:1457507) (Jaroslav
+  Mracek)
+
+* Mon Jul 24 2017 Jaroslav Mracek <jmracek@redhat.com> 2.6.2-1
+- Remove autodeglob optimization (Jaroslav Rohel)
+- Integrate --destdir with --destdir from download plugin (Ondřej Sojka)
+- Add CLI option --destdir (RhBug:1279001) (Ondřej Sojka)
+- Add myself to the AUTHORS file (Nathaniel McCallum)
+- Add the --forcearch CLI flag (Nathaniel McCallum)
+- Add 'ignorearch' option (Nathaniel McCallum)
+- Provide an API for setting 'arch' and 'basearch' (Nathaniel McCallum)
+- Add nevra forms for repoquery command (Jaroslav Rohel)
+- Fix UnicodeDecodeError during checkSig() on non UTF-8 locale (RhBug:1397848)
+  (Jaroslav Rohel)
+- Add dnf option --noautoremove (RhBug:1361424) (Jaroslav Mracek)
+- Add group argument for mark command (Jaroslav Mracek)
+- Report problems for each pkg during gpgcheck (RhBug:1387925) (Jaroslav
+  Mracek)
+- fix minor spelling mistakes (René Genz)
+- Print warning when wrong delimiter in cache (RhBug:1332099) (Vítek Hoch)
+- Fix the loading of config for dnf-automatic command_email (RhBug:1470116)
+  (Jaroslav Rohel)
+- Enable download progress bar if redirected output (RhBug:1161950) (Jaroslav
+  Mracek)
+- Support short abbrevations of commands (RhBug:1320254) (Vítek Hoch)
+- Remove unused variables kwargs (Jaroslav Mracek)
+- Not reinstall packages if install from repository-pkgs used (Jaroslav Mracek)
+- bump dnf version to 2.6.0 (Igor Gnatenko)
+- spec: use python2- prefix for hawkey (Igor Gnatenko)
+- spec: use sphinx-build binary rather than package name (Igor Gnatenko)
+- spec: python-bugzilla is not needed for building (Igor Gnatenko)
+- spec: fix instructions about generating tarball (Igor Gnatenko)
+- po: Update translations (Igor Gnatenko)
+- Add an example of installation without weak-deps  (RhBug:1424723) (Jaroslav
+  Mracek)
+- Add detection if mirrorlist is used for metalink (Jaroslav Mracek)
+- Rename variable (Jaroslav Mracek)
+- Add --groupmember option to repoquery (RhBug:1462486) (Jaroslav Mracek)
+- Check checksum for local repositories (RhBug:1314405) (Jaroslav Mracek)
+- Spelling fixes (Ville Skyttä)
+- repoquery --obsoletes prints obsoletes (RhBug:1457368) (Matěj Cepl)
+- Provide pkg name hint for icase (RhBug:1339280) (RhBug:1138978) (Jaroslav
+  Mracek)
+- Return only latest pkgs for "dnf list upgrades" (RhBug:1423472) (Jaroslav
+  Mracek)
+- cleanup code not executed in case of exception (Marek Blaha)
+- Allow to modify message for user confirmation (Jaroslav Mracek)
+- Add autocheck_running_kernel config option (Štěpán Smetana)
+- Inform about skipped packages for group install (RhBug:1427365) (Jaroslav
+  Mracek)
+- Remove group remove unneeded pkgs (RhBug:1398871) (RhBug:1432312) (Jaroslav
+  Mracek)
+- po: update translations (Igor Gnatenko)
+
+* Mon Jun 12 2017 Jaroslav Mracek <jmracek@redhat.com> 2.5.1-1
+- bump version to 2.5.1 + update release notes (Jaroslav Mracek)
+- Fix: dnf update --refresh fails for repo_gpgcheck=1 (RhBug:1456419) (Daniel
+  Mach)
+- Don't try to cut datetime message (Jaroslav Rohel)
+- Use localized datetime format (RhBug:1445021) (Jaroslav Rohel)
+- Work with locale date (Jaroslav Rohel)
+- Use ISO 8601 time format in logfile (Jaroslav Rohel)
+- Add unitest to prevent callbacks breakage (Jaroslav Mracek)
+- Provide compatibility for tools that do not use total_drpms (Jaroslav Mracek)
+- Requires strict usage of repoquery --recursive (Jaroslav Mracek)
+- Fix output for --resolve with --installed for repoquery (Jaroslav Mracek)
+- Remove unnecessary inheritance of yum conf options (Martin Hatina)
+- Remove alwaysprompt option support (RhBug:1400714) (Jaroslav Rohel)
+- Allow to install groups with multilib_policy=all (RhBug:1250702) (Jaroslav
+  Mracek)
+- Redesign Base.install() to provide alternatives (Jaroslav Mracek)
+- Report excludes includes into logger.debug (RhBug:1381988) (Jaroslav Mracek)
+- Provide new API to parse string to NEVRA () (Jaroslav Mracek)
+- Add more repoquery querytags (Jaroslav Rohel)
+- Not hide tracebacks (Jaroslav Mracek)
+- Solve error handling for get attr in yumdb (RhBug:1397848) (Jaroslav Mracek)
+- Provide a better error if throttle to low (RhBug:1321407) (Jaroslav Mracek)
+- Change timeout to 30s (RhBug:1291867) (Jaroslav Mracek)
+- Add pre_transaction hook for plugins (Jaroslav Rohel)
+- Not download metadata if "dnf history [info|list|userinstalled]" (Jaroslav
+  Mracek)
+- Not download metadata if "dnf repo-pkgs <repo> list --installed" (Jaroslav
+  Mracek)
+- Not download metadata if "dnf list --installed" (RhBug:1372895) (Jaroslav
+  Mracek)
+- Format pkg str for repoquery --tree due to -qf (RhBug:1444751) (Jaroslav
+  Mracek)
+
+* Mon May 22 2017 Jaroslav Mracek <jmracek@redhat.com> 2.5.0-1
+- Update release notes (Jaroslav Mracek)
+- Change documentation for history --userinstalled (RhBug:1370062) (Jaroslav
+  Mracek)
+- Change example to install plugin using versionlock (Jaroslav Mracek)
+- Remove unused method Goal.best_run_diff() (Jaroslav Mracek)
+- Change recommendations if some problems appear (RhBug:1293067) (Jaroslav
+  Mracek)
+- Report problems for goals with optional=True (Jaroslav Mracek)
+- Format resolve problem messages in method in dnf.util (Jaroslav Mracek)
+- Enhance reports about broken dep (RhBug:1398040)(RhBug:1393814) (Jaroslav
+  Mracek)
+- search: do not generate error if not match anything (RhBug:1342157) (Jaroslav
+  Rohel)
+- Check if any plugin is removed in transaction (RhBug:1379906) (Jaroslav
+  Mracek)
+- Show progress for DRPM (RhBug:1198975) (Jaroslav Mracek)
+- Fix disabledplugin option (Iavael)
+- [history]: fixed info command merged output (Eduard Čuba)
+
+* Thu May 11 2017 Jaroslav Mracek <jmracek@redhat.com> 2.4.1-1
+- bump version to 2.4.1 + update release notes (Jaroslav Mracek)
+- goal: do not mark weak dependencies as userinstalled (Igor Gnatenko)
+- fix typo in supplements (RhBug:1446756) (Igor Gnatenko)
+- Describe present behavior of installonly_limit conf option (Jaroslav Mracek)
+- Reset all transaction for groups if Base.reset() (RhBug:1446432) (Jaroslav
+  Mracek)
+- Explain how add negative num for --latest-limit (RhBug:1446641) (Jaroslav
+  Mracek)
+- trivial: don't duplicate option names (Igor Gnatenko)
+- Add support for --userinstalled for repoquery command (RhBug:1278124)
+  (Jaroslav Rohel)
+- Fix header of search result sections (RhBug:1301868) (Jaroslav Rohel)
+- Filter out src for get_best_selector (Jaroslav Mracek)
+- Add minor changes in formating of documentation (Jaroslav Mracek)
+
+* Tue May 02 2017 Jaroslav Mracek <jmracek@redhat.com> 2.4.0-1
+- po: Update translations (Igor Gnatenko)
+- po: Update translations (Igor Gnatenko)
+- introduce '--enableplugin' option (Martin Hatina)
+- Improve detection of file patterns (Jaroslav Mracek)
+- Add method _get_nevra_solution() for subject (Jaroslav Mracek)
+- Do not add "*" into query filter in _nevra_to_filters() (Jaroslav Mracek)
+- Remove usage of nevra_possibilities_real() (Jaroslav Mracek)
+- Increase performance for downgrade_to() (Jaroslav Mracek)
+- Add additional keys for get_best_query() (Jaroslav Mracek)
+- Increase performance for get_best_selector() (Jaroslav Mracek)
+- Increase performance for get_best_query() (Jaroslav Mracek)
+- Fix "Package" text translation (RhBug:1302935) (Jaroslav Rohel)
+- Create a warning if releasever is None (Jaroslav Mracek)
+- Adds cost, excludepkgs, and includepkgs to Doc (RhBug:1248684) (Jaroslav
+  Mracek)
+- Change auto-detection of releasever in empty installroot (Jaroslav Mracek)
+- Do not load system repo for makecache command (RhBug:1441636) (Jaroslav
+  Mracek)
+- Do not raise assertion if group inst and rmv pkgs (RhBug:1438438) (Jaroslav
+  Mracek)
+- yum layer using python3 (Martin Hatina)
+- Filter url protocols for baseurl in Package.remote_location (Jaroslav Mracek)
+- Add armv5tl to arm basearch (Neal Gompa)
+- Setup additional parameters for handler for remote packages (Jaroslav Mracek)
+- Use same method for user/password setting of every librepo.handle (Jaroslav
+  Mracek)
+- Fix PEP8 violations and remove unused import (Jaroslav Mracek)
+- Handle unknown file size in download progress (Jaroslav Mracek)
+- Allow to delete cashed files from command line by clean command (Jaroslav
+  Mracek)
+- Save command line packages into chachedir (RhBug:1256313) (Jaroslav Mracek)
+- Add progress bar for download of commandline pkgs (RhBug:1161950) (Jaroslav
+  Mracek)
+- Fix minor typo Closes: #781 Approved by: ignatenkobrain (Yuri Chornoivan)
+- Mark unremoved packages as failed (RhBug:1421244) (Jaroslav Mracek)
+
+* Mon Apr 10 2017 Jaroslav Mracek <jmracek@redhat.com> 2.3.0-1
+- update release notes (Jaroslav Mracek)
+- po: Update translations (Igor Gnatenko)
+- Add require of subcommand for repo-pkgs command (Jaroslav Rohel)
+- shell: Fix commands initialization (Jaroslav Rohel)
+- po: Update translations (Igor Gnatenko)
+- Add support for --location for repoquery command (RhBug:1290137) (Jaroslav
+  Mracek)
+- Add support of --recursive with --resolve in repoquery (Jaroslav Mracek)
+- Add --recursive option for repoquery (Jaroslav Mracek)
+- Add --whatconflicts for repoquery (Jaroslav Mracek)
+- Add support for multiple options for repoquery (Jaroslav Mracek)
+- Add multiple format option for repoquery (Jaroslav Mracek)
+- Fix problem with "dnf repoquery --querytags" (Jaroslav Mracek)
+- Add support of 3 options into updateinfo command (Jaroslav Mracek)
+- Add inheritance of reason for obsoleting packages (Jaroslav Mracek)
+- Mark installonlypkgs correctly as user installed (RhBug:1349314) (Jaroslav
+  Mracek)
+- Solve a problem with None names in callbacks (Jaroslav Mracek)
+- Solve a problem for callbacks (Jaroslav Mracek)
+- Revert "remove: CLI: --randomwait" (RhBug:1247122) (Ondřej Sojka)
+- po: update translations (Igor Gnatenko)
+- po: update translations (Igor Gnatenko)
+- Set strings for translations (RhBug:1298717) (Jaroslav Mracek)
+
+* Mon Mar 27 2017 Jaroslav Mracek <jmracek@redhat.com> 2.2.0-1
+- bump version to 2.2.0 + update release notes (Jaroslav Mracek)
+- Add documentation of new API callback actions (RhBug:1411432) (Jaroslav
+  Mracek)
+- Fix python2 doesn't have e.__traceback__ attribute (Jaroslav Mracek)
+- Do not report erasing package as None. (Jaroslav Mracek)
+- Display scriplet for transaction (RhBug:1411423) (RhBug:1406130) (Jaroslav
+  Mracek)
+- Add support for rpmcallbacks (Jaroslav Mracek)
+- AUTHORS: updated (Jaroslav Rohel)
+- Not show expiration check if no repo enabled (RhBug:1369212) (Jaroslav
+  Mracek)
+- Fix changelog in dnf spec file (Jaroslav Mracek)
+- po: update translations (Igor Gnatenko)
+- Add myself (mhatina) to AUTHORS (Martin Hatina)
+- po: Update translations (Igor Gnatenko)
+
+* Tue Mar 21 2017 Jaroslav Mracek <jmracek@redhat.com> 2.1.1-1
+- bump version to 2.1.1 + update release notes (Jaroslav Mracek)
+- Sync the translation with locale (Jaroslav Rohel)
+- Disable exceptions in logging (Jaroslav Rohel)
+- Fix severity info in "updateinfo info" (Jaroslav Mracek)
+- Add help for shell commands (Jaroslav Rohel)
+- shell: no crash if missing args (Jaroslav Rohel)
+- proper check of releasever, when using installroot (RhBug:1417542) (Martin
+  Hatina)
+- Inform about "Cache was expired" with "dnf clean" (RhBug:1401446) (Jaroslav
+  Mracek)
+- crypto: port to the official gpgme bindings (Igor Gnatenko)
+- Fix doc example for `fill_sack` method (Lubomír Sedlář)
+- po: update translations (Igor Gnatenko)
+- Not try to install src package (RhBug:1416699) (Jaroslav Mracek)
+- Add usage for add_new_repo() with repofrompath option (Jaroslav Mracek)
+- Add new API add_new_repo() in RepoDict() (RhBug:1427132) (Jaroslav Mracek)
+- docs: adds documentation for dnf-automatic's Command and CommandEmail
+  emitters. (rhn)
+- docs: fixes typo in section description in automatic (rhn)
+- Adds new emitters for dnf-automatic. (rhn)
+- po: update translations (Igor Gnatenko)
+- Ensure that callback will not kill dnf transaction (Jaroslav Mracek)
+- Ensure that name will be not requested on None (RhBug:1397047) (Jaroslav
+  Mracek)
+- Python 3.6 invalid escape sequence deprecation fix (Ville Skyttä)
+- display severity information in updateinfo (#741) (Michael Mraka)
+- po: update translations (Igor Gnatenko)
+- Add --nodocs option for dnf (RhBug:1379628) (Jaroslav Mracek)
+- Replace passive plugin noroot (Jaroslav Mracek)
+- Fix incorrect formating of string for logger.info (Jaroslav Mracek)
+- Not print help if empty line in script for shell command (Jaroslav Mracek)
+- Run fill_sack after all repos have changed status (Jaroslav Mracek)
+- Remove Hawkey object from repo if rerun of dnf.fill_sack (Jaroslav Mracek)
+- util/on_metered_connection: be more polite to failures (Igor Gnatenko)
+- cosmetic: i18n: rewording of 'Login user' (RhBug:1424939) (Jan Silhan)
+- Fix problem with --whatprovides in repoquery (RhBug:1396992) (Jaroslav
+  Mracek)
+- Add -a and --all option for repoquery (RhBug:1412970) (Jaroslav Mracek)
+- Change camel-case of output of grouplist (Jaroslav Mracek)
+- Minor correction in release notes (Jaroslav Mracek)
+- Minor correction in release notes (Jaroslav Mracek)
+
+* Thu Feb 16 2017 Jaroslav Mracek <jmracek@redhat.com> 2.1.0-1
+- bump version to 2.1.0 + update release notes (Jaroslav Mracek)
+- Fix problem with --recent option in repoquery (Jaroslav Mracek)
+- Fix problem with duplicated --obsoletes (RhBug:1421835) (Jaroslav Mracek)
+- Python 3.6 invalid escape sequence deprecation fixes (Ville Skyttä)
+- Add --repoid as alias for --repo (Jaroslav Mracek)
+- introduce dnf.base.Base.update_cache() (Martin Hatina)
+- Try to install uninstalled packages if group installed (Jaroslav Mracek)
+- Enable search of provides in /usr/(s)bin (RgBug:1421618) (Jaroslav Mracek)
+- style: ignore E261 (Igor Gnatenko)
+- makecache: do not run on metered connections (RhBug:1415711) (Igor Gnatenko)
+- change '--disableplugins' to '--disableplugin' (Martin Hatina)
+- cosmetic: removed unused import (Jan Silhan)
+- show hint how to display why package was skipped (RhBug:1417627) (Jan Silhan)
+- spec: add information how to obtain archive (Igor Gnatenko)
+- fix messages (UX) (Jaroslav Rohel)
+- zanata update (Jan Silhan)
+
+* Thu Feb 09 2017 Jaroslav Mracek <jmracek@redhat.com> 2.0.1-1
+- bump version to 2.0.1 + update release notes (Jaroslav Mracek)
+- introduce cli 'obsoletes' option (Martin Hatina)
+- swap tids if they are in wrong order (RhBug:1409361) (Michael Mraka)
+- Disable shell command recursion (Jaroslav Rohel)
+- Honor additional arguments for DNF shell repo list command (Jaroslav Rohel)
+- don't traceback when bug title is not set (Michael Mraka)
+- introducing list-security, info-security etc. commands (Michael Mraka)
+- Add lsedlar to contributors list (Lubomír Sedlář)
+- Return just name from Package.source_name (Lubomír Sedlář)
+- introduce dnf.conf.config.MainConf.exclude() (Martin Hatina)
+- systemd: Disable daemons on ostree-managed systems (Colin Walters)
+- introduced dnf.base.Base.autoremove() (RhBug:1414512) (Martin Hatina)
+- po: update translations (Igor Gnatenko)
+- build: use relative directory for translations (Igor Gnatenko)
+- Temporary eliminate a problem with install remove loop (Jaroslav Mracek)
+- Handle info message when DRPM wastes data (RhBug:1238808) (Daniel
+  Aleksandersen)
+- Fix output for better translation (RhBug:1386085) (Abhijeet Kasurde)
+- yum layer refactored (Martin Hatina)
+- return values changed to match yum's (Martin Hatina)
+- Reword sentence after removing package (RhBug:1286553) (Abhijeet Kasurde)
+- Minor documentation revisions (Mark Szymanski)
+- Minor code fix (Abhijeet Kasurde)
+- automatic: email emitter date header (David Greenhouse)
+- Solve problem when no repo and only rpms with upgrade command (Jaroslav
+  Mracek)
+- bash_completion: use system-python if it's available (Igor Gnatenko)
+- spec: use system-python for dnf-yum as well (Igor Gnatenko)
+- comps/groups: fix tests (Michal Luscon)
+- comps: adjust group_upgrade to new CompsTransPkg style (Michal Luscon)
+- groups: refactored installation (RhBug:1337731, RhBug:1336879) (Michal
+  Luscon)
+- Increase requirement for hawkey (Jaroslav Mracek)
+- Change reporting problems for downgradePkgs() (Jaroslav Mracek)
+- Use selector for base.package_upgrade() (Jaroslav Mracek)
+- Add usage of selectors for base.package_install() (Jaroslav Mracek)
+- Use selector for base.package_downgrade() (Jaroslav Mracek)
+- Redirect base.downgrade() to base.downgrade_to() (Jaroslav Mracek)
+- Enable wildcard for downgrade command (RhBug:1173349) (Jaroslav Mracek)
+- Refactor downgrade cmd behavior (RhBug:1329617)(RhBug:1283255) (Jaroslav
+  Mracek)
+- Redirect logger.info into stderr for repolist (RhBug:1369411) (Jaroslav
+  Mracek)
+- Redirect logger.info into stderr for repoquery (RhBug:1243393) (Jaroslav
+  Mracek)
+- Add possibility for commands to redirect logger (Jaroslav Mracek)
+- Put information about metadata expiration into stdout (Jaroslav Mracek)
+- Change warning about added repo into info (RhBug:1243393) (Jaroslav Mracek)
+- Move grouplist output from logger into stdout (Jaroslav Mracek)
+- let repo exclude work the same way as global exclude (Michael Mraka)
+- Fix wrong assumptions about metalinks (RhBug:1411349) (Jaroslav Mracek)
+- handle --disablerepo/--enablerepo properly with strict (RhBug:1345976)
+  (Štěpán Smetana)
+- Add fix to notify user about no repos (RhBug:1369212) (Abhijeet Kasurde)
+- Add information about "hidden" option in dnf doc (RhBug:1349247) (Abhijeet
+  Kasurde)
+- Fix for 'history package-list' (Amit Upadhye)
+- Enable multiple args for repoquery -f (RhBug:1403930) (Jaroslav Mracek)
+- Set default repo.name as repo._section (Jaroslav Mracek)
+- Create from self.forms value forms in cmd.run() (Jaroslav Mracek)
+- Add description of swap command into documentation (Jaroslav Mracek)
+- Add swap command (RhBug:1403465) (RhBug:1110780) (Jaroslav Mracek)
+- Solve a problem with shell when empty line or EOF (Jaroslav Mracek)
+- shell: add history of commands (RhBug:1405333) (Michal Luscon)
+- Add info if no files with repoquery -l (RhBug:1254879) (Jaroslav Mracek)
+- po: update translations (Igor Gnatenko)
+- po: migrate to zanata python client and trivial fixes in build (Igor
+  Gnatenko)
+- po: include all possible languages from zanata (Igor Gnatenko)
+- po: include comments for translations (Igor Gnatenko)
+- shell: catch exceptions from depsolving (Michal Luscon)
+- shell: update documentation (Michal Luscon)
+- shell: add transaction reset cmd (Michal Luscon)
+- shell: add transaction resolve cmd (Michal Luscon)
+- shell: provide rewritable demands for cmds (Michal Luscon)
+- shell: catch tracebacks from shlex (Michal Luscon)
+- shell: handle ctrl+D more gracefully (Michal Luscon)
+- groups: set demands in configure instead of run (Michal Luscon)
+- shell: implement config cmd (Michal Luscon)
+- shell: add help (Michal Luscon)
+- shell: make alias repo list -> repolist (Michal Luscon)
+- shell: catch exceptions from do_transaction (Michal Luscon)
+- shell: resolve transaction in ts run (Michal Luscon)
+- shell: add default value for internal methods argument (Michal Luscon)
+- shell: create run alias for ts run (Michal Luscon)
+- shell: add ts list cmd (Michal Luscon)
+- shell: refill sack after every successful repo cmd (Michal Luscon)
+- shell: allow running multiple transaction in one session (Michal Luscon)
+- shell: add ts command (Michal Luscon)
+- shell: catch cmd parsing and run exceptions (Michal Luscon)
+- shell: allow to run scripts (Michal Luscon)
+- shell: add repo cmd (Michal Luscon)
+- shell: add resolving + transaction run support (Michal Luscon)
+- shell: implement quit method (Michal Luscon)
+- shell: add custom cmds stubs (Michal Luscon)
+- shell: implement basic logic (Michal Luscon)
+- shell: register new cmd (Michal Luscon)
+
+* Wed Dec 14 2016 Michal Luscon <mluscon@redhat.com> 2.0.0-1
+- tests: catch ModuleNotFoundError as well (Igor Gnatenko)
+- Switch out automatic service for automatic-download and automatic-install
+  (Pat Riehecky)
+- Make upgrade-to alias for upgrade (RhBug:1327999) (Jaroslav Mracek)
+- skip appending an empty option (RhBug: 1400081) (Michael Mraka)
+- Add description of nevra foems for commands and autoremove args (Jaroslav
+  Mracek)
+- Add support of arguments nevra forms for autoremove command (Jaroslav Mracek)
+- Add nevra forms for remove command (Jaroslav Mracek)
+- Add nevra forms for install command (Jaroslav Mracek)
+- add bin/yum into .gitignore (Michal Luscon)
+- clean: acquire all locks before cleaning (RhBug:1293782) (Michal Luscon)
+- Change hawkey version requirement (Jaroslav Mracek)
+- Add information for translators (RhBug:1386078) (Jaroslav Mracek)
+- Change info to warning for clean repoquery output (RhBug:1358245) (Jaroslav
+  Mracek)
+- Add description of pkg flag for Query (RhBug:1243393) (Jaroslav Mracek)
+- Add minor changes in documentation (Jaroslav Mracek)
+- Do not always overwrite the name with the repo ID (Neal Gompa)
+
+* Fri Dec 02 2016 Martin Hatina <mhatina@redhat.com> 2.0.0-0.rc2.1
+- See http://dnf.readthedocs.io/en/latest/release_notes.html
+
+* Thu Sep 29 2016 Michal Luscon <mluscon@redhat.com> 2.0.0-0.rc1.1
+- See http://dnf.readthedocs.io/en/latest/release_notes.html
+