diff options
Diffstat (limited to '.local')
| -rwxr-xr-x | .local/bin/zypper-wassup | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/.local/bin/zypper-wassup b/.local/bin/zypper-wassup index 100f0ea..37ebad0 100755 --- a/.local/bin/zypper-wassup +++ b/.local/bin/zypper-wassup @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from collections import defaultdict, namedtuple +from collections.abc import Iterable from enum import IntEnum import re from subprocess import run @@ -77,26 +78,38 @@ class Sgr(IntEnum): GREEN_FG = 32 -def colorize(text, *params): +def colorize(text: str, params: Iterable[Sgr]) -> str: prefix = '\N{ESCAPE}[' suffix = 'm' reset = f'{prefix}{Sgr.RESET}{suffix}' - param_list = ';'.join(map(format, params)) + param_list = ';'.join(map(str, params)) return f'{prefix}{param_list}{suffix}{text}{reset}' -def highlight_diff(old, new): +def highlight_diff_part(old: str, new: str, codes: Iterable[Sgr]=()) -> (str, str): for i, (o, n) in enumerate(zip(old, new)): if o != n: break + else: + # old == new, or new == old + suffix. + i += 1 - old = old[:i]+colorize(old[i:], Sgr.BOLD, Sgr.RED_FG) - new = new[:i]+colorize(new[i:], Sgr.BOLD, Sgr.GREEN_FG) + old = old[:i]+colorize(old[i:], (Sgr.RED_FG,)+tuple(codes)) + new = new[:i]+colorize(new[i:], (Sgr.GREEN_FG,)+tuple(codes)) return old, new +def highlight_diff(old: str, new: str) -> (str, str): + old_pkgv, old_distv = old.split("-", maxsplit=1) + new_pkgv, new_distv = new.split("-", maxsplit=1) + + old_pkgv, new_pkgv = highlight_diff_part(old_pkgv, new_pkgv, (Sgr.BOLD,)) + old_distv, new_distv = highlight_diff_part(old_distv, new_distv) + + return f"{old_pkgv}-{old_distv}", f"{new_pkgv}-{new_distv}" + def padding(string, width): # Python's str.format does not skip over control sequences when # computing how long a string is. Compute padding manually before @@ -112,7 +125,7 @@ def print_header(widths, name): name = name[:widths['package']-1]+'…' print(COLUMN.join(( - colorize(name, Sgr.BOLD)+padding(name, widths['package']), + colorize(name, (Sgr.BOLD,))+padding(name, widths['package']), ' '*widths['old'], ' '*widths['new'], ))) |
