195 lines
4.5 KiB
Python
195 lines
4.5 KiB
Python
#!/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])
|
|
archPackage = ArchPackage(d["%NAME%"])
|
|
archPackage.set_filename(d["%FILENAME%"])
|
|
archPackage.set_version(d["%VERSION%"])
|
|
archPackage.set_desc(d["%DESC%"])
|
|
archPackage.set_csize(d["%CSIZE%"])
|
|
archPackage.set_isize(d["%ISIZE%"])
|
|
archPackage.set_url(d["%URL%"])
|
|
archPackage.set_license(d["%LICENSE%"])
|
|
archPackage.set_arch(d["%ARCH%"])
|
|
archPackage.set_builddate(d["%BUILDDATE%"])
|
|
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
|