Added `PackageManager.get_installed`.

This commit is contained in:
Fabio Manganiello 2023-08-23 10:49:58 +02:00
parent b10ccdb313
commit 449821673c
Signed by: blacklight
GPG Key ID: D90FBA7F76362774
1 changed files with 38 additions and 0 deletions

View File

@ -7,10 +7,13 @@ import json
import logging import logging
import os import os
import pathlib import pathlib
import re
import shutil import shutil
import subprocess
import sys import sys
from typing import ( from typing import (
Callable,
Dict, Dict,
Generator, Generator,
List, List,
@ -65,6 +68,8 @@ class PackageManager:
""" The install command, as a sequence of strings. """ """ The install command, as a sequence of strings. """
uninstall: Iterable[str] = field(default_factory=tuple) uninstall: Iterable[str] = field(default_factory=tuple)
""" The uninstall command, as a sequence of strings. """ """ The uninstall command, as a sequence of strings. """
get_installed: Callable[[], Iterable[str]] = lambda: []
""" A function that returns the list of installed packages. """
class PackageManagers(Enum): class PackageManagers(Enum):
@ -77,6 +82,19 @@ class PackageManagers(Enum):
install=('apk', 'add', '--update', '--no-interactive', '--no-cache'), install=('apk', 'add', '--update', '--no-interactive', '--no-cache'),
uninstall=('apk', 'del', '--no-interactive'), uninstall=('apk', 'del', '--no-interactive'),
default_os='alpine', default_os='alpine',
get_installed=lambda: {
re.sub(r'.*\s*\{(.+?)\}\s*.*', r'\1', line)
for line in (
line.strip()
for line in subprocess.Popen( # pylint: disable=consider-using-with
['apk', 'list', '--installed'], stdout=subprocess.PIPE
)
.communicate()[0]
.decode()
.split('\n')
)
if line.strip()
},
) )
APT = PackageManager( APT = PackageManager(
@ -84,6 +102,16 @@ class PackageManagers(Enum):
install=('apt', 'install', '-y'), install=('apt', 'install', '-y'),
uninstall=('apt', 'remove', '-y'), uninstall=('apt', 'remove', '-y'),
default_os='debian', default_os='debian',
get_installed=lambda: {
line.strip().split('/')[0]
for line in subprocess.Popen( # pylint: disable=consider-using-with
['apt', 'list', '--installed'], stdout=subprocess.PIPE
)
.communicate()[0]
.decode()
.split('\n')
if line.strip()
},
) )
PACMAN = PackageManager( PACMAN = PackageManager(
@ -91,6 +119,16 @@ class PackageManagers(Enum):
install=('pacman', '-S', '--noconfirm', '--needed'), install=('pacman', '-S', '--noconfirm', '--needed'),
uninstall=('pacman', '-R', '--noconfirm'), uninstall=('pacman', '-R', '--noconfirm'),
default_os='arch', default_os='arch',
get_installed=lambda: {
line.strip().split(' ')[0]
for line in subprocess.Popen( # pylint: disable=consider-using-with
['pacman', '-Q'], stdout=subprocess.PIPE
)
.communicate()[0]
.decode()
.split('\n')
if line.strip()
},
) )
@classmethod @classmethod