diff options
author | chrisjbillington | 2021-06-26 16:52:34 +1000 |
---|---|---|
committer | chrisjbillington | 2021-06-26 16:52:34 +1000 |
commit | 329c1a498266aa4b9a08ed6c72377af160db578a (patch) | |
tree | e33db7b8b2a657c5f0219370fdea0c6916f71fea | |
parent | 974d80ea5a070c1c961d7faaaa0dc7fe8072c621 (diff) | |
download | aur-329c1a498266aa4b9a08ed6c72377af160db578a.tar.gz |
Fix bug where kernel packages would be retained
due to another package having a dependency on an abstract `provides`
from a kernel, rather than a dependency on the kernel package itself.
-rw-r--r-- | .SRCINFO | 3 | ||||
-rw-r--r-- | PKGBUILD | 6 | ||||
-rwxr-xr-x | remove-orphaned-kernels | 29 |
3 files changed, 32 insertions, 6 deletions
@@ -1,6 +1,6 @@ pkgbase = remove-orphaned-kernels pkgdesc = pacman -Rs orphaned kernel and driver packages, excluding currently-running. - pkgver = 1.0 + pkgver = 1.1 pkgrel = 1 url = https://aur.archlinux.org/packages/remove-orphaned-kernels/ arch = any @@ -11,4 +11,3 @@ pkgbase = remove-orphaned-kernels sha256sums = a6939f973aa8013944354db38d4b42e0bcf69673fbabbc804af9842d27101649 pkgname = remove-orphaned-kernels - @@ -1,6 +1,6 @@ # Maintainer: Chris Billington <chrisjbillington@gmail.com> pkgname=remove-orphaned-kernels -pkgver=1.0 +pkgver=1.1 pkgrel=1 pkgdesc="pacman -Rs orphaned kernel and driver packages, excluding currently-running." arch=('any') @@ -8,9 +8,9 @@ url="https://aur.archlinux.org/packages/${pkgname}/" license=('GPL') depends=('python' 'sudo') source=("${pkgname}") -sha256sums=('a6939f973aa8013944354db38d4b42e0bcf69673fbabbc804af9842d27101649') +sha256sums=('53e18eb9ba1def9400210467380175ce019af3f7ca35fbd085b27e17fe5cbf8d') package() { install -m755 -d "${pkgdir}/usr/bin/" install -m755 "${srcdir}/${pkgname}" "${pkgdir}/usr/bin/${pkgname}" -}
\ No newline at end of file +} diff --git a/remove-orphaned-kernels b/remove-orphaned-kernels index 9e257f2cba38..15e861ea78d3 100755 --- a/remove-orphaned-kernels +++ b/remove-orphaned-kernels @@ -20,11 +20,38 @@ def yn_choice(message, default='y'): sys.exit(1) +def getdeps(pkg): + pkginfo = get_output('pacman', '-Qi', pkg) + deps = pkginfo.split('Depends On')[1].split(':')[1].rsplit('\n', 1)[0].split() + if 'None' in deps: + deps.remove('None') + return deps + + +def getrdeps(pkg): + pkginfo = get_output('pacman', '-Qi', pkg) + rdeps = pkginfo.split('Required By')[1].split(':')[1].rsplit('\n', 1)[0].split() + if 'None' in rdeps: + rdeps.remove('None') + return rdeps + + +def is_directly_required(pkg): + # Check if package is required by other packages directly - not including a + # requirement on an abstract "provides" that the packages provides. For example, if + # a packages depends on WIREGUARD_MODULE, which is provided by all kernel packages, + # we don't want that to count. + for rdep in getrdeps(pkg): + if pkg in getdeps(rdep): + return True + return False + + running_kernel = get_output('uname', '-r') running_pkgs = get_output('pacman', '-Qoq', f'{MODULES}/{running_kernel}') all_kernels = [f'{MODULES}/{k}' for k in os.listdir(MODULES)] all_pkgs = get_output('pacman', '-Qoq', *all_kernels).split() -orphaned_packages = get_output('pacman', '-Qdtq', *all_pkgs).split() +orphaned_packages = [pkg for pkg in all_pkgs if not is_directly_required(pkg)] non_orphaned = [] orphaned_not_running = [] |