|
Packit |
6f3914 |
# -*- coding: utf-8 -*-
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# Copyright (C) 2017-2018 Red Hat, Inc.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
# This program is free software; you can redistribute it and/or modify
|
|
Packit |
6f3914 |
# it under the terms of the GNU General Public License as published by
|
|
Packit |
6f3914 |
# the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
6f3914 |
# (at your option) any later version.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
# This program is distributed in the hope that it will be useful,
|
|
Packit |
6f3914 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
6f3914 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
6f3914 |
# GNU Library General Public License for more details.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
# You should have received a copy of the GNU General Public License
|
|
Packit |
6f3914 |
# along with this program; if not, write to the Free Software
|
|
Packit |
6f3914 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
import libdnf.transaction
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
import dnf.db.history
|
|
Packit |
6f3914 |
import dnf.transaction
|
|
Packit |
6f3914 |
import dnf.exceptions
|
|
Packit |
6f3914 |
from dnf.i18n import _
|
|
Packit |
6f3914 |
from dnf.util import logger
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class PersistorBase(object):
|
|
Packit |
6f3914 |
def __init__(self, history):
|
|
Packit |
6f3914 |
assert isinstance(history, dnf.db.history.SwdbInterface), str(type(history))
|
|
Packit |
6f3914 |
self.history = history
|
|
Packit |
6f3914 |
self._installed = {}
|
|
Packit |
6f3914 |
self._removed = {}
|
|
Packit |
6f3914 |
self._upgraded = {}
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __len__(self):
|
|
Packit |
6f3914 |
return len(self._installed) + len(self._removed) + len(self._upgraded)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def clean(self):
|
|
Packit |
6f3914 |
self._installed = {}
|
|
Packit |
6f3914 |
self._removed = {}
|
|
Packit |
6f3914 |
self._upgraded = {}
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _get_obj_id(self, obj):
|
|
Packit |
6f3914 |
raise NotImplementedError
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def install(self, obj):
|
|
Packit |
6f3914 |
self._installed[self._get_obj_id(obj)] = obj
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def remove(self, obj):
|
|
Packit |
6f3914 |
self._removed[self._get_obj_id(obj)] = obj
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def upgrade(self, obj):
|
|
Packit |
6f3914 |
self._upgraded[self._get_obj_id(obj)] = obj
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def new(self, obj_id, name, translated_name, pkg_types):
|
|
Packit |
6f3914 |
raise NotImplementedError
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get(self, obj_id):
|
|
Packit |
6f3914 |
raise NotImplementedError
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def search_by_pattern(self, pattern):
|
|
Packit |
6f3914 |
raise NotImplementedError
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class GroupPersistor(PersistorBase):
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __iter__(self):
|
|
Packit |
6f3914 |
items = self.history.swdb.getItems()
|
|
Packit |
6f3914 |
items = [i for i in items if i.getCompsGroupItem()]
|
|
Packit |
6f3914 |
return iter(items)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _get_obj_id(self, obj):
|
|
Packit |
6f3914 |
return obj.getGroupId()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def new(self, obj_id, name, translated_name, pkg_types):
|
|
Packit |
6f3914 |
swdb_group = self.history.swdb.createCompsGroupItem()
|
|
Packit |
6f3914 |
swdb_group.setGroupId(obj_id)
|
|
Packit |
6f3914 |
swdb_group.setName(name)
|
|
Packit |
6f3914 |
swdb_group.setTranslatedName(translated_name)
|
|
Packit |
6f3914 |
swdb_group.setPackageTypes(pkg_types)
|
|
Packit |
6f3914 |
return swdb_group
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get(self, obj_id):
|
|
Packit |
6f3914 |
swdb_group = self.history.swdb.getCompsGroupItem(obj_id)
|
|
Packit |
6f3914 |
if not swdb_group:
|
|
Packit |
6f3914 |
return None
|
|
Packit |
6f3914 |
swdb_group = swdb_group.getCompsGroupItem()
|
|
Packit |
6f3914 |
return swdb_group
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def search_by_pattern(self, pattern):
|
|
Packit |
6f3914 |
return self.history.swdb.getCompsGroupItemsByPattern(pattern)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get_package_groups(self, pkg_name):
|
|
Packit |
6f3914 |
return self.history.swdb.getPackageCompsGroups(pkg_name)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def is_removable_pkg(self, pkg_name):
|
|
Packit |
6f3914 |
# for group removal and autoremove
|
|
Packit |
6f3914 |
reason = self.history.swdb.resolveRPMTransactionItemReason(pkg_name, "", -2)
|
|
Packit |
6f3914 |
if reason != libdnf.transaction.TransactionItemReason_GROUP:
|
|
Packit |
6f3914 |
return False
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# TODO: implement lastTransId == -2 in libdnf
|
|
Packit |
6f3914 |
package_groups = set(self.get_package_groups(pkg_name))
|
|
Packit |
6f3914 |
for group_id, group in self._removed.items():
|
|
Packit |
6f3914 |
for pkg in group.getPackages():
|
|
Packit |
6f3914 |
if pkg.getName() != pkg_name:
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
if not pkg.getInstalled():
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
package_groups.remove(group_id)
|
|
Packit |
6f3914 |
for group_id, group in self._installed.items():
|
|
Packit |
6f3914 |
for pkg in group.getPackages():
|
|
Packit |
6f3914 |
if pkg.getName() != pkg_name:
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
if not pkg.getInstalled():
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
package_groups.add(group_id)
|
|
Packit |
6f3914 |
if package_groups:
|
|
Packit |
6f3914 |
return False
|
|
Packit |
6f3914 |
return True
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class EnvironmentPersistor(PersistorBase):
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __iter__(self):
|
|
Packit |
6f3914 |
items = self.history.swdb.getItems()
|
|
Packit |
6f3914 |
items = [i for i in items if i.getCompsEnvironmentItem()]
|
|
Packit |
6f3914 |
return iter(items)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _get_obj_id(self, obj):
|
|
Packit |
6f3914 |
return obj.getEnvironmentId()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def new(self, obj_id, name, translated_name, pkg_types):
|
|
Packit |
6f3914 |
swdb_env = self.history.swdb.createCompsEnvironmentItem()
|
|
Packit |
6f3914 |
swdb_env.setEnvironmentId(obj_id)
|
|
Packit |
6f3914 |
swdb_env.setName(name)
|
|
Packit |
6f3914 |
swdb_env.setTranslatedName(translated_name)
|
|
Packit |
6f3914 |
swdb_env.setPackageTypes(pkg_types)
|
|
Packit |
6f3914 |
return swdb_env
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get(self, obj_id):
|
|
Packit |
6f3914 |
swdb_env = self.history.swdb.getCompsEnvironmentItem(obj_id)
|
|
Packit |
6f3914 |
if not swdb_env:
|
|
Packit |
6f3914 |
return None
|
|
Packit |
6f3914 |
swdb_env = swdb_env.getCompsEnvironmentItem()
|
|
Packit |
6f3914 |
return swdb_env
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def search_by_pattern(self, pattern):
|
|
Packit |
6f3914 |
return self.history.swdb.getCompsEnvironmentItemsByPattern(pattern)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get_group_environments(self, group_id):
|
|
Packit |
6f3914 |
return self.history.swdb.getCompsGroupEnvironments(group_id)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def is_removable_group(self, group_id):
|
|
Packit |
6f3914 |
# for environment removal
|
|
Packit |
6f3914 |
swdb_group = self.history.group.get(group_id)
|
|
Packit |
6f3914 |
if not swdb_group:
|
|
Packit |
6f3914 |
return False
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# TODO: implement lastTransId == -2 in libdnf
|
|
Packit |
6f3914 |
group_environments = set(self.get_group_environments(group_id))
|
|
Packit |
6f3914 |
for env_id, env in self._removed.items():
|
|
Packit |
6f3914 |
for group in env.getGroups():
|
|
Packit |
6f3914 |
if group.getGroupId() != group_id:
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
if not group.getInstalled():
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
group_environments.remove(env_id)
|
|
Packit |
6f3914 |
for env_id, env in self._installed.items():
|
|
Packit |
6f3914 |
for group in env.getGroups():
|
|
Packit |
6f3914 |
if group.getGroupId() != group_id:
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
if not group.getInstalled():
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
group_environments.add(env_id)
|
|
Packit |
6f3914 |
if group_environments:
|
|
Packit |
6f3914 |
return False
|
|
Packit |
6f3914 |
return True
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class RPMTransaction(object):
|
|
Packit |
6f3914 |
def __init__(self, history, transaction=None):
|
|
Packit |
6f3914 |
self.history = history
|
|
Packit |
6f3914 |
self.transaction = transaction
|
|
Packit |
6f3914 |
if not self.transaction:
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
self.history.swdb.initTransaction()
|
|
Packit |
6f3914 |
except:
|
|
Packit |
6f3914 |
pass
|
|
Packit |
6f3914 |
self._swdb_ti_pkg = {}
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# TODO: close trans if needed
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __iter__(self):
|
|
Packit |
6f3914 |
# :api
|
|
Packit |
6f3914 |
if self.transaction:
|
|
Packit |
6f3914 |
items = self.transaction.getItems()
|
|
Packit |
6f3914 |
else:
|
|
Packit |
6f3914 |
items = self.history.swdb.getItems()
|
|
Packit |
6f3914 |
items = [dnf.db.history.RPMTransactionItemWrapper(self.history, i) for i in items if i.getRPMItem()]
|
|
Packit |
6f3914 |
return iter(items)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __len__(self):
|
|
Packit |
6f3914 |
if self.transaction:
|
|
Packit |
6f3914 |
items = self.transaction.getItems()
|
|
Packit |
6f3914 |
else:
|
|
Packit |
6f3914 |
items = self.history.swdb.getItems()
|
|
Packit |
6f3914 |
items = [dnf.db.history.RPMTransactionItemWrapper(self.history, i) for i in items if i.getRPMItem()]
|
|
Packit |
6f3914 |
return len(items)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _pkg_to_swdb_rpm_item(self, pkg):
|
|
Packit |
6f3914 |
rpm_item = self.history.swdb.createRPMItem()
|
|
Packit |
6f3914 |
rpm_item.setName(pkg.name)
|
|
Packit |
6f3914 |
rpm_item.setEpoch(pkg.epoch or 0)
|
|
Packit |
6f3914 |
rpm_item.setVersion(pkg.version)
|
|
Packit |
6f3914 |
rpm_item.setRelease(pkg.release)
|
|
Packit |
6f3914 |
rpm_item.setArch(pkg.arch)
|
|
Packit |
6f3914 |
return rpm_item
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def new(self, pkg, action, reason=None, replaced_by=None):
|
|
Packit |
6f3914 |
rpm_item = self._pkg_to_swdb_rpm_item(pkg)
|
|
Packit |
6f3914 |
repoid = self.get_repoid(pkg)
|
|
Packit |
6f3914 |
if reason is None:
|
|
Packit |
6f3914 |
reason = self.get_reason(pkg)
|
|
Packit |
6f3914 |
result = self.history.swdb.addItem(rpm_item, repoid, action, reason)
|
|
Packit |
6f3914 |
if replaced_by:
|
|
Packit |
6f3914 |
result.addReplacedBy(replaced_by)
|
|
Packit |
6f3914 |
self._swdb_ti_pkg[result] = pkg
|
|
Packit |
6f3914 |
return result
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get_repoid(self, pkg):
|
|
Packit |
6f3914 |
result = getattr(pkg, "_force_swdb_repoid", None)
|
|
Packit |
6f3914 |
if result:
|
|
Packit |
6f3914 |
return result
|
|
Packit |
6f3914 |
return pkg.reponame
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get_reason(self, pkg):
|
|
Packit |
6f3914 |
"""Get reason for package"""
|
|
Packit |
6f3914 |
return self.history.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get_reason_name(self, pkg):
|
|
Packit |
6f3914 |
"""Get reason for package"""
|
|
Packit |
6f3914 |
return libdnf.transaction.TransactionItemReasonToString(self.get_reason(pkg))
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _add_obsoleted(self, obsoleted, replaced_by=None):
|
|
Packit |
6f3914 |
obsoleted = obsoleted or []
|
|
Packit |
6f3914 |
for obs in obsoleted:
|
|
Packit |
6f3914 |
ti = self.new(obs, libdnf.transaction.TransactionItemAction_OBSOLETED)
|
|
Packit |
6f3914 |
if replaced_by:
|
|
Packit |
6f3914 |
ti.addReplacedBy(replaced_by)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def add_downgrade(self, new, old, obsoleted=None):
|
|
Packit |
6f3914 |
ti_new = self.new(new, libdnf.transaction.TransactionItemAction_DOWNGRADE)
|
|
Packit |
6f3914 |
ti_old = self.new(old, libdnf.transaction.TransactionItemAction_DOWNGRADED, replaced_by=ti_new)
|
|
Packit |
6f3914 |
self._add_obsoleted(obsoleted, replaced_by=ti_new)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def add_erase(self, old, reason=None):
|
|
Packit |
6f3914 |
self.add_remove(old, reason)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def add_install(self, new, obsoleted=None, reason=None):
|
|
Packit |
6f3914 |
reason = reason or libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
ti_new = self.new(new, libdnf.transaction.TransactionItemAction_INSTALL, reason)
|
|
Packit |
6f3914 |
self._add_obsoleted(obsoleted, replaced_by=ti_new)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def add_reinstall(self, new, old, obsoleted=None):
|
|
Packit |
6f3914 |
ti_new = self.new(new, libdnf.transaction.TransactionItemAction_REINSTALL)
|
|
Packit |
6f3914 |
ti_old = self.new(old, libdnf.transaction.TransactionItemAction_REINSTALLED, replaced_by=ti_new)
|
|
Packit |
6f3914 |
self._add_obsoleted(obsoleted, replaced_by=ti_new)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def add_remove(self, old, reason=None):
|
|
Packit |
6f3914 |
reason = reason or libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
ti_old = self.new(old, libdnf.transaction.TransactionItemAction_REMOVE, reason)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def add_upgrade(self, new, old, obsoleted=None):
|
|
Packit |
6f3914 |
ti_new = self.new(new, libdnf.transaction.TransactionItemAction_UPGRADE)
|
|
Packit |
6f3914 |
ti_old = self.new(old, libdnf.transaction.TransactionItemAction_UPGRADED, replaced_by=ti_new)
|
|
Packit |
6f3914 |
self._add_obsoleted(obsoleted, replaced_by=ti_new)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _test_fail_safe(self, hdr, pkg):
|
|
Packit |
6f3914 |
if pkg._from_cmdline:
|
|
Packit |
6f3914 |
return 0
|
|
Packit |
6f3914 |
if pkg.repo.module_hotfixes:
|
|
Packit |
6f3914 |
return 0
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
if hdr['modularitylabel'] and not pkg._is_in_active_module():
|
|
Packit |
6f3914 |
logger.critical(_("No available modular metadata for modular package '{}', "
|
|
Packit |
6f3914 |
"it cannot be installed on the system").format(pkg))
|
|
Packit |
6f3914 |
return 1
|
|
Packit |
6f3914 |
except ValueError:
|
|
Packit |
6f3914 |
return 0
|
|
Packit |
6f3914 |
return 0
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _populate_rpm_ts(self, ts):
|
|
Packit |
6f3914 |
"""Populate the RPM transaction set."""
|
|
Packit |
6f3914 |
modular_problems = 0
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
for tsi in self:
|
|
Packit |
6f3914 |
if tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADE:
|
|
Packit |
6f3914 |
hdr = tsi.pkg._header
|
|
Packit |
6f3914 |
modular_problems += self._test_fail_safe(hdr, tsi.pkg)
|
|
Packit |
6f3914 |
ts.addInstall(hdr, tsi, 'u')
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADED:
|
|
Packit |
6f3914 |
ts.addErase(tsi.pkg.idx)
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_INSTALL:
|
|
Packit |
6f3914 |
hdr = tsi.pkg._header
|
|
Packit |
6f3914 |
modular_problems += self._test_fail_safe(hdr, tsi.pkg)
|
|
Packit |
6f3914 |
ts.addInstall(hdr, tsi, 'i')
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_OBSOLETE:
|
|
Packit |
6f3914 |
hdr = tsi.pkg._header
|
|
Packit |
6f3914 |
modular_problems += self._test_fail_safe(hdr, tsi.pkg)
|
|
Packit |
6f3914 |
ts.addInstall(hdr, tsi, 'u')
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_OBSOLETED:
|
|
Packit |
6f3914 |
ts.addErase(tsi.pkg.idx)
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALL:
|
|
Packit |
6f3914 |
# note: in rpm 4.12 there should not be set
|
|
Packit |
6f3914 |
# rpm.RPMPROB_FILTER_REPLACEPKG to work
|
|
Packit |
6f3914 |
hdr = tsi.pkg._header
|
|
Packit |
6f3914 |
modular_problems += self._test_fail_safe(hdr, tsi.pkg)
|
|
Packit |
6f3914 |
ts.addReinstall(hdr, tsi)
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALLED:
|
|
Packit |
6f3914 |
# Required when multiple packages with the same NEVRA marked as installed
|
|
Packit |
6f3914 |
ts.addErase(tsi.pkg.idx)
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_REMOVE:
|
|
Packit |
6f3914 |
ts.addErase(tsi.pkg.idx)
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADE:
|
|
Packit |
6f3914 |
hdr = tsi.pkg._header
|
|
Packit |
6f3914 |
modular_problems += self._test_fail_safe(hdr, tsi.pkg)
|
|
Packit |
6f3914 |
ts.addInstall(hdr, tsi, 'u')
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADED:
|
|
Packit |
6f3914 |
ts.addErase(tsi.pkg.idx)
|
|
Packit |
6f3914 |
elif tsi.action == libdnf.transaction.TransactionItemAction_REASON_CHANGE:
|
|
Packit |
6f3914 |
pass
|
|
Packit |
6f3914 |
else:
|
|
Packit |
6f3914 |
raise RuntimeError("TransactionItemAction not handled: %s" % tsi.action)
|
|
Packit |
6f3914 |
if modular_problems:
|
|
Packit |
6f3914 |
raise dnf.exceptions.Error(_("No available modular metadata for modular package"))
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
return ts
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def install_set(self):
|
|
Packit |
6f3914 |
# :api
|
|
Packit |
6f3914 |
result = set()
|
|
Packit |
6f3914 |
for tsi in self:
|
|
Packit |
6f3914 |
if tsi.action in dnf.transaction.FORWARD_ACTIONS:
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
result.add(tsi.pkg)
|
|
Packit |
6f3914 |
except KeyError:
|
|
Packit |
6f3914 |
raise RuntimeError("TransactionItem is has no RPM attached: %s" % tsi)
|
|
Packit |
6f3914 |
return result
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def remove_set(self):
|
|
Packit |
6f3914 |
# :api
|
|
Packit |
6f3914 |
result = set()
|
|
Packit |
6f3914 |
for tsi in self:
|
|
Packit |
6f3914 |
if tsi.action in dnf.transaction.BACKWARD_ACTIONS + [libdnf.transaction.TransactionItemAction_REINSTALLED]:
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
result.add(tsi.pkg)
|
|
Packit |
6f3914 |
except KeyError:
|
|
Packit |
6f3914 |
raise RuntimeError("TransactionItem is has no RPM attached: %s" % tsi)
|
|
Packit |
6f3914 |
return result
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _rpm_limitations(self):
|
|
Packit |
6f3914 |
""" Ensures all the members can be passed to rpm as they are to perform
|
|
Packit |
6f3914 |
the transaction.
|
|
Packit |
6f3914 |
"""
|
|
Packit |
6f3914 |
src_installs = [pkg for pkg in self.install_set if pkg.arch == 'src']
|
|
Packit |
6f3914 |
if len(src_installs):
|
|
Packit |
6f3914 |
return _("Will not install a source rpm package (%s).") % \
|
|
Packit |
6f3914 |
src_installs[0]
|
|
Packit |
6f3914 |
return None
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def _get_items(self, action):
|
|
Packit |
6f3914 |
return [tsi for tsi in self if tsi.action == action]
|