#!/usr/bin/env python # -*- coding: utf-8 -*- import os import tarfile class ArchDatabase: """Representation of an Arch Linux package database.""" FILE_EXTENSION = ".db.tar.gz" def __init__(self, filename): """Construct a new database object and read all containing packages.""" self.filename = filename self.packages = [] self._parse() def get_fielname(self): """Get filename of database.""" return self.filename def get_name(self): """Get simple name of database.""" return os.path.basename(self.filename)[0:-len(ArchDatabase.FILE_EXTENSION)] def get_packages(self): """Get list of packages contained in the database.""" return self.packages def _parse(self): """Read and parse database content.""" with tarfile.open(name=self.filename) as tf: for f in tf: if f.isfile() and os.path.basename(f.name) == "desc": df = tf.extractfile(f) s = df.read().decode('utf-8') d = dict(item.split("\n")[:2] for item in s.split("\n\n")[:-1]) if "%NAME%" in d: archPackage = ArchPackage(d["%NAME%"]) if "%FILENAME%" in d: archPackage.set_filename(d["%FILENAME%"]) if "%VERSION%" in d: archPackage.set_version(d["%VERSION%"]) if "%DESC%" in d: archPackage.set_desc(d["%DESC%"]) if "%CSIZE%" in d: archPackage.set_csize(d["%CSIZE%"]) if "%ISIZE%" in d: archPackage.set_isize(d["%ISIZE%"]) if "%URL%" in d: archPackage.set_url(d["%URL%"]) if "%LICENSE%" in d: archPackage.set_license(d["%LICENSE%"]) if "%ARCH%" in d: archPackage.set_arch(d["%ARCH%"]) if "%BUILDDATE%" in d: archPackage.set_builddate(d["%BUILDDATE%"]) if "%PACKAGER%" in d: archPackage.set_packager(d["%PACKAGER%"]) self.packages.append(archPackage) def find_databases(directory): """Find all database files in a directory, including subdirectories.""" databases = [] for root, dirs, files in os.walk(directory): for file in files: if file.endswith(ArchDatabase.FILE_EXTENSION): archDatabase = ArchDatabase(os.path.join(root, file)) databases.append(archDatabase) return databases class ArchPackage: """Representation of an Arch Linux package.""" def __init__(self, name): """Construct a new package.""" self.name = name self.filename = None self.version = None self.desc = None self.csize = None self.isize = None self.url = None self.license = None self.arch = None self.builddate = None self.packager = None def get_name(self): """Get the package name.""" return self.name def set_filename(self, filename): """Set package filename.""" self.filename = filename def get_filename(self): """Get package filename.""" return self.filename def set_version(self, version): """Set version.""" self.version = version def get_version(self): """Get version.""" return self.version def set_desc(self, desc): """Set description.""" self.desc = desc def get_desc(self): """Get description.""" return self.desc def set_csize(self, csize): """Set csize.""" self.csize = csize def get_csize(self): """Get csize.""" return self.csize def set_isize(self, isize): """Set isize.""" self.isize = isize def get_isize(self): """Get isize.""" return self.isize def set_url(self, url): """Set upstream URL.""" self.url = url def get_url(self): """Get upstream URL.""" return self.url def set_license(self, license): """Set license.""" self.license = license def get_license(self): """Get license.""" return self.license def set_arch(self, arch): """Set architecture.""" self.arch = arch def get_arch(self): """Get architecture.""" return self.arch def set_builddate(self, builddate): """Set build date.""" self.builddate = builddate def get_builddate(self): """Get build date.""" return self.builddate def set_packager(self, packager): """Set name of packager.""" self.packager = packager def get_packager(self): """Get name of packager.""" return self.packager