From ac5a7cd1cd6fca477d01a7040ae74dd5b018f511 Mon Sep 17 00:00:00 2001 From: lilydjwg Date: Sun, 12 Jan 2014 22:51:22 +0800 Subject: [PATCH] add scripts/remove_old_packages --- scripts/remove_old_packages | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 scripts/remove_old_packages diff --git a/scripts/remove_old_packages b/scripts/remove_old_packages new file mode 100755 index 0000000..924a9ad --- /dev/null +++ b/scripts/remove_old_packages @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 + +import argparse +import os +from collections import defaultdict + +import archpkg +from archpkg import parse_version + +class PkgNameInfo(archpkg.PkgNameInfo): + def __lt__(self, other): + # ignore arch mismatch + if self.name != other.name: + return NotImplemented + if self.version != other.version: + return parse_version(self.version) < parse_version(other.version) + return int(self.release) < int(other.release) + +def remove_pkg(path): + try: + os.unlink(path) + except FileNotFoundError: + pass + sig = path + '.sig' + try: + os.unlink(sig) + except FileNotFoundError: + pass + +def main(args): + pkgs = defaultdict(list) + for f in args.packages: + pkg = PkgNameInfo.parseFilename(f) + pkgs[pkg.name].append((pkg, f)) + for _, v in pkgs.items(): + try: + v.sort() + except TypeError: + print('Bad things happen: %s' % v) + raise + for pkg, f in v[:-args.keep]: + if args.dry_run: + print('would remove %s.' % f) + else: + print('removing %s.' % f) + remove_pkg(f) + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='remove old Arch Linux packages') + parser.add_argument('-n', '--dry-run', action='store_true', + help='dry run') + parser.add_argument('-k', '--keep', metavar='N', type=int, default=2, + help='how many versions to keep. Default is 2') + parser.add_argument('packages', metavar='PACKAGE', nargs='+', + help='package files to check') + args = parser.parse_args() + main(args)