def load_from_db(self): ''' Loads the package list from a repo database file ''' if not isfile(self._db): return {} try: db = open_tarfile(self._db) except: raise DbError(_('Could not open database: {0}').format(self._db)) packages = {} for member in (m for m in db.getmembers() if m.isfile() and basename(m.name) == Repo.DESC): try: desc = db.extractfile(member).read().decode('utf8') info = DescParser(desc).parse() except ParserError as e: raise DbError( _('Invalid db entry: {0}: {1}').format( member.name, e.message)) except: raise DbError( _('Could not read db entry: {0}').format(member.name)) path = join(self._path, info['filename']) packages[info['name']] = Package(info['name'], info['version'], path, info) try: db.close() except: raise DbError(_('Could not close database: {0}').format(self._db)) return packages
def load(self): ''' Loads the package list from a repo database file ''' if not isfile(self._db): return {} if not tarfile.is_tarfile(self._db): raise Exception( _('File is no valid database: {0}').format(self._db)) db = tarfile.open(self._db) packages = {} for member in (m for m in db.getmembers() if m.isfile() and m.name.endswith('desc')): desc = db.extractfile(member).read().decode('utf8') infos = dict( ((k.lower(), v) for k, v in re.findall('%([A-Z256]+)%\n([^\n]+)\n', desc))) if any(True for k in ['name', 'version', 'filename'] if k not in infos): raise Exception(_('Missing database entry: {0}').format(r)) path = join(self._path, infos['filename']) packages[infos['name']] = Package(infos['name'], infos['version'], path, infos) db.close() return packages