-
-
Save tuxarch/4a87928945cc6a177e4ffeb051e92a38 to your computer and use it in GitHub Desktop.
Script to visualize the most-upgraded packages on a pacman based system
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python3 | |
| """ | |
| pacman-upgrades-graph.py: a script to visualize the most-upgraded packages on an pacman-based system. | |
| """ | |
| import argparse, os, re, shutil, subprocess, sys | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('-w', '--width', type=int, default=-1, | |
| help='Max total width of graph. Defaults to terminal size, ' + | |
| 'or no limit if stdout is not a terminal. 0 for no limit regardless') | |
| parser.add_argument('-n', '--limit', type=int, default=0, metavar='N', | |
| help='Show only the top N packages. 0 for no limit (default)') | |
| parser.add_argument('-i', '--installed', action='store_true', help='Limit results to currently installed packages') | |
| parser.add_argument('pacmanlog', nargs='*', default=['/var/log/pacman.log'], | |
| help='pacman.log files to parse, all will be combined. Default /var/log/pacman.log') | |
| args = parser.parse_args() | |
| width = shutil.get_terminal_size(fallback=(0,0)).columns if args.width == -1 else args.width | |
| installed = set(subprocess.check_output(['pacman', '-Qq'], universal_newlines=True).splitlines()) \ | |
| if args.installed else None | |
| d = {} # dict of pkgname -> upgrade count mappings | |
| for fn in args.pacmanlog: | |
| with open(fn, 'r') as fp: | |
| for line in fp: | |
| m = re.search(r'\[ALPM\] upgraded (\S+)', line) | |
| if m is None: | |
| continue | |
| pkg = m.group(1) | |
| if pkg in d: | |
| d[pkg] += 1 | |
| else: | |
| d[pkg] = 1 | |
| if not d: | |
| sys.exit('[no data found]') | |
| # sort packages by count, descending | |
| pkgs = sorted(d.keys(), key=lambda x: d[x], reverse=True) | |
| if installed: | |
| # filter on currently installed packages | |
| pkgs = [p for p in pkgs if p in installed] | |
| if args.limit: | |
| # limit to top N packages | |
| pkgs = pkgs[:args.limit] | |
| maxlen = max(len(p) for p in pkgs) # max pkgname length | |
| maxcount = max(d[p] for p in pkgs) # max upgrade count | |
| cwidth = 1 # number of digits we need for the max count | |
| while ((10 ** cwidth) - 1) < d[pkgs[0]]: | |
| cwidth += 1 | |
| labelwidth = maxlen + cwidth + 2 | |
| barwidth = (width - labelwidth) if width else 0 | |
| for pkg in pkgs: | |
| barsize = int((d[pkg] / d[pkgs[0]]) * barwidth) if barwidth else d[pkg] | |
| print('%*s %*d %s'%(maxlen, pkg, cwidth, d[pkg], '#'*barsize)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment