Hello community, here is the log from the commit of package dnf for openSUSE:Factory checked in at 2019-04-28 20:11:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dnf (Old) and /work/SRC/openSUSE:Factory/.dnf.new.5536 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "dnf" Sun Apr 28 20:11:34 2019 rev:13 rq:698279 version:4.2.5 Changes: -------- --- /work/SRC/openSUSE:Factory/dnf/dnf.changes 2019-04-21 09:04:53.322657070 +0200 +++ /work/SRC/openSUSE:Factory/.dnf.new.5536/dnf.changes 2019-04-28 20:12:01.830471536 +0200 @@ -1,0 +2,22 @@ +Fri Apr 26 11:11:22 UTC 2019 - Neal Gompa <ngompa13@gmail.com> + +- Update to version 4.2.5 + + Fix multilib obsoletes (rh#1672947) + + Do not remove group package if other packages depend on it + + Remove duplicates from "dnf list" and "dnf info" outputs + + Installroot now requires absolute path + + Allow globs in setopt in repoid part + + Fix formatting of message about free space required + + [doc] Add info of relation update_cache with fill_sack (rh#1658694) + + Fix installation failiure when duplicate RPMs are specified (rh#1687286) + + Add command abbreviations (rh#1634232) + + Allow plugins to terminate dnf (rh#1701807) + + Fix installation of bash completion helper (rh#1695853) +- Drop patches that are part of this release + * 0001-Add-command-abbreviations-RhBug-1634232.patch + * 0002-CMake-Actually-install-aliases.patch + * 0001-Fix-the-installation-of-completion_helper.py.patch +- Backport fix for rendering exception messages in Python 3 + * 0001-Python2-3-compatibility-for-exceptions-representatio.patch + +------------------------------------------------------------------- Old: ---- 0001-Add-command-abbreviations-RhBug-1634232.patch 0001-Fix-the-installation-of-completion_helper.py.patch 0002-CMake-Actually-install-aliases.patch dnf-4.2.2.tar.gz New: ---- 0001-Python2-3-compatibility-for-exceptions-representatio.patch dnf-4.2.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dnf.spec ++++++ --- /var/tmp/diff_new_pack.oLbFU0/_old 2019-04-28 20:12:02.622471043 +0200 +++ /var/tmp/diff_new_pack.oLbFU0/_new 2019-04-28 20:12:02.626471041 +0200 @@ -17,7 +17,7 @@ # -%global hawkey_version 0.28.1 +%global hawkey_version 0.31.0 %global libcomps_version 0.1.8 %global rpm_version 4.14.0 %global min_plugins_core 4.0.6 @@ -34,7 +34,7 @@ %bcond_with tests Name: dnf -Version: 4.2.2 +Version: 4.2.5 Release: 0 Summary: Package manager forked from Yum, using libsolv as a dependency resolver # For a breakdown of the licensing, see PACKAGE-LICENSING @@ -44,13 +44,8 @@ Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz # Backports from upstream -## Restore command abbreviations dropped between dnf 2.7.5 to now -Patch0001: 0001-Add-command-abbreviations-RhBug-1634232.patch -## Fix installation of aliases -Patch0002: 0002-CMake-Actually-install-aliases.patch -## Fix installation of completion helper -Patch0003: 0001-Fix-the-installation-of-completion_helper.py.patch - +## Fix exception message reporting in Python 3 +Patch0001: 0001-Python2-3-compatibility-for-exceptions-representatio.patch BuildRequires: bash-completion BuildRequires: cmake ++++++ 0001-Python2-3-compatibility-for-exceptions-representatio.patch ++++++
From db5772cd0c3742894f5f2285c5ce6a7dc0f5c0f8 Mon Sep 17 00:00:00 2001 From: Marek Blaha <mblaha@redhat.com> Date: Tue, 23 Apr 2019 16:39:17 +0200 Subject: [PATCH] Python2/3 compatibility for exceptions representation
In Python3 the __unicode__() method is not called and that resulted in different output when a MarkingError occured. Python2: Error: Unable to find a match: ninja-build-0:1.8.2-5.fc29.x86_64 Python3: Error: Unable to find a match --- dnf/exceptions.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/dnf/exceptions.py b/dnf/exceptions.py index 336ec3c2..20db9b9d 100644 --- a/dnf/exceptions.py +++ b/dnf/exceptions.py @@ -39,10 +39,11 @@ class Error(Exception): self.value = None if value is None else ucd(value) def __str__(self): - return "%s" %(self.value,) + return "{}".format(self.value) def __unicode__(self): - return '%s' % self.value + return ucd(self.__str__()) + class CompsError(Error): @@ -78,9 +79,6 @@ class DownloadError(Error): def __str__(self): return self.errmap2str(self.errmap) - def __unicode__(self): - return ucd(self.__str__()) - class LockError(Error): pass @@ -94,8 +92,8 @@ class MarkingError(Error): super(MarkingError, self).__init__(value) self.pkg_spec = None if pkg_spec is None else ucd(pkg_spec) - def __unicode__(self): - string = super(MarkingError, self).__unicode__() + def __str__(self): + string = super(MarkingError, self).__str__() if self.pkg_spec: string += ': ' + self.pkg_spec return string -- 2.20.1 ++++++ dnf-4.2.2.tar.gz -> dnf-4.2.5.tar.gz ++++++ ++++ 5549 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/VERSION.cmake new/dnf-4.2.5/VERSION.cmake --- old/dnf-4.2.2/VERSION.cmake 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/VERSION.cmake 2019-04-25 10:44:57.000000000 +0200 @@ -1 +1 @@ -SET(DNF_VERSION "4.2.2") +SET(DNF_VERSION "4.2.5") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/base.py new/dnf-4.2.5/dnf/base.py --- old/dnf-4.2.2/dnf/base.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/base.py 2019-04-25 10:44:57.000000000 +0200 @@ -74,6 +74,7 @@ import hawkey import itertools import logging +import math import os import operator import re @@ -133,15 +134,13 @@ def _add_repo_to_sack(self, repo): repo.load() - hrepo = repo._hawkey_repo - repo._repo.initHyRepo(hrepo) mdload_flags = dict(load_filelists=True, load_presto=repo.deltarpm, load_updateinfo=True) if repo.load_metadata_other: mdload_flags["load_other"] = True try: - self._sack.load_repo(hrepo, build_cache=True, **mdload_flags) + self._sack.load_repo(repo._repo, build_cache=True, **mdload_flags) except hawkey.Exception as e: logger.debug(_("loading repo '{}' failure: {}").format(repo.id, e)) raise dnf.exceptions.RepoError( @@ -353,7 +352,8 @@ repo._repo.setMaxMirrorTries(1) if not self.repos._any_enabled(): - logger.info(_('There are no enabled repos.')) + logger.info(_('There are no enabled repositories in "{}".').format( + '", "'.join(self.conf.reposdir))) return False for r in self.repos.iter_enabled(): @@ -383,9 +383,6 @@ """Prepare the Sack and the Goal objects. """ timer = dnf.logging.Timer('sack setup') self.reset(sack=True, goal=True) - if self._repos is not None: - for repo in self._repos.values(): - repo._hawkey_repo = repo._init_hawkey_repo() self._sack = dnf.sack._build_sack(self) lock = dnf.lock.build_metadata_lock(self.conf.cachedir, self.conf.exit_on_lock) with lock: @@ -498,9 +495,6 @@ """Make the Base object forget about various things.""" if sack: self._sack = None - if self._repos is not None: - for repo in self._repos.values(): - repo._hawkey_repo = None if repos: self._repos = dnf.repodict.RepoDict() if goal: @@ -646,9 +640,10 @@ for pkg in goal.list_installs(): self._ds_callback.pkg_added(pkg, 'i') obs = goal.obsoleted_by_package(pkg) - # skip obsoleted packages that are not part of all_obsoleted - # they are handled as upgrades/downgrades - obs = [i for i in obs if i in all_obsoleted] + # Skip obsoleted packages that are not part of all_obsoleted, + # they are handled as upgrades/downgrades. + # Also keep RPMs with the same name - they're not always in all_obsoleted. + obs = [i for i in obs if i in all_obsoleted or i.name == pkg.name] # TODO: move to libdnf: getBestReason reason = goal.get_reason(pkg) @@ -680,9 +675,11 @@ upgraded = obs.pop(0) else: obs.remove(upgraded) - # skip obsoleted packages that are not part of all_obsoleted - # they are handled as upgrades/downgrades - obs = [i for i in obs if i in all_obsoleted] + # Skip obsoleted packages that are not part of all_obsoleted, + # they are handled as upgrades/downgrades. + # Also keep RPMs with the same name - they're not always in all_obsoleted. + obs = [i for i in obs if i in all_obsoleted or i.name == pkg.name] + cb = lambda pkg: self._ds_callback.pkg_added(pkg, 'od') dnf.util.mapall(cb, obs) if pkg in self._get_installonly_query(): @@ -895,13 +892,15 @@ """ summary = '' # do disk space report first - p = re.compile(r'needs (\d+)MB on the (\S+) filesystem') + p = re.compile(r'needs (\d+)(K|M)B on the (\S+) filesystem') disk = {} for m in p.finditer(errstring): - if m.group(2) not in disk: - disk[m.group(2)] = int(m.group(1)) - if disk[m.group(2)] < int(m.group(1)): - disk[m.group(2)] = int(m.group(1)) + size_in_mb = int(m.group(1)) if m.group(2) == 'M' else math.ceil( + int(m.group(1)) / 1024.0) + if m.group(3) not in disk: + disk[m.group(3)] = size_in_mb + if disk[m.group(3)] < size_in_mb: + disk[m.group(3)] = size_in_mb if disk: summary += _('Disk Requirements:') + "\n" @@ -1033,7 +1032,10 @@ return tid def _verify_transaction(self, verify_pkg_cb=None): - total = len(self.transaction) + transaction_items = [ + tsi for tsi in self.transaction + if tsi.action != libdnf.transaction.TransactionItemAction_REASON_CHANGE] + total = len(transaction_items) def display_banner(pkg, count): count += 1 @@ -1062,7 +1064,7 @@ # because DNF trusts error codes returned by RPM. # Verification banner is displayed to preserve UX. # TODO: drop in future DNF - for tsi in self._transaction: + for tsi in transaction_items: count = display_banner(tsi.pkg, count) rpmdbv = rpmdb_sack._rpmdb_version() @@ -1464,9 +1466,16 @@ if not query: return - unneeded_pkgs = query._unneeded(self.history.swdb, debug_solver=False) - unneeded_pkgs_history = query.filter(pkg=[i for i in query if self.history.group.is_removable_pkg(i.name)]) - unneeded_pkgs = unneeded_pkgs.union(unneeded_pkgs_history) + unneeded_pkgs = query._safe_to_remove(self.history.swdb, debug_solver=False) + unneeded_pkgs_history = query.filter( + pkg=[i for i in query if self.history.group.is_removable_pkg(i.name)]) + pkg_with_dependent_pkgs = unneeded_pkgs_history.difference(unneeded_pkgs) + + # mark packages with dependent packages as a dependency to allow removal with dependent + # package + for pkg in pkg_with_dependent_pkgs: + self.history.set_reason(pkg, libdnf.transaction.TransactionItemReason_DEPENDENCY) + unneeded_pkgs = unneeded_pkgs.intersection(unneeded_pkgs_history) remove_packages = query.intersection(unneeded_pkgs) if remove_packages: @@ -1813,7 +1822,7 @@ logger.error(msg, spec) no_match_pkg_specs.append(spec) no_match_module_specs = [] - module_debsolv_errors = () + module_depsolv_errors = () if WITH_MODULES and install_specs.grp_specs: try: module_base = dnf.module.module_base.ModuleBase(self) @@ -1825,7 +1834,7 @@ if e.error_group_specs: for e_spec in e.error_group_specs: error_group_specs.append("@" + e_spec) - module_debsolv_errors = e.module_debsolv_errors + module_depsolv_errors = e.module_depsolv_errors else: no_match_module_specs = install_specs.grp_specs @@ -1836,12 +1845,12 @@ self._install_groups(no_match_module_specs, exclude_specs, no_match_group_specs, strict) if no_match_group_specs or error_group_specs or no_match_pkg_specs or error_pkg_specs \ - or module_debsolv_errors: + or module_depsolv_errors: raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_group_specs, error_group_specs=error_group_specs, no_match_pkg_specs=no_match_pkg_specs, error_pkg_specs=error_pkg_specs, - module_debsolv_errors=module_debsolv_errors) + module_depsolv_errors=module_depsolv_errors) def install(self, pkg_spec, reponame=None, strict=True, forms=None): # :api diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/CMakeLists.txt new/dnf-4.2.5/dnf/cli/CMakeLists.txt --- old/dnf-4.2.2/dnf/cli/CMakeLists.txt 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/CMakeLists.txt 2019-04-25 10:44:57.000000000 +0200 @@ -1,4 +1,6 @@ FILE(GLOB cli_SRCS *.py) INSTALL (FILES ${cli_SRCS} DESTINATION ${PYTHON_INSTALL_DIR}/dnf/cli) +# completion_helper.py is generated so the glob alone won't see it: +INSTALL (FILES completion_helper.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf/cli) -ADD_SUBDIRECTORY (commands) \ No newline at end of file +ADD_SUBDIRECTORY (commands) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/__init__.py new/dnf-4.2.5/dnf/cli/commands/__init__.py --- old/dnf-4.2.2/dnf/cli/commands/__init__.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/__init__.py 2019-04-25 10:44:57.000000000 +0200 @@ -97,8 +97,7 @@ scheme = dnf.pycomp.urlparse.urlparse(lfile)[0] if scheme in ('http', 'ftp', 'file', 'https'): return - - msg = _('There are no enabled repos.') + msg = _('There are no enabled repositories in "{}".').format('", "'.join(base.conf.reposdir)) raise dnf.cli.CliError(msg) @@ -236,7 +235,7 @@ provides command. """ - aliases = ('provides', 'whatprovides') + aliases = ('provides', 'whatprovides', 'prov') summary = _('find what package provides the given value') @staticmethod @@ -817,7 +816,7 @@ history command. """ - aliases = ('history',) + aliases = ('history', 'hist') summary = _('display, or use, the transaction history') transaction_ids = set() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/distrosync.py new/dnf-4.2.5/dnf/cli/commands/distrosync.py --- old/dnf-4.2.2/dnf/cli/commands/distrosync.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/distrosync.py 2019-04-25 10:44:57.000000000 +0200 @@ -28,7 +28,7 @@ distro-synch command. """ - aliases = ('distro-sync', 'distrosync', 'distribution-synchronization') + aliases = ('distro-sync', 'distrosync', 'distribution-synchronization', 'dsync') summary = _('synchronize installed packages to the latest available versions') @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/downgrade.py new/dnf-4.2.5/dnf/cli/commands/downgrade.py --- old/dnf-4.2.2/dnf/cli/commands/downgrade.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/downgrade.py 2019-04-25 10:44:57.000000000 +0200 @@ -30,7 +30,7 @@ downgrade command. """ - aliases = ('downgrade',) + aliases = ('downgrade', 'dg') summary = _("Downgrade a package") @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/group.py new/dnf-4.2.5/dnf/cli/commands/group.py --- old/dnf-4.2.2/dnf/cli/commands/group.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/group.py 2019-04-25 10:44:57.000000000 +0200 @@ -41,7 +41,7 @@ 'groupremove' : 'remove', 'grouperase' : 'remove', 'groupinfo' : 'info'} - aliases = ('group', 'groups') + tuple(direct_commands.keys()) + aliases = ('group', 'groups', 'grp') + tuple(direct_commands.keys()) summary = _('display, or use, the groups information') _CMD_ALIASES = {'update' : 'upgrade', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/install.py new/dnf-4.2.5/dnf/cli/commands/install.py --- old/dnf-4.2.2/dnf/cli/commands/install.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/install.py 2019-04-25 10:44:57.000000000 +0200 @@ -43,7 +43,7 @@ 'install-nevra': hawkey.FORM_NEVRA} alternatives_provide = 'alternative-for({})' - aliases = ('install', 'localinstall') + tuple(nevra_forms.keys()) + aliases = ('install', 'localinstall', 'in') + tuple(nevra_forms.keys()) summary = _('install a package or packages on your system') @staticmethod @@ -91,10 +91,10 @@ if e.error_group_specs: for e_spec in e.error_group_specs: error_module_specs.append("@" + e_spec) - module_debsolv_errors = e.module_debsolv_errors - if module_debsolv_errors: + module_depsolv_errors = e.module_depsolv_errors + if module_depsolv_errors: logger.error(dnf.module.module_base.format_modular_solver_errors( - module_debsolv_errors[0])) + module_depsolv_errors[0])) else: skipped_grp_specs = self.opts.grp_specs if self.opts.filenames and nevra_forms: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/makecache.py new/dnf-4.2.5/dnf/cli/commands/makecache.py --- old/dnf-4.2.2/dnf/cli/commands/makecache.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/makecache.py 2019-04-25 10:44:57.000000000 +0200 @@ -33,7 +33,7 @@ class MakeCacheCommand(commands.Command): - aliases = ('makecache',) + aliases = ('makecache', 'mc') summary = _('generate the metadata cache') @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/module.py new/dnf-4.2.5/dnf/cli/commands/module.py --- old/dnf-4.2.2/dnf/cli/commands/module.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/module.py 2019-04-25 10:44:57.000000000 +0200 @@ -118,7 +118,7 @@ if self.base.conf.strict: if e.no_match_group_specs or e.error_group_specs: raise e - if e.module_debsolv_errors and e.module_debsolv_errors[1] != \ + if e.module_depsolv_errors and e.module_depsolv_errors[1] != \ libdnf.module.ModulePackageContainer.ModuleErrorType_ERROR_IN_DEFAULTS: raise e logger.error(str(e)) @@ -149,7 +149,7 @@ if self.base.conf.strict: if e.no_match_group_specs or e.error_group_specs: raise e - if e.module_debsolv_errors and e.module_debsolv_errors[1] != \ + if e.module_depsolv_errors and e.module_depsolv_errors[1] != \ libdnf.module.ModulePackageContainer.ModuleErrorType_ERROR_IN_DEFAULTS: raise e logger.error(str(e)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/reinstall.py new/dnf-4.2.5/dnf/cli/commands/reinstall.py --- old/dnf-4.2.2/dnf/cli/commands/reinstall.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/reinstall.py 2019-04-25 10:44:57.000000000 +0200 @@ -34,7 +34,7 @@ """A class containing methods needed by the cli to execute the reinstall command. """ - aliases = ('reinstall',) + aliases = ('reinstall', 'rei') summary = _('reinstall a package') @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/remove.py new/dnf-4.2.5/dnf/cli/commands/remove.py --- old/dnf-4.2.2/dnf/cli/commands/remove.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/remove.py 2019-04-25 10:44:57.000000000 +0200 @@ -42,7 +42,7 @@ 'erase-na': hawkey.FORM_NA, 'erase-nevra': hawkey.FORM_NEVRA} - aliases = ('remove', 'erase',) + tuple(nevra_forms.keys()) + aliases = ('remove', 'erase', 'rm') + tuple(nevra_forms.keys()) summary = _('remove a package or packages from your system') @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/repoquery.py new/dnf-4.2.5/dnf/cli/commands/repoquery.py --- old/dnf-4.2.2/dnf/cli/commands/repoquery.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/repoquery.py 2019-04-25 10:44:57.000000000 +0200 @@ -100,7 +100,7 @@ 'repoquery-na': hawkey.FORM_NA, 'repoquery-nevra': hawkey.FORM_NEVRA} - aliases = ('repoquery',) + tuple(nevra_forms.keys()) + aliases = ('repoquery', 'rq') + tuple(nevra_forms.keys()) summary = _('search for packages matching keyword') @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/search.py new/dnf-4.2.5/dnf/cli/commands/search.py --- old/dnf-4.2.2/dnf/cli/commands/search.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/search.py 2019-04-25 10:44:57.000000000 +0200 @@ -42,7 +42,7 @@ search command. """ - aliases = ('search',) + aliases = ('search', 'se') summary = _('search package details for the given string') @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/shell.py new/dnf-4.2.5/dnf/cli/commands/shell.py --- old/dnf-4.2.2/dnf/cli/commands/shell.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/shell.py 2019-04-25 10:44:57.000000000 +0200 @@ -43,7 +43,7 @@ class ShellCommand(commands.Command, cmd.Cmd): - aliases = ('shell',) + aliases = ('shell', 'sh') summary = _('run an interactive DNF shell') MAPPING = {'repo': 'repo', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/upgrade.py new/dnf-4.2.5/dnf/cli/commands/upgrade.py --- old/dnf-4.2.2/dnf/cli/commands/upgrade.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/upgrade.py 2019-04-25 10:44:57.000000000 +0200 @@ -36,7 +36,7 @@ """A class containing methods needed by the cli to execute the update command. """ - aliases = ('upgrade', 'update', 'upgrade-to', 'update-to', 'localupdate') + aliases = ('upgrade', 'update', 'upgrade-to', 'update-to', 'localupdate', 'up') summary = _('upgrade a package or packages on your system') @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/commands/upgrademinimal.py new/dnf-4.2.5/dnf/cli/commands/upgrademinimal.py --- old/dnf-4.2.2/dnf/cli/commands/upgrademinimal.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/commands/upgrademinimal.py 2019-04-25 10:44:57.000000000 +0200 @@ -27,7 +27,7 @@ command. """ - aliases = ('upgrade-minimal', 'update-minimal') + aliases = ('upgrade-minimal', 'update-minimal', 'up-min') summary = _("upgrade, but only 'newest' package match which fixes a problem" " that affects your system") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/cli/output.py new/dnf-4.2.5/dnf/cli/output.py --- old/dnf-4.2.2/dnf/cli/output.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/cli/output.py 2019-04-25 10:44:57.000000000 +0200 @@ -647,6 +647,14 @@ if len(lst) > 0: thingslisted = 1 print('%s' % description) + info_set = set() + if outputType == 'list': + unique_item_dict = {} + for pkg in lst: + unique_item_dict[str(pkg) + str(pkg._from_repo)] = pkg + + lst = unique_item_dict.values() + for pkg in sorted(lst): key = (pkg.name, pkg.arch) highlight = False @@ -663,7 +671,7 @@ self.simpleList(pkg, ui_overflow=True, highlight=highlight, columns=columns) elif outputType == 'info': - print(self.infoOutput(pkg, highlight=highlight) + "\n") + info_set.add(self.infoOutput(pkg, highlight=highlight) + "\n") elif outputType == 'name': self.simple_name_list(pkg) elif outputType == 'nevra': @@ -671,6 +679,9 @@ else: pass + if info_set: + print("\n".join(sorted(info_set))) + if thingslisted == 0: return 1, [_('No packages to list')] return 0, [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/conf/config.py new/dnf-4.2.5/dnf/conf/config.py --- old/dnf-4.2.2/dnf/conf/config.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/conf/config.py 2019-04-25 10:44:57.000000000 +0200 @@ -24,7 +24,7 @@ from dnf.i18n import ucd, _ from dnf.pycomp import basestring -import copy +import fnmatch import dnf.conf.substitutions import dnf.const import dnf.exceptions @@ -438,10 +438,10 @@ self._set_value(optname, False, dnf.conf.PRIO_COMMANDLINE) repo_setopts = getattr(opts, 'repo_setopts', {}) - if self._section in repo_setopts: - # pylint: disable=W0212 - setopts = repo_setopts[self._section].items() - for name, values in setopts: + for repoid, setopts in repo_setopts.items(): + if not fnmatch.fnmatch(self._section, repoid): + continue + for name, values in setopts.items(): for val in values: if hasattr(self._config, name): try: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/exceptions.py new/dnf-4.2.5/dnf/exceptions.py --- old/dnf-4.2.2/dnf/exceptions.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/exceptions.py 2019-04-25 10:44:57.000000000 +0200 @@ -21,6 +21,7 @@ from dnf.i18n import ucd, _, P_ import dnf.util import libdnf +import warnings class DeprecationWarning(DeprecationWarning): # :api @@ -102,7 +103,7 @@ class MarkingErrors(Error): def __init__(self, no_match_group_specs=(), error_group_specs=(), no_match_pkg_specs=(), - error_pkg_specs=(), module_debsolv_errors=()): + error_pkg_specs=(), module_depsolv_errors=()): """Initialize the marking error instance.""" msg = _("Problems in request:") if (no_match_pkg_specs): @@ -113,25 +114,32 @@ msg += "\n" + _("missing groups or modules: ") + ", ".join(no_match_group_specs) if (error_group_specs): msg += "\n" + _("broken groups or modules: ") + ", ".join(error_group_specs) - if (module_debsolv_errors): - msg_mod = dnf.util._format_resolve_problems(module_debsolv_errors[0]) - if module_debsolv_errors[1] == \ + if (module_depsolv_errors): + msg_mod = dnf.util._format_resolve_problems(module_depsolv_errors[0]) + if module_depsolv_errors[1] == \ libdnf.module.ModulePackageContainer.ModuleErrorType_ERROR_IN_DEFAULTS: msg += "\n" + "\n".join([P_('Modular dependency problem with Defaults:', 'Modular dependency problems with Defaults:', - len(module_debsolv_errors)), + len(module_depsolv_errors)), msg_mod]) else: msg += "\n" + "\n".join([P_('Modular dependency problem:', 'Modular dependency problems:', - len(module_debsolv_errors)), + len(module_depsolv_errors)), msg_mod]) super(MarkingErrors, self).__init__(msg) self.no_match_group_specs = no_match_group_specs self.error_group_specs = error_group_specs self.no_match_pkg_specs = no_match_pkg_specs self.error_pkg_specs = error_pkg_specs - self.module_debsolv_errors = module_debsolv_errors + self.module_depsolv_errors = module_depsolv_errors + + @property + def module_debsolv_errors(self): + msg = "Attribute module_debsolv_errors is deprecated. Use module_depsolv_errors " \ + "attribute instead." + warnings.warn(msg, DeprecationWarning, stacklevel=2) + return self.module_depsolv_errors class MetadataError(Error): pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/i18n.py new/dnf-4.2.5/dnf/i18n.py --- old/dnf-4.2.2/dnf/i18n.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/i18n.py 2019-04-25 10:44:57.000000000 +0200 @@ -80,11 +80,16 @@ def setup_locale(): try: dnf.pycomp.setlocale(locale.LC_ALL, '') - except locale.Error as e: - # default to C locale if we get a failure. - print('Failed to set locale, defaulting to C', file=sys.stderr) - os.environ['LC_ALL'] = 'C' - dnf.pycomp.setlocale(locale.LC_ALL, 'C') + except locale.Error: + # default to C.UTF-8 or C locale if we got a failure. + try: + dnf.pycomp.setlocale(locale.LC_ALL, 'C.UTF-8') + os.environ['LC_ALL'] = 'C.UTF-8' + except locale.Error: + dnf.pycomp.setlocale(locale.LC_ALL, 'C') + os.environ['LC_ALL'] = 'C' + print('Failed to set locale, defaulting to {}'.format(os.environ['LC_ALL']), + file=sys.stderr) def setup_stdout(): """ Check that stdout is of suitable encoding and handle the situation if diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/module/module_base.py new/dnf-4.2.5/dnf/module/module_base.py --- old/dnf-4.2.2/dnf/module/module_base.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/module/module_base.py 2019-04-25 10:44:57.000000000 +0200 @@ -48,13 +48,13 @@ if no_match_specs or error_specs or solver_errors: raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs, error_group_specs=error_specs, - module_debsolv_errors=solver_errors) + module_depsolv_errors=solver_errors) def disable(self, module_specs): no_match_specs, solver_errors = self._modules_reset_or_disable(module_specs, STATE_DISABLED) if no_match_specs or solver_errors: raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs, - module_debsolv_errors=solver_errors) + module_depsolv_errors=solver_errors) def install(self, module_specs, strict=True): no_match_specs, error_specs, solver_errors, module_dicts = \ @@ -126,13 +126,13 @@ if no_match_specs or error_specs or solver_errors: raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs, error_group_specs=error_specs, - module_debsolv_errors=solver_errors) + module_depsolv_errors=solver_errors) def reset(self, module_specs): no_match_specs, solver_errors = self._modules_reset_or_disable(module_specs, STATE_UNKNOWN) if no_match_specs: raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs, - module_debsolv_errors=solver_errors) + module_depsolv_errors=solver_errors) def upgrade(self, module_specs): no_match_specs = [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/plugin.py new/dnf-4.2.5/dnf/plugin.py --- old/dnf-4.2.2/dnf/plugin.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/plugin.py 2019-04-25 10:44:57.000000000 +0200 @@ -102,6 +102,8 @@ for plugin in self.plugins: try: getattr(plugin, method)() + except dnf.exceptions.Error: + raise except Exception: exc_type, exc_value, exc_traceback = sys.exc_info() except_list = traceback.format_exception(exc_type, exc_value, exc_traceback) @@ -194,7 +196,7 @@ try: module = importlib.import_module(name) except Exception as e: - logger.error(_('Failed loading plugin: %s'), module) + logger.error(_('Failed loading plugin "%s": %s'), module, e) logger.log(dnf.logging.SUBDEBUG, '', exc_info=True) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/repo.py new/dnf-4.2.5/dnf/repo.py --- old/dnf-4.2.2/dnf/repo.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/repo.py 2019-04-25 10:44:57.000000000 +0200 @@ -436,7 +436,6 @@ if parent_conf: self._repo.setSubstitutions(parent_conf.substitutions) self._substitutions = dnf.conf.substitutions.Substitutions() - self._hawkey_repo = self._init_hawkey_repo() self._check_config_file_age = parent_conf.check_config_file_age \ if parent_conf is not None else True @@ -488,16 +487,6 @@ def __setattr__(self, name, value): super(Repo, self).__setattr__(name, value) - if name == 'cost': - self._hawkey_repo.cost = self.cost - if name == 'priority': - self._hawkey_repo.priority = self.priority - - def _init_hawkey_repo(self): - hrepo = hawkey.Repo(self.id) - hrepo.cost = self.cost - hrepo.priority = self.priority - return hrepo def disable(self): # :api diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/rpm/transaction.py new/dnf-4.2.5/dnf/rpm/transaction.py --- old/dnf-4.2.2/dnf/rpm/transaction.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/rpm/transaction.py 2019-04-25 10:44:57.000000000 +0200 @@ -11,6 +11,7 @@ from __future__ import absolute_import from __future__ import unicode_literals +from dnf.i18n import _ import rpm read_ts = None @@ -111,9 +112,11 @@ self.ts.setFlags(origflags) reserrors = [] - if tserrors: + if tserrors is not None: for (descr, (etype, mount, need)) in tserrors: reserrors.append(descr) + if not reserrors: + reserrors.append(_('Errors occurred during test transaction.')) return reserrors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/sack.py new/dnf-4.2.5/dnf/sack.py --- old/dnf-4.2.2/dnf/sack.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/sack.py 2019-04-25 10:44:57.000000000 +0200 @@ -31,7 +31,6 @@ class Sack(hawkey.Sack): def __init__(self, *args, **kwargs): super(Sack, self).__init__(*args, **kwargs) - self._moduleContainer = None def _configure(self, installonly=None, installonly_limit=0): if installonly: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf/util.py new/dnf-4.2.5/dnf/util.py --- old/dnf-4.2.2/dnf/util.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf/util.py 2019-04-25 10:44:57.000000000 +0200 @@ -63,7 +63,11 @@ setattr(namespace, "filenames", []) setattr(namespace, "grp_specs", []) setattr(namespace, "pkg_specs", []) + tmp_set = set() for value in values: + if value in tmp_set: + continue + tmp_set.add(value) schemes = dnf.pycomp.urlparse.urlparse(value)[0] if value.endswith('.rpm'): namespace.filenames.append(value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/dnf.spec new/dnf-4.2.5/dnf.spec --- old/dnf-4.2.2/dnf.spec 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/dnf.spec 2019-04-25 10:44:57.000000000 +0200 @@ -1,5 +1,5 @@ # default dependencies -%global hawkey_version 0.28.0 +%global hawkey_version 0.31.0 %global libcomps_version 0.1.8 %global libmodulemd_version 1.4.0 %global rpm_version 4.14.0 @@ -79,7 +79,7 @@ It supports RPMs, modules and comps groups & environments. Name: dnf -Version: 4.2.2 +Version: 4.2.5 Release: 1%{?dist} Summary: %{pkg_summary} # For a breakdown of the licensing, see PACKAGE-LICENSING @@ -212,7 +212,7 @@ %description -n python2-%{name} Python 2 interface to DNF. %endif -# ^ %{with python2} +# ^ %%{with python2} %if %{with python3} %package -n python3-%{name} @@ -412,6 +412,7 @@ %dir %{confdir}/protected.d %dir %{confdir}/vars %dir %{confdir}/aliases.d +%exclude %{confdir}/aliases.d/zypper.conf %config(noreplace) %{confdir}/%{name}.conf %config(noreplace) %{confdir}/protected.d/%{name}.conf %config(noreplace) %{_sysconfdir}/logrotate.d/%{name} @@ -498,6 +499,19 @@ %endif %changelog +* Thu Apr 25 2019 Pavla Kratochvilova <pkratoch@redhat.com> - 4.2.5-1 +- Fix multilib obsoletes (RhBug:1672947) +- Do not remove group package if other packages depend on it +- Remove duplicates from "dnf list" and "dnf info" outputs +- Installroot now requires absolute path +- Fix the installation of completion_helper.py +- Allow globs in setopt in repoid part +- Fix formatting of message about free space required +- [doc] Add info of relation update_cache with fill_sack (RhBug:1658694) +- Fix installation failiure when duplicit RPMs are specified (RhBug:1687286) +- Add command abbreviations (RhBug:1634232) +- Allow plugins to terminate dnf (RhBug:1701807) + * Wed Mar 27 2019 Pavla Kratochvilova <pkratoch@redhat.com> - 4.2.2-1 - [conf] Use environment variables prefixed with DNF_VAR_ - Enhance documentation of --whatdepends option (RhBug:1687070) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/api_base.rst new/dnf-4.2.5/doc/api_base.rst --- old/dnf-4.2.2/doc/api_base.rst 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/api_base.rst 2019-04-25 10:44:57.000000000 +0200 @@ -146,9 +146,15 @@ .. method:: update_cache(timer=False) - Downloads and caches in binary format metadata for all known repos. Tries to avoid downloading whenever possible (e.g. when the local metadata hasn’t expired yet or when the metadata timestamp hasn’t changed). + Downloads and caches in binary format metadata for all known repos. Tries to avoid downloading + whenever possible (e.g. when the local metadata hasn’t expired yet or when the metadata + timestamp hasn’t changed). - If 'timer' equals 'True', DNF becomes more resource-aware, meaning DNF will not do anything if running on battery power and will terminate immediately if it’s too soon after the last successful update_cache operation7. + If 'timer' equals 'True', DNF becomes more resource-aware, meaning DNF will not do anything if + running on battery power and will terminate immediately if it’s too soon after the last + successful update_cache operation. + + When the method is used after :meth:`fill_sack`, information about packages will not be updated. .. _package_marking-label: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/api_cli.rst new/dnf-4.2.5/doc/api_cli.rst --- old/dnf-4.2.2/doc/api_cli.rst 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/api_cli.rst 2019-04-25 10:44:57.000000000 +0200 @@ -37,7 +37,7 @@ .. attribute:: allow_erasing - If ``True``, the dependnecy solver is allowed to look for solutions that include removing other packages while looking to fulfill the current packaging requests. Defaults to ``False``. Also see :meth:`dnf.Base.resolve`. + If ``True``, the dependency solver is allowed to look for solutions that include removing other packages while looking to fulfill the current packaging requests. Defaults to ``False``. Also see :meth:`dnf.Base.resolve`. .. attribute:: available_repos diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/api_conf.rst new/dnf-4.2.5/doc/api_conf.rst --- old/dnf-4.2.2/doc/api_conf.rst 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/api_conf.rst 2019-04-25 10:44:57.000000000 +0200 @@ -100,7 +100,7 @@ .. attribute:: installroot - The root of the filesystem for all packaging operations. + The root of the filesystem for all packaging operations. It requires absolute path. .. attribute:: keepcache diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/api_queries.rst new/dnf-4.2.5/doc/api_queries.rst --- old/dnf-4.2.2/doc/api_queries.rst 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/api_queries.rst 2019-04-25 10:44:57.000000000 +0200 @@ -85,7 +85,7 @@ upgrades boolean see :meth:`upgrades`. Defaults to ``False``. =============== ============== ====================================================== - *The key can also accept a list of values with specified type. + \* The key can also accept a list of values with specified type. The key name can be supplemented with a relation-specifying suffix, separated by ``__``: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/cli_vs_yum.rst new/dnf-4.2.5/doc/cli_vs_yum.rst --- old/dnf-4.2.2/doc/cli_vs_yum.rst 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/cli_vs_yum.rst 2019-04-25 10:44:57.000000000 +0200 @@ -391,11 +391,11 @@ ``package-cleanup --oldkernels`` ``dnf remove --oldinstallonly`` ================================== ===================================== -================ -yum-updateonboot -================ +============================= +yum-updateonboot and yum-cron +============================= -DNF does not have a direct replacement of yum-updateonboot command. +DNF does not have a direct replacement of yum-updateonboot and yum-cron commands. However, the similar result can be achieved by ``dnf automatic`` command (see :doc:`automatic`). You can either use the shortcut:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/command_ref.rst new/dnf-4.2.5/doc/command_ref.rst --- old/dnf-4.2.2/doc/command_ref.rst 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/command_ref.rst 2019-04-25 10:44:57.000000000 +0200 @@ -228,7 +228,7 @@ ``--installroot=<path>`` Specifies an alternative installroot, relative to where all packages will be installed. Think of this like doing ``chroot <root> dnf``, except using - ``--installroot`` allows dnf to work before the chroot is created. + ``--installroot`` allows dnf to work before the chroot is created. It requires absolute path. - *cachedir*, *log files*, *releasever*, and *gpgkey* are taken from or stored in the installroot. *Gpgkeys* are imported into the installroot from diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/release_notes.rst new/dnf-4.2.5/doc/release_notes.rst --- old/dnf-4.2.2/doc/release_notes.rst 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/release_notes.rst 2019-04-25 10:44:57.000000000 +0200 @@ -20,6 +20,30 @@ ################### =================== +4.2.5 Release Notes +=================== + +- Fix multilib obsoletes (RhBug:1672947) +- Do not remove group package if other packages depend on it +- Remove duplicates from "dnf list" and "dnf info" outputs +- Installroot now requires absolute path +- Fix the installation of completion_helper.py +- Allow globs in setopt in repoid part +- Fix formatting of message about free space required +- [doc] Add info of relation update_cache with fill_sack (RhBug:1658694) +- Fix installation failiure when duplicit RPMs are specified (RhBug:1687286) +- Add command abbreviations (RhBug:1634232) +- Allow plugins to terminate dnf (RhBug:1701807) + +Bugs fixed in 4.2.5: + +* :rhbug:`1701807` +* :rhbug:`1634232` +* :rhbug:`1687286` +* :rhbug:`1658694` +* :rhbug:`1672947` + +=================== 4.2.2 Release Notes =================== @@ -355,6 +379,7 @@ * :attr:`dnf.conf.Conf.ignorearch` * Introduced new configuration option ``autocheck_running_kernel`` * :meth:`dnf.subject.Subject.get_best_selector` can use three additional key words: ``obsoletes``, ``reports``, and ``reponame``. + From commandline it is possible to use new option ``--noautoremove`` to disable removal of dependencies that are no longer used. Bugs fixed in 2.6.2: @@ -625,8 +650,7 @@ * ``--releasever`` :doc:`command line argument <command_ref>` now doesn't detect release number from running system. * ``--repofrompath`` :doc:`command line argument <command_ref>` can now be combined with ``--repo`` instead of ``--enablerepo``. * Alternative of yum's ``deplist`` changes from ``dnf repoquery --requires`` to ``dnf repoquery --deplist``. -* New systemd units `dnf-automatic-notifyonly`, `dnf-automatic-download`, `dnf-automatic-download` -were added for a better customizability of :doc:`dnf-automatic <automatic>`. +* New systemd units `dnf-automatic-notifyonly`, `dnf-automatic-download`, `dnf-automatic-download` were added for a better customizability of :doc:`dnf-automatic <automatic>`. DNF command additions in 2.0.0: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/doc/summaries_cache new/dnf-4.2.5/doc/summaries_cache --- old/dnf-4.2.2/doc/summaries_cache 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/doc/summaries_cache 2019-04-25 10:44:57.000000000 +0200 @@ -2702,5 +2702,25 @@ [ 1687070, "[REF] Provide single command, which tells what depends on specific package." + ], + [ + 1701807, + "dnf ignores exception error raised by plugin etckeeper-dnf" + ], + [ + 1634232, + "dnf lost aliases for command arguments" + ], + [ + 1687286, + "Specifying same RPM filename in commandline breaks installation" + ], + [ + 1658694, + "DNF Python API update_cache() breaks transaction check" + ], + [ + 1672947, + "dnf prints tracebacks RuntimeError: TransactionItem not found for key" ] ] \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/etc/dnf/CMakeLists.txt new/dnf-4.2.5/etc/dnf/CMakeLists.txt --- old/dnf-4.2.2/etc/dnf/CMakeLists.txt 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/etc/dnf/CMakeLists.txt 2019-04-25 10:44:57.000000000 +0200 @@ -1,2 +1,3 @@ INSTALL (FILES "dnf.conf" "automatic.conf" DESTINATION ${SYSCONFDIR}/dnf) +ADD_SUBDIRECTORY (aliases.d) ADD_SUBDIRECTORY (protected.d) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/etc/dnf/aliases.d/CMakeLists.txt new/dnf-4.2.5/etc/dnf/aliases.d/CMakeLists.txt --- old/dnf-4.2.2/etc/dnf/aliases.d/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/dnf-4.2.5/etc/dnf/aliases.d/CMakeLists.txt 2019-04-25 10:44:57.000000000 +0200 @@ -0,0 +1 @@ +INSTALL (FILES "zypper.conf" DESTINATION ${SYSCONFDIR}/dnf/aliases.d) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/etc/dnf/aliases.d/zypper.conf new/dnf-4.2.5/etc/dnf/aliases.d/zypper.conf --- old/dnf-4.2.2/etc/dnf/aliases.d/zypper.conf 1970-01-01 01:00:00.000000000 +0100 +++ new/dnf-4.2.5/etc/dnf/aliases.d/zypper.conf 2019-04-25 10:44:57.000000000 +0200 @@ -0,0 +1,7 @@ +[aliases] +dup = distro-sync +dist-upgrade = distro-sync +ref = makecache +refresh = makecache +ri = reinstall + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/po/CMakeLists.txt new/dnf-4.2.5/po/CMakeLists.txt --- old/dnf-4.2.2/po/CMakeLists.txt 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/po/CMakeLists.txt 2019-04-25 10:44:57.000000000 +0200 @@ -3,7 +3,7 @@ file (RELATIVE_PATH SRCDIR ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/dnf) ADD_CUSTOM_TARGET (gettext-export find ${SRCDIR} -iname "*.py" | - xargs xgettext --from-code=UTF-8 --keyword=P_:1,2 --keyword=C_:1c,2 -c --output=dnf.pot && + xargs xgettext -F --from-code=UTF-8 --keyword=P_:1,2 --keyword=C_:1c,2 -c --output=dnf.pot && zanata push -f WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Pushing translation source file to zanata") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/rel-eng/packages/dnf new/dnf-4.2.5/rel-eng/packages/dnf --- old/dnf-4.2.2/rel-eng/packages/dnf 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/rel-eng/packages/dnf 2019-04-25 10:44:57.000000000 +0200 @@ -1 +1 @@ -4.2.2-1 ./ +4.2.5-1 ./ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/tests/conf/test_parser.py new/dnf-4.2.5/tests/conf/test_parser.py --- old/dnf-4.2.2/tests/conf/test_parser.py 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/tests/conf/test_parser.py 2019-04-25 10:44:57.000000000 +0200 @@ -60,4 +60,4 @@ conf = dnf.conf.Conf() conf.config_file_path = FN conf.read() - self.assertEqual(conf.installroot, '') + self.assertEqual(conf.reposdir, '') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/dnf-4.2.2/tests/etc/empty_option.conf new/dnf-4.2.5/tests/etc/empty_option.conf --- old/dnf-4.2.2/tests/etc/empty_option.conf 2019-03-27 12:42:04.000000000 +0100 +++ new/dnf-4.2.5/tests/etc/empty_option.conf 2019-04-25 10:44:57.000000000 +0200 @@ -1,2 +1,2 @@ [main] -installroot = +reposdir =
participants (1)
-
root