62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
import ZODB
|
|
import ZODB.FileStorage
|
|
import persistent
|
|
import BTrees.OOBTree
|
|
from repobot.provider import providers
|
|
import os
|
|
from repobot.common import plist, pmap
|
|
|
|
|
|
class Repo(persistent.Persistent):
|
|
def __init__(self, name, provider):
|
|
self.name = name
|
|
self.provider = provider
|
|
self.packages = pmap()
|
|
self.data = pmap()
|
|
|
|
def get_package(self, name, version):
|
|
if name not in self.packages:
|
|
self.packages[name] = pmap()
|
|
if version not in self.packages[name]:
|
|
self.packages[name][version] = RepoPackage(name, version)
|
|
return self.packages[name][version]
|
|
|
|
|
|
class RepoPackage(persistent.Persistent):
|
|
def __init__(self, name, version):
|
|
self.name = name
|
|
self.version = version
|
|
self.data = pmap()
|
|
|
|
|
|
class RepoDb(object):
|
|
def __init__(self, db_path, data_root):
|
|
self.storage = ZODB.FileStorage.FileStorage(db_path)
|
|
self.db = ZODB.DB(self.storage)
|
|
self.data_root = data_root
|
|
|
|
with self.db.transaction() as c:
|
|
if "repos" not in c.root():
|
|
c.root.repos = BTrees.OOBTree.BTree()
|
|
|
|
def add_package(self, provider, reponame, pkgname, pkgversion, fname, fobj, params):
|
|
with self.db.transaction() as c:
|
|
repo = self._get_repo(c, provider, reponame)
|
|
datadir = os.path.join(self.data_root, provider, reponame)
|
|
provider = providers[repo.provider](self.db, repo, datadir)
|
|
provider.add_package(repo.get_package(pkgname, pkgversion), fname, fobj, params)
|
|
|
|
def _get_repo(self, c, provider, name):
|
|
if provider not in c.root.repos:
|
|
c.root.repos[provider] = pmap()
|
|
if name not in c.root.repos[provider]:
|
|
c.root.repos[provider][name] = Repo(name, provider)
|
|
return c.root.repos[provider][name]
|
|
|
|
def browse_repo(self, provider, reponame, args):
|
|
with self.db.transaction() as c:
|
|
repo = c.root.repos[provider][reponame]
|
|
datadir = os.path.join(self.data_root, provider, reponame)
|
|
provider = providers[repo.provider](self.db, repo, datadir)
|
|
return provider.browse(args)
|