[kswitch] fix kernel-switcher behavior when kernels are in external repos.
See the code documentation for more info.
This commit is contained in:
@@ -29,7 +29,6 @@ import entropy.tools
|
||||
|
||||
KERNEL_BINARY_VIRTUAL = const_convert_to_unicode("virtual/linux-binary")
|
||||
KERNEL_BINARY_LTS_VIRTUAL = const_convert_to_unicode("virtual/linux-binary-lts")
|
||||
KERNEL_CATEGORY = const_convert_to_unicode("sys-kernel")
|
||||
KERNELS_DIR = const_convert_to_rawstring("/etc/kernels")
|
||||
RELEASE_LEVEL = const_convert_to_rawstring("RELEASE_LEVEL")
|
||||
|
||||
@@ -154,23 +153,33 @@ class KernelSwitcher(object):
|
||||
|
||||
def _get_kernels(self):
|
||||
"""
|
||||
Return a list of kernel package matches.
|
||||
Return a set of kernel package matches.
|
||||
"""
|
||||
# We may have virtual/ kernels in multiple repos, make sure
|
||||
# to pick them all up.
|
||||
kernel_virtual_pkgs, _rc = self._entropy.atom_match(
|
||||
KERNEL_BINARY_VIRTUAL,
|
||||
multi_match=True, multi_repo=True)
|
||||
|
||||
kernel_packages = []
|
||||
|
||||
# virtual/ kernels have a runtime dependency against a kernel
|
||||
# package provider. So, get the list of runtime deps from them.
|
||||
kernels = set()
|
||||
for pkg_id, repo_id in kernel_virtual_pkgs:
|
||||
repo = self._entropy.open_repository(repo_id)
|
||||
kernel_pkg_ids = repo.retrieveReverseDependencies(pkg_id)
|
||||
for kernel_pkg_id in kernel_pkg_ids:
|
||||
atom = repo.retrieveAtom(kernel_pkg_id)
|
||||
category = entropy.dep.dep_getcat(atom)
|
||||
if category == KERNEL_CATEGORY:
|
||||
kernel_packages.append((atom, kernel_pkg_id, repo_id))
|
||||
kernel_deps = repo.retrieveRuntimeDependencies(pkg_id)
|
||||
kernels.update(kernel_deps)
|
||||
|
||||
# Match the dependencies collected against all repositories,
|
||||
# or we won't be able to pick up binaries in all of them.
|
||||
kernel_packages = set()
|
||||
for kernel in kernels:
|
||||
kernel_pkgs, _rc = self._entropy.atom_match(
|
||||
kernel, multi_match=True, multi_repo=True)
|
||||
kernel_packages.update(kernel_pkgs)
|
||||
|
||||
# There is no safety check for random packages to be pulled in.
|
||||
# The assumption is that virtual packages are listing just kernel
|
||||
# binaries in their dependencies.
|
||||
return kernel_packages
|
||||
|
||||
def _get_target_tag(self, kernel_match):
|
||||
@@ -390,6 +399,6 @@ class KernelSwitcher(object):
|
||||
@rtype: list
|
||||
"""
|
||||
matches = self._get_kernels()
|
||||
key_sorter = lambda x: x[0]
|
||||
return [(pkg_id, repo_id) for _atom, pkg_id, repo_id
|
||||
in sorted(matches, key=key_sorter)]
|
||||
key_sorter = lambda x: self._entropy.open_repository(
|
||||
x[1]).retrieveAtom(x[0])
|
||||
return sorted(matches, key=key_sorter)
|
||||
|
||||
Reference in New Issue
Block a user