dnf-search-installed: modernize, update for dnf5

This commit is contained in:
Martin Matous 2025-03-17 17:57:23 +01:00
parent 34e2ca053e
commit 85a34dc79a
Signed by: mmatous
GPG key ID: 8BED4CD352953224
2 changed files with 24 additions and 20 deletions

View file

@ -13,16 +13,16 @@ Dependencies: python, dnspython, Matrix account
Usage: Run as a daemon, `/usr/local/bin/availability-monitor.py <interval-sec>` Usage: Run as a daemon, `/usr/local/bin/availability-monitor.py <interval-sec>`
## dnf-search-install.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 Status: active use
Dependencies: dnf, python Dependencies: dnf5, python3
Setup: Setup:
```bash ```bash
sudo cp ./dnf-search-installed.py /usr/local/bin/. 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 <package>` Usage: `dnf search <package>`

View file

@ -1,47 +1,51 @@
#!/usr/bin/env python #!/usr/bin/env python3
import dnf
import subprocess
import os import os
import re import re
import subprocess
import sys 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 = dnf.Base()
base.fill_sack() base.fill_sack()
q = base.sack.query() q = base.sack.query()
return {f'{p.name}.{p.arch}' for p in q.installed()} 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' return f'\x1b[32m{s}\033[0m'
if sys.argv[1] != 'search': if sys.argv[1] != 'search':
os.execvp(DNF, sys.argv[1:]) os.execvp(DNF, sys.argv[1:])
sys.exit(0) sys.exit(0)
# call CLI to get all the formatting and highlighting for free # call CLI to get all the formatting and highlighting for free
res = subprocess.run( 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, capture_output=True,
encoding='utf-8', encoding='utf-8',
check=False,
) )
lines = res.stdout.split('\n') lines = res.stdout.split('\n')
installed = get_installed() installed = get_installed()
printlines = '' printlines = []
# matching bold, magenta and normal codes from # matching bold, magenta and normal codes from
# https://github.com/rpm-software-management/dnf/blob/master/dnf/cli/term.py # 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') 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: for line in lines:
if not line or line.startswith('='): if not line or not line.startswith(' '):
printlines += (line + '\n') printlines.append(line)
continue continue
(package, _) = line.split(':', maxsplit=1) (package, _) = line.split(':', maxsplit=1)
package = dnf_color.sub('', package.rstrip()) package = dnf_color.sub('', package.lstrip())
indicator = i if package in installed else ' ' indicator = i if package in installed else ' '
printlines += f'{indicator} {line}\n' printlines.append(f'{indicator} {line[1:]}') # [:1] to strip ' '
print(printlines, end='') print('\n'.join(printlines))