Update depsolving with suggestions from dnf (#1636239)

The previous method worked, but wasn't exactly idiomatic. This is more
correct, and appears to work the same (templates depsolve, version globs
work, multiple repos work).

Note that this does use a private dnf attribute ._goal, but the word is
that this is going to become a public api soon, so yes it is there on
purpose.
This commit is contained in:
Brian C. Lane 2018-10-11 11:10:33 -07:00
parent faa65bca3c
commit 7e0a288f5b

View File

@ -207,23 +207,25 @@ def _depsolve(dbo, projects, groups):
install_errors.append(("Group %s" % (name), str(e))) install_errors.append(("Group %s" % (name), str(e)))
for name, version in projects: for name, version in projects:
try: # Find the best package matching the name + version glob
if not version: # dnf can return multiple packages if it is in more than 1 repository
version = "*" query = dbo.sack.query().filterm(provides__glob=name)
# Find the best package matching the name + version glob if version:
# dnf can return multiple packages if it is in more than 1 repository, so use max() to select one of them query.filterm(version__glob=version)
pkg = max([pkg for pkg in dnf.subject.Subject(name).get_best_query(dbo.sack).filter(version__glob=version, latest=True)] or [None])
if not pkg: query.filterm(latest=1)
install_errors.append(("%s-%s" % (name, version), "No match")) if not query:
continue install_errors.append(("%s-%s" % (name, version), "No match"))
dbo.package_install(pkg) continue
except dnf.exceptions.MarkingError as e: sltr = dnf.selector.Selector(dbo.sack).set(pkg=query)
install_errors.append(("%s-%s" % (name, version), str(e)))
# NOTE: dnf says in near future there will be a "goal" attribute of Base class
# so yes, we're using a 'private' attribute here on purpose and with permission.
dbo._goal.install(select=sltr, optional=False)
if install_errors: if install_errors:
raise ProjectsError("The following package(s) had problems: %s" % ",".join(["%s (%s)" % (pattern, err) for pattern, err in install_errors])) raise ProjectsError("The following package(s) had problems: %s" % ",".join(["%s (%s)" % (pattern, err) for pattern, err in install_errors]))
def projects_depsolve(dbo, projects, groups): def projects_depsolve(dbo, projects, groups):
"""Return the dependencies for a list of projects """Return the dependencies for a list of projects