|
Packit Service |
21c75c |
# upgrade.py
|
|
Packit Service |
21c75c |
# Upgrade CLI command.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
# Copyright (C) 2014-2016 Red Hat, Inc.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
# This copyrighted material is made available to anyone wishing to use,
|
|
Packit Service |
21c75c |
# modify, copy, or redistribute it subject to the terms and conditions of
|
|
Packit Service |
21c75c |
# the GNU General Public License v.2, or (at your option) any later version.
|
|
Packit Service |
21c75c |
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
Packit Service |
21c75c |
# ANY WARRANTY expressed or implied, including the implied warranties of
|
|
Packit Service |
21c75c |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
Packit Service |
21c75c |
# Public License for more details. You should have received a copy of the
|
|
Packit Service |
21c75c |
# GNU General Public License along with this program; if not, write to the
|
|
Packit Service |
21c75c |
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
21c75c |
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
|
|
Packit Service |
21c75c |
# source code or documentation are not subject to the GNU General Public
|
|
Packit Service |
21c75c |
# License and may only be used or replicated with the express permission of
|
|
Packit Service |
21c75c |
# Red Hat, Inc.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
from __future__ import absolute_import
|
|
Packit Service |
21c75c |
from __future__ import unicode_literals
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
import logging
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
import dnf.exceptions
|
|
Packit Service |
21c75c |
import dnf.base
|
|
Packit Service |
21c75c |
from dnf.cli import commands
|
|
Packit Service |
21c75c |
from dnf.cli.option_parser import OptionParser
|
|
Packit Service |
21c75c |
from dnf.i18n import _
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
logger = logging.getLogger('dnf')
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
class UpgradeCommand(commands.Command):
|
|
Packit Service |
21c75c |
"""A class containing methods needed by the cli to execute the
|
|
Packit Service |
21c75c |
update command.
|
|
Packit Service |
21c75c |
"""
|
|
Packit Service |
21c75c |
aliases = ('upgrade', 'update', 'upgrade-to', 'update-to', 'localupdate', 'up')
|
|
Packit Service |
21c75c |
summary = _('upgrade a package or packages on your system')
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
@staticmethod
|
|
Packit Service |
21c75c |
def set_argparser(parser):
|
|
Packit Service |
21c75c |
parser.add_argument('packages', nargs='*', help=_('Package to upgrade'),
|
|
Packit Service |
21c75c |
action=OptionParser.ParseSpecGroupFileCallback,
|
|
Packit Service |
21c75c |
metavar=_('PACKAGE'))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def configure(self):
|
|
Packit Service |
21c75c |
"""Verify that conditions are met so that this command can run.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
These include that there are enabled repositories with gpg
|
|
Packit Service |
21c75c |
keys, and that this command is being run by the root user.
|
|
Packit Service |
21c75c |
"""
|
|
Packit Service |
21c75c |
demands = self.cli.demands
|
|
Packit Service |
21c75c |
demands.sack_activation = True
|
|
Packit Service |
21c75c |
demands.available_repos = True
|
|
Packit Service |
21c75c |
demands.resolving = True
|
|
Packit Service |
21c75c |
demands.root_user = True
|
|
Packit Service |
21c75c |
commands._checkGPGKey(self.base, self.cli)
|
|
Packit Service |
21c75c |
if not self.opts.filenames:
|
|
Packit Service |
21c75c |
commands._checkEnabledRepo(self.base)
|
|
Packit Service |
21c75c |
self.upgrade_minimal = None
|
|
Packit Service |
21c75c |
self.all_security = None
|
|
Packit Service |
21c75c |
self.skipped_grp_specs = None
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def run(self):
|
|
Packit Service |
21c75c |
query = self.base.sack.query().upgrades()
|
|
Packit Service |
21c75c |
if self.base.conf.obsoletes:
|
|
Packit Service |
21c75c |
obsoleted = query.union(self.base.sack.query().installed())
|
|
Packit Service |
21c75c |
obsoletes = self.base.sack.query().filter(obsoletes=obsoleted)
|
|
Packit Service |
21c75c |
query = query.union(obsoletes)
|
|
Packit Service |
21c75c |
cmp_type = "eq" if self.upgrade_minimal else "gte"
|
|
Packit Service |
21c75c |
self.cli._populate_update_security_filter(self.opts, query, cmp_type=cmp_type,
|
|
Packit Service |
21c75c |
all=self.all_security)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
if self.opts.filenames or self.opts.pkg_specs or self.opts.grp_specs:
|
|
Packit Service |
21c75c |
result = False
|
|
Packit Service |
21c75c |
result |= self._update_modules()
|
|
Packit Service |
21c75c |
result |= self._update_files()
|
|
Packit Service |
21c75c |
result |= self._update_packages()
|
|
Packit Service |
21c75c |
result |= self._update_groups()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
if result:
|
|
Packit Service |
21c75c |
return
|
|
Packit Service |
21c75c |
else:
|
|
Packit Service |
21c75c |
self.base.upgrade_all()
|
|
Packit Service |
21c75c |
return
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
raise dnf.exceptions.Error(_('No packages marked for upgrade.'))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def _update_modules(self):
|
|
Packit Service |
21c75c |
group_specs_num = len(self.opts.grp_specs)
|
|
Packit Service |
21c75c |
if dnf.base.WITH_MODULES:
|
|
Packit Service |
21c75c |
module_base = dnf.module.module_base.ModuleBase(self.base)
|
|
Packit Service |
21c75c |
self.skipped_grp_specs = module_base.upgrade(self.opts.grp_specs)
|
|
Packit Service |
21c75c |
else:
|
|
Packit Service |
21c75c |
self.skipped_grp_specs = self.opts.grp_specs
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
return len(self.skipped_grp_specs) != group_specs_num
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def _update_files(self):
|
|
Packit Service |
21c75c |
success = False
|
|
Packit Service |
21c75c |
if self.opts.filenames:
|
|
Packit Service |
21c75c |
for pkg in self.base.add_remote_rpms(self.opts.filenames, strict=False,
|
|
Packit Service |
21c75c |
progress=self.base.output.progress):
|
|
Packit Service |
21c75c |
try:
|
|
Packit Service |
21c75c |
self.base.package_upgrade(pkg)
|
|
Packit Service |
21c75c |
success = True
|
|
Packit Service |
21c75c |
except dnf.exceptions.MarkingError as e:
|
|
Packit Service |
21c75c |
logger.info(_('No match for argument: %s'),
|
|
Packit Service |
21c75c |
self.base.output.term.bold(pkg.location))
|
|
Packit Service |
21c75c |
return success
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def _update_packages(self):
|
|
Packit Service |
21c75c |
success = False
|
|
Packit Service |
21c75c |
for pkg_spec in self.opts.pkg_specs:
|
|
Packit Service |
21c75c |
try:
|
|
Packit Service |
21c75c |
self.base.upgrade(pkg_spec)
|
|
Packit Service |
21c75c |
success = True
|
|
Packit Service |
21c75c |
except dnf.exceptions.MarkingError as e:
|
|
Packit Service |
21c75c |
logger.info(_('No match for argument: %s'),
|
|
Packit Service |
21c75c |
self.base.output.term.bold(pkg_spec))
|
|
Packit Service |
21c75c |
return success
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def _update_groups(self):
|
|
Packit Service |
21c75c |
if self.skipped_grp_specs:
|
|
Packit Service |
21c75c |
self.base.env_group_upgrade(self.skipped_grp_specs)
|
|
Packit Service |
21c75c |
return True
|
|
Packit Service |
21c75c |
return False
|