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 <[email protected]>', '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', ....

#!/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))


Reply via email to