diff options
-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 = [] |