diff --git a/README.md b/README.md index 95d2a18..40227cc 100644 --- a/README.md +++ b/README.md @@ -13,16 +13,16 @@ Dependencies: python, dnspython, Matrix account Usage: Run as a daemon, `/usr/local/bin/availability-monitor.py ` ## dnf-search-install.py -Wrapper, marks already installed packages for `dnf search`. Slow. +Wrapper, marks already installed packages for `dnf search`. Status: active use -Dependencies: dnf, python +Dependencies: dnf5, python3 Setup: ```bash sudo cp ./dnf-search-installed.py /usr/local/bin/. -alias -s dnf '/usr/local/bin/dnf-search-installed.py' +alias --save dnf '/usr/local/bin/dnf-search-installed.py' ``` Usage: `dnf search ` diff --git a/dnf-search-installed.py b/dnf-search-installed.py index 476e30f..031ddfa 100644 --- a/dnf-search-installed.py +++ b/dnf-search-installed.py @@ -1,47 +1,51 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 -import dnf -import subprocess import os import re +import subprocess import sys -from typing import Set +import dnf -DNF = 'dnf' +DNF = '/bin/dnf5' -def get_installed() -> Set[str]: + +def get_installed() -> set[str]: base = dnf.Base() base.fill_sack() q = base.sack.query() return {f'{p.name}.{p.arch}' for p in q.installed()} -def colorize_g_fg(s: str) -> str: + +def colorize_green_fg(s: str) -> str: return f'\x1b[32m{s}\033[0m' + if sys.argv[1] != 'search': os.execvp(DNF, sys.argv[1:]) sys.exit(0) # call CLI to get all the formatting and highlighting for free res = subprocess.run( - [DNF, '--color=always'] + sys.argv[1:], + # todo: add --color=always https://github.com/rpm-software-management/dnf5/issues/839 + [DNF, *sys.argv[1:]], capture_output=True, encoding='utf-8', - ) + check=False, +) lines = res.stdout.split('\n') installed = get_installed() -printlines = '' +printlines = [] # matching bold, magenta and normal codes from # https://github.com/rpm-software-management/dnf/blob/master/dnf/cli/term.py dnf_color = re.compile(r'\x1b\[35m|\x1b\[1m|\x1b\(B\x1b\[m') -i = colorize_g_fg('*') +i = colorize_green_fg('*') for line in lines: - if not line or line.startswith('='): - printlines += (line + '\n') + if not line or not line.startswith(' '): + printlines.append(line) continue - (package, _) = line.split(' : ', maxsplit=1) - package = dnf_color.sub('', package.rstrip()) + (package, _) = line.split(':', maxsplit=1) + package = dnf_color.sub('', package.lstrip()) indicator = i if package in installed else ' ' - printlines += f'{indicator} {line}\n' -print(printlines, end='') + printlines.append(f'{indicator} {line[1:]}') # [:1] to strip ' ' +print('\n'.join(printlines))