Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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