mirror of
https://github.com/lilydjwg/archrepo2.git
synced 2025-03-10 12:02:43 +00:00
64 lines
1.8 KiB
Python
Executable file
64 lines
1.8 KiB
Python
Executable file
#!/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 args.show_kept_fd >= 0:
|
|
for _, f in v[-args.keep:]:
|
|
os.write(args.show_kept_fd, f.encode('utf-8') + b'\n')
|
|
|
|
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('--show-kept-fd', metavar='FD', type=int, default=-1,
|
|
help='write kept package paths to fd FD, one per line')
|
|
parser.add_argument('packages', metavar='PACKAGE', nargs='+',
|
|
help='package files to check')
|
|
args = parser.parse_args()
|
|
main(args)
|