Hi, This is one part of the makepkg test suite I am working on. It is fairly a simple class that takes a pacman package filename and does some parsing. Currently that involves getting the file list and the info from the .PKGINFO file. I am still fairly new to python so I am looking for comments on how this could be improved. One idea I have had is to not initialize all the fields in the pkginfo dict and add a test if an array exists before appending. It would make the code tidier but that would mean the need to test if the field exists when comparing it later. --- #!/usr/bin/env python3 import os, tarfile class package: ''' parse information from a pacman package member variables: file (string) - name of package file file_list (array) - list of files in the package archive pkginfo (dict) - package information parsed from .PKGINFO ''' def __init__ (self, file): self.file = file if not os.path.exists(file): raise IOError('{} does not exist'.format(file)) if not tarfile.is_tarfile(file): raise TypeError('{} is not a tar file'.format(file)) pkg = tarfile.open(file) self.file_list = pkg.getnames() if not ".PKGINFO" in self.file_list: raise TypeError('{} is not a package file'.format(file)) self.__parse_pkginfo(pkg) pkg.close() def __parse_pkginfo(self, pkg): self.pkginfo = {} self.pkginfo['pkgname'] = "" self.pkginfo['pkgbase'] = "" self.pkginfo['pkgver'] = "" self.pkginfo['pkgdesc'] = "" self.pkginfo['url'] = "" self.pkginfo['builddate'] = "" self.pkginfo['packager'] = "" self.pkginfo['size'] = "" self.pkginfo['arch'] = "" self.pkginfo['force'] = "" self.pkginfo['license'] = [] self.pkginfo['replaces'] = [] self.pkginfo['group'] = [] self.pkginfo['depend'] = [] self.pkginfo['optdepend'] = [] self.pkginfo['conflict'] = [] self.pkginfo['provides'] = [] self.pkginfo['backup'] = [] self.pkginfo['makepkgopt'] = [] arrays = ['license', 'replaces', 'group', 'depend', 'optdepend', 'conflict', 'provides', 'backup', 'makepkgopt'] pkginfo = pkg.extractfile(".PKGINFO") for line in pkginfo: if (line[0] == '#'.encode('utf-8')[0]): continue (key, value) = line.decode('utf-8').split(" = ") if key in arrays: self.pkginfo[key].append(value.strip()) else: self.pkginfo[key] = value.strip() pkginfo.close() if __name__ == '__main__': pkg = package('/var/cache/pacman/pkg/pacman-3.3.1-1-i686.pkg.tar.gz') print('Package file: \n\t{}\n'.format(pkg.file)) print('Package info: \n\t{}\n'.format(pkg.pkginfo)) print('File list: \n\t{}\n'.format(pkg.file_list)) --- Example output:
python3 package.py Package file: /var/cache/pacman/pkg/pacman-3.3.1-1-i686.pkg.tar.gz
Package info: {'license': ['GPL'], 'backup': ['etc/pacman.conf', 'etc/makepkg.conf'], 'replaces': [], 'pkgname': 'pacman', 'builddate': '1253674558', 'pkgdesc': 'A library-based package manager with dependency support', 'makepkgopt': ['strip', '!docs', '!libtool', 'emptydirs', 'zipman', 'purge'], 'url': 'http://www.archlinux.org/pacman/', 'optdepend': ['fakeroot: for makepkg usage as normal user', 'python: for rankmirrors script usage'], 'depend': ['bash', 'libarchive>=2.7.0-2', 'libfetch>=2.20', 'pacman-mirrorlist'], 'group': ['base'], 'pkgbase': '', 'provides': [], 'force': '', 'packager': 'Dan McGee <dan@archlinux.org>', 'size': '2093056', 'arch': 'i686', 'conflict': [], 'pkgver': '3.3.1-1'} File list: ['.PKGINFO', '.INSTALL', 'etc', 'etc/makepkg.conf', 'etc/pacman.conf', 'etc/bash_completion.d', 'etc/bash_completion.d/pacman', 'usr', 'usr/include', 'usr/share', 'usr/bin', 'usr/lib', 'usr/lib/libalpm.so.4', 'usr/lib/libalpm.so.4.0.1', 'usr/lib/libalpm.so', 'usr/lib/libalpm.a', ....