diff --git a/pkgreader.py b/pkgreader.py new file mode 100644 index 0000000..e9b582e --- /dev/null +++ b/pkgreader.py @@ -0,0 +1,44 @@ +import tarfile +import logging + +logger = logging.getLogger(__name__) + +multikeys = {'depend', 'makepkgopt', 'optdepend', 'replaces', 'conflict', + 'provides', 'license', 'backup', 'group'} + +def _add_to_dict(d, key, value): + if key in multikeys: + if key in d: + d[key].append(value) + else: + d[key] = [value] + else: + assert key not in d, 'unexpected multi-value key "%s"' % key + d[key] = value + +def readpkg(file): + tar = tarfile.open(file) + info = tar.next() + if not info or info.name != '.PKGINFO': + logger.warn('%s is not a nice package!', file) + info = '.PKGINFO' # have to look further + f = tar.extractfile(info) + data = f.read().decode() + tar.close() + + d = {} + key = None + for l in data.split('\n'): + if l.startswith('#'): + continue + if not l: + continue + if '=' not in l: + value += l + else: + if key is not None: + _add_to_dict(d, key, value) + key, value = l.split(' = ', 1) + _add_to_dict(d, key, value) + + return d diff --git a/test_readpkg.py b/test_readpkg.py new file mode 100755 index 0000000..58e98b7 --- /dev/null +++ b/test_readpkg.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +# vim:fileencoding=utf-8 + +from subprocess import getoutput +allpkgs = getoutput(r"locate -be --regex '\.pkg\.tar\.xz$'").split('\n') + +from pkgreader import readpkg +for p in allpkgs: + print('reading package:', p) + d = readpkg(p) + print('desc:', d.get('pkgdesc', '(nothing)'))