Hi!

seth vidal wrote:
Can you show me what you mean here in the code? I'm not sure I'm
following your description adequately.

We are talking about depsolve.py lines 1303-1307 and 1320-1321 and about code to replace these.

Whenever pkgs are removed requirements from other pkgs to the removed pkg can break. To find these _checkRemove() checks all provides of removed pkgs. As it is possible to set requirements to files it also checks every file of the removed pkg as if they where provides. This is very expensive as there are a lot of files.

To avoid checking every removed file we can also check every file requirement that will be in the system after the transaction is run.

I wrote it down in pseudo code. May be this makes things clearer:

def _checkFilerequirements(self):
    newPkgs = [txbr.po for txbr in self.tsInfoDelta
               if txmbr.output_state in TS_INSTALL_STATES]
    removedPkgs = set([txbr.po for txbr in self.tsInfoDelta
                       if txmbr.output_state in TS_REMOVE_STATES])
    for pkg in rpmdb.returnPackages() + newPkgs:
        if pkg in removedPkgs:
            continue
        for name, flag, version in pkg.prco[requires]:
            if not name.startswith('/'):
                continue
            if name in installed_unresoved_file_requirements:
                continue
            if not self._provideToPkg((name, flag, version)):
                yield (name, flag, version), pkg

run

installed_unresoved_file_requirements = set(_checkFilerequirements())

before adding any pkgs so we can ignore problems that are already in the rpmdb

_checkFilerequirements() should be called from _mytsCheck() and the result be added to the return value

Add some caching to speed things up.

Have fun

        Florian Festi
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to