* fix: make itembyrepodb look only in repositories (and not

tracking dbs) by default. retain option to look everywhere.
* fix: make upgrade work with installed packages not in repository
  (a change required due to above change)
* fix: make info command work with installed packages not in
  repository
This commit is contained in:
Eray Özkural
2006-05-08 16:44:07 +00:00
parent a369c547cd
commit 2aa157384d
4 changed files with 69 additions and 41 deletions
+4 -4
View File
@@ -120,13 +120,13 @@ class ComponentDB(object):
except pisi.itembyrepodb.NotfoundError, e: except pisi.itembyrepodb.NotfoundError, e:
raise Error(_('Component %s not found') % name) raise Error(_('Component %s not found') % name)
def get_union_comp(self, name, txn = None, tracking = False): def get_union_comp(self, name, txn = None, repo = pisi.itembyrepodb.repos ):
"""get a union of all repository components packages, not just the first repo in order. """get a union of all repository components packages, not just the first repo in order.
get only basic repo info from the first repo""" get only basic repo info from the first repo"""
def proc(txn): def proc(txn):
s = self.d.d.get(name, txn=txn) s = self.d.d.get(name, txn=txn)
pkgs = set() pkgs = set()
for repostr in self.d.order(tracking = tracking): for repostr in self.d.order(repo = repo):
if s.has_key(repostr): if s.has_key(repostr):
pkgs |= set(s[repostr].packages) pkgs |= set(s[repostr].packages)
comp = self.get_component(name) comp = self.get_component(name)
@@ -134,8 +134,8 @@ class ComponentDB(object):
return comp return comp
return self.d.txn_proc(proc, txn) return self.d.txn_proc(proc, txn)
def list_components(self, repo=None, show_tracking=False): def list_components(self, repo=None):
return self.d.list(repo, show_tracking=show_tracking) return self.d.list(repo)
def update_component(self, component, repo, txn = None): def update_component(self, component, repo, txn = None):
def proc(txn): def proc(txn):
+57 -33
View File
@@ -24,7 +24,13 @@ import pisi.util as util
import pisi.context as ctx import pisi.context as ctx
import pisi.lockeddbshelve as shelve import pisi.lockeddbshelve as shelve
installed, thirdparty = range(1, 3) installed, thirdparty, repos, all = range(1, 5)
"""installed and thirdparty are special databases to keep track
of already installed stuff and third party stuff not in any real repository.
repos means search in repositories only, and all means search in
repositories and special databases (called tracking databases)
"""
class Error(pisi.Error): class Error(pisi.Error):
pass pass
@@ -32,9 +38,6 @@ class Error(pisi.Error):
class NotfoundError(pisi.Error): class NotfoundError(pisi.Error):
pass pass
# the above are special databases to keep track of already installed stuff and
# third party stuff not in any real repository
class ItemByRepoDB(object): class ItemByRepoDB(object):
def __init__(self, name): def __init__(self, name):
@@ -53,37 +56,44 @@ class ItemByRepoDB(object):
def items(self): def items(self):
return self.d.items() return self.d.items()
def list(self, repo = None, show_tracking = False): @staticmethod
if repo: def not_just_tracking(data):
return [ k for k,data in self.d.items() if data.has_key(self.repo_str(repo))] keys = data.keys()
else: if len(keys)==1:
if show_tracking: if 'trdparty' in keys or 'inst' in keys:
return [ pkg for pkg in self.d.keys() ] return False
else: elif len(keys)==2:
def not_just_tracking(k, data): if 'trdparty' in keys and 'inst' in keys:
keys = data.keys() return False
if len(keys)==1: return True
if 'trdparty' in keys or 'inst' in keys: #below is a slower way
return False #for x in data.keys():
elif len(keys)==2: # if x.startsWith('repo-'):
if 'trdparty' in keys and 'inst' in keys: # return True
return False #return False
return True
#below is a slower way
#for x in data.keys():
# if x.startsWith('repo-'):
# return False
#return True
return self.list_if(not_just_tracking)
def list_if(self, pred): def list_if(self, pred):
return [ k for k,data in self.d.items() if pred(k, data)] return [ k for k,data in self.d.items() if pred(k, data)]
def list(self, repo = None):
if repo == None:
repo = repos
if repo not in [repos, all]:
return [ k for k,data in self.d.items() if data.has_key(self.repo_str(repo))]
else:
if repo == all:
return [ pkg for pkg in self.d.keys() ]
else:
return self.list_if( lambda k,data: ItemByRepoDB.not_just_tracking(data) )
# TODO: carry this to repodb, really :/ # TODO: carry this to repodb, really :/
def order(self, tracking = True): def order(self, repo = None):
if repo == None:
repo = repos
assert repo in [all, repos]
import pisi.repodb import pisi.repodb
order = [ 'repo-' + x for x in ctx.repodb.list() ] order = [ 'repo-' + x for x in ctx.repodb.list() ]
if tracking: if repo == all:
order += ['trdparty', 'inst'] order += ['trdparty', 'inst']
return order return order
@@ -96,6 +106,7 @@ class ItemByRepoDB(object):
elif repo==installed: elif repo==installed:
repo='inst' repo='inst'
else: else:
assert type(repo) == type("")
repo='repo-'+repo repo='repo-'+repo
return repo return repo
@@ -111,21 +122,28 @@ class ItemByRepoDB(object):
def has_key(self, name, repo = None, txn = None): def has_key(self, name, repo = None, txn = None):
name = str(name) name = str(name)
if repo == None:
repo = repos
haskey = self.d.has_key(name, txn) haskey = self.d.has_key(name, txn)
if not repo: if repo == all:
return haskey return haskey
elif repo == repos:
data = self.d.get(name, txn)
return haskey and ItemByRepoDB.not_just_tracking(data)
else: else:
repostr = self.repo_str(repo) repostr = self.repo_str(repo)
return haskey and self.d.get(name, txn).has_key(repostr) return haskey and self.d.get(name, txn).has_key(repostr)
def get_item_repo(self, name, repo = None, txn = None): def get_item_repo(self, name, repo = None, txn = None):
name = str(name) name = str(name)
if repo == None:
repo = repos
def proc(txn): def proc(txn):
if not self.d.has_key(name, txn=txn): if not self.d.has_key(name, txn=txn):
raise NotfoundError(_('Key %s not found') % name) raise NotfoundError(_('Key %s not found') % name)
s = self.d.get(name, txn=txn) s = self.d.get(name, txn=txn)
if repo == None: if repo in [repos, all]:
for repostr in self.order(): for repostr in self.order(repo):
if s.has_key(repostr): if s.has_key(repostr):
return (s[repostr], self.str_repo(repostr)) return (s[repostr], self.str_repo(repostr))
else: else:
@@ -138,6 +156,8 @@ class ItemByRepoDB(object):
return self.d.txn_proc(proc, txn) return self.d.txn_proc(proc, txn)
def get_item(self, name, repo = None, txn = None): def get_item(self, name, repo = None, txn = None):
if repo == None:
repo = repos
x = self.get_item_repo(name, repo, txn) x = self.get_item_repo(name, repo, txn)
if x: if x:
item, repo = x item, repo = x
@@ -155,6 +175,7 @@ class ItemByRepoDB(object):
return None return None
def add_item(self, name, obj, repo, txn = None): def add_item(self, name, obj, repo, txn = None):
assert not repo in [all, repos]
repostr = self.repo_str(repo) repostr = self.repo_str(repo)
def proc(txn): def proc(txn):
if not self.d.has_key(name): if not self.d.has_key(name):
@@ -166,6 +187,7 @@ class ItemByRepoDB(object):
self.d.txn_proc(proc, txn) self.d.txn_proc(proc, txn)
def remove_item_repo(self, name, repo, txn = None): def remove_item_repo(self, name, repo, txn = None):
assert not repo in [all, repos]
name = str(name) name = str(name)
def p(txn): def p(txn):
s = self.d.get(name, txn) s = self.d.get(name, txn)
@@ -185,8 +207,10 @@ class ItemByRepoDB(object):
self.d.txn_proc(p, txn) self.d.txn_proc(p, txn)
def remove_item(self, name, repo=None, txn=None): def remove_item(self, name, repo=None, txn=None):
if repo: if repo == None:
self.remove_item_repo(name,repo,txn=txn) repo = repos
if not repo in [all, repos]:
self.remove_item_repo(name, repo,txn=txn)
else: else:
self.remove_item_only(name,txn=txn) self.remove_item_only(name,txn=txn)
+5 -1
View File
@@ -363,7 +363,11 @@ def upgrade_pkg_names(A = [], bypass_safety = False):
ctx.ui.info(_('Package %s is not installed.') % x) ctx.ui.info(_('Package %s is not installed.') % x)
continue continue
(version, release, build) = ctx.installdb.get_version(x) (version, release, build) = ctx.installdb.get_version(x)
pkg = ctx.packagedb.get_package(x) if ctx.packagedb.has_package(x):
pkg = ctx.packagedb.get_package(x)
else:
ctx.ui.info(_('Package %s is not available in repositories.') % x, True)
continue
if ignore_build or (not build) or (not pkg.build): if ignore_build or (not build) or (not pkg.build):
if Version(release) < Version(pkg.release): if Version(release) < Version(pkg.release):
+2 -2
View File
@@ -79,8 +79,8 @@ class PackageDB(object):
else: else:
return [] return []
def list_packages(self, repo=None, show_tracking=False): def list_packages(self, repo=None):
return self.d.list(repo, show_tracking=show_tracking) return self.d.list(repo)
def add_package(self, package_info, repo, txn = None): def add_package(self, package_info, repo, txn = None):
name = str(package_info.name) name = str(package_info.name)