From 806cf46690af16d94d1547d84af3313268d03a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Thu, 23 Mar 2006 11:29:39 +0000 Subject: [PATCH] * grow Notfounderror * fix: use itembyrepodb in sourcedb * fix: make pkgtosrc db repo-aware --- pisi/cli/commands.py | 2 +- pisi/packagedb.py | 5 ++++ pisi/sourcedb.py | 60 ++++++++++++++++++-------------------------- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index 22aa0c29..9fa33513 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -1001,7 +1001,7 @@ Gives a brief list of sources published in the repositories. list = ctx.sourcedb.list() list.sort() for p in list: - sf, repo = ctx.sourcedb.get_spec(p) + sf, repo = ctx.sourcedb.get_spec_repo(p) if self.options.long: ctx.ui.info('[Repository: ' + repo + ']') ctx.ui.info(unicode(sf.source)) diff --git a/pisi/packagedb.py b/pisi/packagedb.py index fb33c61d..d35330ce 100644 --- a/pisi/packagedb.py +++ b/pisi/packagedb.py @@ -37,6 +37,11 @@ import pisi.itembyrepodb as itembyrepodb class Error(pisi.Error): pass +class NotfoundError(pisi.Error): + def __init__(self, pkg): + pisi.Error.__init__("Package %s not found" % pkg) + self.pkg = pkg + class PackageDB(object): """PackageDB class provides an interface to the package database using shelf objects""" diff --git a/pisi/sourcedb.py b/pisi/sourcedb.py index 400bc952..afe6a82f 100644 --- a/pisi/sourcedb.py +++ b/pisi/sourcedb.py @@ -32,66 +32,56 @@ import pisi.util as util import pisi.context as ctx import pisi.lockeddbshelve as shelve import pisi.repodb +from pisi.itembyrepodb import ItemByRepoDB + +class NotfoundError(pisi.Error): + def __init__(self, spec): + pisi.Error.__init__("Package %s not found" % spec) + self.spec = spec class SourceDB(object): def __init__(self): - self.d = shelve.LockedDBShelf('source') - self.dpkgtosrc = shelve.LockedDBShelf('pkgtosrc') + self.d = ItemByRepoDB('source') + self.dpkgtosrc = ItemByRepoDB('pkgtosrc') def close(self): self.d.close() self.dpkgtosrc.close() def list(self): - list = [] - for (pkg, x) in self.d.items(): - list.append(pkg) # for some reason we couldn't return self.d.items()!! --exa - return list + return self.d.list() - def has_spec(self, name): - name = str(name) - return self.d.has_key(name) + def has_spec(self, name, repo=None, txn=None): + return self.d.has_key(name, repo, txn) - def get_spec(self, name): - name = str(name) - s = self.d[name] - order = ctx.repodb.list() - for repo in order: - if s.has_key(repo): - return (s[repo], repo) - return None + def get_spec(self, name, repo=None, txn = None): + try: + return self.d.get_item(name, repo, txn) + except pisi.itembyrepodb.NotfoundError, e: + raise NotfoundError(name) def pkgtosrc(self, name): - name = str(name) return self.dpkgtosrc[name] def add_spec(self, spec, repo, txn = None): assert not spec.errors() name = str(spec.source.name) - repo = str(repo) def proc(txn): - if not self.d.has_key(name): - s = dict() - else: - s = self.d.get(name, txn) - s[repo] = spec - self.d.put(name, s, txn) + self.d.add_item(name, spec, repo, txn) for pkg in spec.packages: - self.dpkgtosrc.put(pkg.name, name, txn) + self.dpkgtosrc.add_item(pkg.name, name, repo, txn) self.d.txn_proc(proc, txn) - def remove_specfile(self, name, repo): + def remove_specfile(self, name, repo, txn = None): name = str(name) - repo = str(repo) def proc(txn): - #assert self.has_source(name) - s = self.d[name] - s.remove(repo) - if (len(s)==0): - del self.d[name] - else: - self.d[name] = s + assert self.has_spec(name, txn=txn) + spec = self.d.get_item_repo(name, repo, txn) + self.d.remove_item(name, repo, txn=txn) + for pkg in spec.packages: + self.dpkgtosrc.remove_item(pkg.name, name, repo, txn) + self.d.txn_proc(proc, txn) sourcedb = None