Blame dnf/db/history.py

Packit 6f3914
# -*- coding: utf-8 -*-
Packit 6f3914
Packit 6f3914
# Copyright (C) 2009, 2012-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
import calendar
Packit 6f3914
import os
Packit 6f3914
import time
Packit 6f3914
Packit 6f3914
import libdnf.transaction
Packit 6f3914
import libdnf.utils
Packit 6f3914
Packit 6f3914
from dnf.i18n import ucd
Packit 6f3914
from dnf.yum import misc
Packit 6f3914
Packit 6f3914
from .group import GroupPersistor, EnvironmentPersistor, RPMTransaction
Packit 6f3914
Packit 6f3914
Packit 6f3914
class RPMTransactionItemWrapper(object):
Packit 6f3914
    def __init__(self, swdb, item):
Packit 6f3914
        assert item is not None
Packit 6f3914
        self._swdb = swdb
Packit 6f3914
        self._item = item
Packit 6f3914
Packit 6f3914
    def __str__(self):
Packit 6f3914
        return self._item.getItem().toStr()
Packit 6f3914
Packit 6f3914
    def __lt__(self, other):
Packit 6f3914
        return self._item < other._item
Packit 6f3914
Packit 6f3914
    def __eq__(self, other):
Packit 6f3914
        return self._item == other._item
Packit 6f3914
Packit 6f3914
    def __hash__(self):
Packit 6f3914
        return self._item.__hash__()
Packit 6f3914
Packit 6f3914
    def match(self, pattern):
Packit 6f3914
        return True
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def name(self):
Packit 6f3914
        return self._item.getRPMItem().getName()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def epoch(self):
Packit 6f3914
        return self._item.getRPMItem().getEpoch()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def version(self):
Packit 6f3914
        return self._item.getRPMItem().getVersion()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def release(self):
Packit 6f3914
        return self._item.getRPMItem().getRelease()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def arch(self):
Packit 6f3914
        return self._item.getRPMItem().getArch()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def evr(self):
Packit 6f3914
        if self.epoch:
Packit 6f3914
            return "{}:{}-{}".format(self.epoch, self.version, self.release)
Packit 6f3914
        return "{}-{}".format(self.version, self.release)
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def action(self):
Packit 6f3914
        return self._item.getAction()
Packit 6f3914
Packit 6f3914
    @action.setter
Packit 6f3914
    def action(self, value):
Packit 6f3914
        self._item.setAction(value)
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def reason(self):
Packit 6f3914
        return self._item.getReason()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def action_name(self):
Packit 6f3914
        try:
Packit 6f3914
            return self._item.getActionName()
Packit 6f3914
        except AttributeError:
Packit 6f3914
            return ""
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def action_short(self):
Packit 6f3914
        try:
Packit 6f3914
            return self._item.getActionShort()
Packit 6f3914
        except AttributeError:
Packit 6f3914
            return ""
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def state(self):
Packit 6f3914
        return self._item.getState()
Packit 6f3914
Packit 6f3914
    @state.setter
Packit 6f3914
    def state(self, value):
Packit 6f3914
        self._item.setState(value)
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def from_repo(self):
Packit 6f3914
        return self._item.getRepoid()
Packit 6f3914
Packit 6f3914
    def ui_from_repo(self):
Packit 6f3914
        if not self._item.getRepoid():
Packit 6f3914
            return ""
Packit 6f3914
        return "@" + self._item.getRepoid()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def obsoleting(self):
Packit 6f3914
        return None
Packit 6f3914
Packit 6f3914
    def get_reason(self):
Packit 6f3914
        # TODO: get_history_reason
Packit 6f3914
        return self._swdb.rpm.get_reason(self)
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def pkg(self):
Packit 6f3914
        return self._swdb.rpm._swdb_ti_pkg[self._item]
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def files(self):
Packit 6f3914
        return self.pkg.files
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def _active(self):
Packit 6f3914
        return self.pkg
Packit 6f3914
Packit 6f3914
Packit 6f3914
class TransactionWrapper(object):
Packit 6f3914
Packit 6f3914
    altered_lt_rpmdb = False
Packit 6f3914
    altered_gt_rpmdb = False
Packit 6f3914
Packit 6f3914
    def __init__(self, trans):
Packit 6f3914
        self._trans = trans
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def tid(self):
Packit 6f3914
        return self._trans.getId()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def cmdline(self):
Packit 6f3914
        return self._trans.getCmdline()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def releasever(self):
Packit 6f3914
        return self._trans.getReleasever()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def beg_timestamp(self):
Packit 6f3914
        return self._trans.getDtBegin()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def end_timestamp(self):
Packit 6f3914
        return self._trans.getDtEnd()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def beg_rpmdb_version(self):
Packit 6f3914
        return self._trans.getRpmdbVersionBegin()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def end_rpmdb_version(self):
Packit 6f3914
        return self._trans.getRpmdbVersionEnd()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def return_code(self):
Packit 6f3914
        return int(self._trans.getState() != libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def loginuid(self):
Packit 6f3914
        return self._trans.getUserId()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def data(self):
Packit 6f3914
        return self.packages
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def is_output(self):
Packit 6f3914
        output = self._trans.getConsoleOutput()
Packit 6f3914
        return bool(output)
Packit 6f3914
Packit 6f3914
    def tids(self):
Packit 6f3914
        return [self._trans.getId()]
Packit 6f3914
Packit 6f3914
    def performed_with(self):
Packit 6f3914
        return []
Packit 6f3914
Packit 6f3914
    def packages(self):
Packit 6f3914
        result = self._trans.getItems()
Packit 6f3914
        return [RPMTransactionItemWrapper(self, i) for i in result]
Packit 6f3914
Packit 6f3914
    def output(self):
Packit 6f3914
        return [i[1] for i in self._trans.getConsoleOutput()]
Packit 6f3914
Packit 6f3914
    def error(self):
Packit 6f3914
        return []
Packit 6f3914
Packit 6f3914
    def compare_rpmdbv(self, rpmdbv):
Packit 6f3914
        self.altered_gt_rpmdb = self._trans.getRpmdbVersionEnd() != rpmdbv
Packit 6f3914
Packit 6f3914
Packit 6f3914
class MergedTransactionWrapper(TransactionWrapper):
Packit 6f3914
Packit 6f3914
    def __init__(self, trans):
Packit 6f3914
        self._trans = libdnf.transaction.MergedTransaction(trans._trans)
Packit 6f3914
Packit 6f3914
    def merge(self, trans):
Packit 6f3914
        self._trans.merge(trans._trans)
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def loginuid(self):
Packit 6f3914
        return self._trans.listUserIds()
Packit 6f3914
Packit 6f3914
    def tids(self):
Packit 6f3914
        return self._trans.listIds()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def return_code(self):
Packit 6f3914
        return [int(i != libdnf.transaction.TransactionItemState_DONE) for i in self._trans.listStates()]
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def cmdline(self):
Packit 6f3914
        return self._trans.listCmdlines()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def releasever(self):
Packit 6f3914
        return self._trans.listReleasevers()
Packit 6f3914
Packit 6f3914
    def output(self):
Packit 6f3914
        return [i[1] for i in self._trans.getConsoleOutput()]
Packit 6f3914
Packit 6f3914
class SwdbInterface(object):
Packit 6f3914
Packit 6f3914
    def __init__(self, db_dir, releasever=""):
Packit 6f3914
        # TODO: record all vars
Packit 6f3914
        # TODO: remove relreasever from options
Packit 6f3914
        self.releasever = str(releasever)
Packit 6f3914
        self._rpm = None
Packit 6f3914
        self._group = None
Packit 6f3914
        self._env = None
Packit 6f3914
        self._addon_data = None
Packit 6f3914
        self._swdb = None
Packit 6f3914
        self._db_dir = db_dir
Packit 6f3914
        self._output = []
Packit 6f3914
Packit 6f3914
    def __del__(self):
Packit 6f3914
        self.close()
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def rpm(self):
Packit 6f3914
        if self._rpm is None:
Packit 6f3914
            self._rpm = RPMTransaction(self)
Packit 6f3914
        return self._rpm
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def group(self):
Packit 6f3914
        if self._group is None:
Packit 6f3914
            self._group = GroupPersistor(self)
Packit 6f3914
        return self._group
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def env(self):
Packit 6f3914
        if self._env is None:
Packit 6f3914
            self._env = EnvironmentPersistor(self)
Packit 6f3914
        return self._env
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def dbpath(self):
Packit 6f3914
        return os.path.join(self._db_dir, libdnf.transaction.Swdb.defaultDatabaseName)
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def swdb(self):
Packit 6f3914
        """ Lazy initialize Swdb object """
Packit 6f3914
        if not self._swdb:
Packit 6f3914
            # _db_dir == persistdir which is prepended with installroot already
Packit 6f3914
            self._swdb = libdnf.transaction.Swdb(self.dbpath)
Packit 6f3914
            self._swdb.initTransaction()
Packit 6f3914
            # TODO: vars -> libdnf
Packit 6f3914
        return self._swdb
Packit 6f3914
Packit 6f3914
    def transform(self, input_dir):
Packit 6f3914
        transformer = libdnf.transaction.Transformer(input_dir, self.dbpath)
Packit 6f3914
        transformer.transform()
Packit 6f3914
Packit 6f3914
    def close(self):
Packit 6f3914
        try:
Packit 6f3914
            del self._tid
Packit 6f3914
        except AttributeError:
Packit 6f3914
            pass
Packit 6f3914
        self.swdb.closeTransaction()
Packit 6f3914
        self._rpm = None
Packit 6f3914
        self._group = None
Packit 6f3914
        self._env = None
Packit 6f3914
        if self._swdb:
Packit 6f3914
            self._swdb.closeDatabase()
Packit 6f3914
        self._swdb = None
Packit 6f3914
        self._output = []
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def path(self):
Packit 6f3914
        return self.swdb.getPath()
Packit 6f3914
Packit 6f3914
    def reset_db(self):
Packit 6f3914
        return self.swdb.resetDatabase()
Packit 6f3914
Packit 6f3914
    # TODO: rename to get_last_transaction?
Packit 6f3914
    def last(self, complete_transactions_only=True):
Packit 6f3914
        # TODO: complete_transactions_only
Packit 6f3914
        t = self.swdb.getLastTransaction()
Packit 6f3914
        if not t:
Packit 6f3914
            return None
Packit 6f3914
        return TransactionWrapper(t)
Packit 6f3914
Packit 6f3914
    # TODO: rename to: list_transactions?
Packit 6f3914
    def old(self, tids=None, limit=0, complete_transactions_only=False):
Packit 6f3914
        tids = tids or []
Packit 6f3914
        tids = [int(i) for i in tids]
Packit 6f3914
        result = self.swdb.listTransactions()
Packit 6f3914
        result = [TransactionWrapper(i) for i in result]
Packit 6f3914
        # TODO: move to libdnf
Packit 6f3914
        if tids:
Packit 6f3914
            result = [i for i in result if i.tid in tids]
Packit 6f3914
Packit 6f3914
        # populate altered_lt_rpmdb and altered_gt_rpmdb
Packit 6f3914
        for i, trans in enumerate(result):
Packit 6f3914
            if i == 0:
Packit 6f3914
                continue
Packit 6f3914
            prev_trans = result[i-1]
Packit 6f3914
            if trans._trans.getRpmdbVersionBegin() != prev_trans._trans.getRpmdbVersionEnd():
Packit 6f3914
                trans.altered_lt_rpmdb = True
Packit 6f3914
                prev_trans.altered_gt_rpmdb = True
Packit 6f3914
        return result[::-1]
Packit 6f3914
Packit 6f3914
    def set_reason(self, pkg, reason):
Packit 6f3914
        """Set reason for package"""
Packit 6f3914
        rpm_item = self.rpm._pkg_to_swdb_rpm_item(pkg)
Packit 6f3914
        repoid = self.repo(pkg)
Packit 6f3914
        action = libdnf.transaction.TransactionItemAction_REASON_CHANGE
Packit 6f3914
        reason = reason
Packit 6f3914
        replaced_by = None
Packit 6f3914
        ti = self.swdb.addItem(rpm_item, repoid, action, reason)
Packit 6f3914
        ti.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
        return ti
Packit 6f3914
Packit 6f3914
    '''
Packit 6f3914
    def package(self, pkg):
Packit 6f3914
        """Get SwdbPackage from package"""
Packit 6f3914
        return self.swdb.package(str(pkg))
Packit 6f3914
    '''
Packit 6f3914
Packit 6f3914
    def repo(self, pkg):
Packit 6f3914
        """Get repository of package"""
Packit 6f3914
        return self.swdb.getRPMRepo(str(pkg))
Packit 6f3914
Packit 6f3914
    def package_data(self, pkg):
Packit 6f3914
        """Get package data for package"""
Packit 6f3914
        # trans item is returned
Packit 6f3914
        result = self.swdb.getRPMTransactionItem(str(pkg))
Packit 6f3914
        if result is None:
Packit 6f3914
            return result
Packit 6f3914
        result = RPMTransactionItemWrapper(self, result)
Packit 6f3914
        return result
Packit 6f3914
Packit 6f3914
#    def reason(self, pkg):
Packit 6f3914
#        """Get reason for package"""
Packit 6f3914
#        result = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
Packit 6f3914
#        return result
Packit 6f3914
Packit 6f3914
    # TODO: rename to begin_transaction?
Packit 6f3914
    def beg(self, rpmdb_version, using_pkgs, tsis, cmdline=None):
Packit 6f3914
        try:
Packit 6f3914
            self.swdb.initTransaction()
Packit 6f3914
        except:
Packit 6f3914
            pass
Packit 6f3914
Packit 6f3914
        '''
Packit 6f3914
        for pkg in using_pkgs:
Packit 6f3914
            pid = self.pkg2pid(pkg)
Packit 6f3914
            self.swdb.trans_with(tid, pid)
Packit 6f3914
        '''
Packit 6f3914
Packit 6f3914
        # add RPMs to the transaction
Packit 6f3914
        # TODO: _populate_rpm_ts() ?
Packit 6f3914
Packit 6f3914
        if self.group:
Packit 6f3914
            for group_id, group_item in sorted(self.group._installed.items()):
Packit 6f3914
                repoid = ""
Packit 6f3914
                action = libdnf.transaction.TransactionItemAction_INSTALL
Packit 6f3914
                reason = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
                replaced_by = None
Packit 6f3914
                ti = self.swdb.addItem(group_item, repoid, action, reason)
Packit 6f3914
                ti.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
Packit 6f3914
            for group_id, group_item in sorted(self.group._upgraded.items()):
Packit 6f3914
                repoid = ""
Packit 6f3914
                action = libdnf.transaction.TransactionItemAction_UPGRADE
Packit 6f3914
                reason = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
                replaced_by = None
Packit 6f3914
                ti = self.swdb.addItem(group_item, repoid, action, reason)
Packit 6f3914
                ti.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
Packit 6f3914
            for group_id, group_item in sorted(self.group._removed.items()):
Packit 6f3914
                repoid = ""
Packit 6f3914
                action = libdnf.transaction.TransactionItemAction_REMOVE
Packit 6f3914
                reason = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
                replaced_by = None
Packit 6f3914
                ti = self.swdb.addItem(group_item, repoid, action, reason)
Packit 6f3914
                ti.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
Packit 6f3914
        if self.env:
Packit 6f3914
            for env_id, env_item in sorted(self.env._installed.items()):
Packit 6f3914
                repoid = ""
Packit 6f3914
                action = libdnf.transaction.TransactionItemAction_INSTALL
Packit 6f3914
                reason = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
                replaced_by = None
Packit 6f3914
                ti = self.swdb.addItem(env_item, repoid, action, reason)
Packit 6f3914
                ti.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
Packit 6f3914
            for env_id, env_item in sorted(self.env._upgraded.items()):
Packit 6f3914
                repoid = ""
Packit 6f3914
                action = libdnf.transaction.TransactionItemAction_UPGRADE
Packit 6f3914
                reason = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
                replaced_by = None
Packit 6f3914
                ti = self.swdb.addItem(env_item, repoid, action, reason)
Packit 6f3914
                ti.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
Packit 6f3914
            for env_id, env_item in sorted(self.env._removed.items()):
Packit 6f3914
                repoid = ""
Packit 6f3914
                action = libdnf.transaction.TransactionItemAction_REMOVE
Packit 6f3914
                reason = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
                replaced_by = None
Packit 6f3914
                ti = self.swdb.addItem(env_item, repoid, action, reason)
Packit 6f3914
                ti.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
Packit 6f3914
Packit 6f3914
        # save when everything is in memory
Packit 6f3914
        tid = self.swdb.beginTransaction(
Packit 6f3914
            int(calendar.timegm(time.gmtime())),
Packit 6f3914
            str(rpmdb_version),
Packit 6f3914
            cmdline or "",
Packit 6f3914
            int(misc.getloginuid())
Packit 6f3914
            )
Packit 6f3914
        self.swdb.setReleasever(self.releasever)
Packit 6f3914
        self._tid = tid
Packit 6f3914
Packit 6f3914
        return tid
Packit 6f3914
Packit 6f3914
    def pkg_to_swdb_rpm_item(self, po):
Packit 6f3914
        rpm_item = self.swdb.createRPMItem()
Packit 6f3914
        rpm_item.setName(po.name)
Packit 6f3914
        rpm_item.setEpoch(po.epoch or 0)
Packit 6f3914
        rpm_item.setVersion(po.version)
Packit 6f3914
        rpm_item.setRelease(po.release)
Packit 6f3914
        rpm_item.setArch(po.arch)
Packit 6f3914
        return rpm_item
Packit 6f3914
Packit 6f3914
    def log_scriptlet_output(self, msg):
Packit 6f3914
        if not hasattr(self, '_tid'):
Packit 6f3914
            return
Packit 6f3914
        if not msg:
Packit 6f3914
            return
Packit 6f3914
        for line in msg.splitlines():
Packit 6f3914
            line = ucd(line)
Packit 6f3914
            # logging directly to database fails if transaction runs in a background process
Packit 6f3914
            self._output.append((1, line))
Packit 6f3914
Packit 6f3914
    '''
Packit 6f3914
    def _log_errors(self, errors):
Packit 6f3914
        for error in errors:
Packit 6f3914
            error = ucd(error)
Packit 6f3914
            self.swdb.log_error(self._tid, error)
Packit 6f3914
    '''
Packit 6f3914
Packit 6f3914
    def end(self, end_rpmdb_version="", return_code=None, errors=None):
Packit 6f3914
        if not hasattr(self, '_tid'):
Packit 6f3914
            return  # Failed at beg() time
Packit 6f3914
Packit 6f3914
        if return_code is None:
Packit 6f3914
            # return_code/state auto-detection
Packit 6f3914
            return_code = libdnf.transaction.TransactionState_DONE
Packit 6f3914
            for tsi in self.rpm:
Packit 6f3914
                if tsi.state == libdnf.transaction.TransactionItemState_ERROR:
Packit 6f3914
                    return_code = libdnf.transaction.TransactionState_ERROR
Packit 6f3914
                    break
Packit 6f3914
Packit 6f3914
        for file_descriptor, line in self._output:
Packit 6f3914
            self.swdb.addConsoleOutputLine(file_descriptor, line)
Packit 6f3914
        self._output = []
Packit 6f3914
Packit 6f3914
        self.swdb.endTransaction(
Packit 6f3914
            int(time.time()),
Packit 6f3914
            str(end_rpmdb_version),
Packit 6f3914
            return_code,
Packit 6f3914
        )
Packit 6f3914
Packit 6f3914
        # Closing and cleanup is done in the close() method.
Packit 6f3914
        # It is important to keep data around after the transaction ends
Packit 6f3914
        # because it's needed by plugins to report installed packages etc.
Packit 6f3914
Packit 6f3914
    # TODO: ignore_case, more patterns
Packit 6f3914
    def search(self, patterns, ignore_case=True):
Packit 6f3914
        """ Search for history transactions which contain specified
Packit 6f3914
            packages al. la. "yum list". Returns transaction ids. """
Packit 6f3914
        return self.swdb.searchTransactionsByRPM(patterns)
Packit 6f3914
Packit 6f3914
    def user_installed(self, pkg):
Packit 6f3914
        """Returns True if package is user installed"""
Packit 6f3914
        reason = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
Packit 6f3914
        if reason == libdnf.transaction.TransactionItemReason_USER:
Packit 6f3914
            return True
Packit 6f3914
        # if reason is not known, consider a package user-installed
Packit 6f3914
        # because it was most likely installed via rpm
Packit 6f3914
        if reason == libdnf.transaction.TransactionItemReason_UNKNOWN:
Packit 6f3914
            return True
Packit 6f3914
        return False
Packit 6f3914
Packit 6f3914
    def get_erased_reason(self, pkg, first_trans, rollback):
Packit 6f3914
        """Get reason of package before transaction being undone. If package
Packit 6f3914
        is already installed in the system, keep his reason.
Packit 6f3914
Packit 6f3914
        :param pkg: package being installed
Packit 6f3914
        :param first_trans: id of first transaction being undone
Packit 6f3914
        :param rollback: True if transaction is performing a rollback"""
Packit 6f3914
        if rollback:
Packit 6f3914
            # return the reason at the point of rollback; we're setting that reason
Packit 6f3914
            result = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, first_trans)
Packit 6f3914
        else:
Packit 6f3914
            result = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
Packit 6f3914
Packit 6f3914
        # consider unknown reason as user-installed
Packit 6f3914
        if result == libdnf.transaction.TransactionItemReason_UNKNOWN:
Packit 6f3914
            result = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
        return result