* 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:
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 only basic repo info from the first repo"""
def proc(txn):
s = self.d.d.get(name, txn=txn)
pkgs = set()
for repostr in self.d.order(tracking = tracking):
for repostr in self.d.order(repo = repo):
if s.has_key(repostr):
pkgs |= set(s[repostr].packages)
comp = self.get_component(name)
@@ -134,8 +134,8 @@ class ComponentDB(object):
return comp
return self.d.txn_proc(proc, txn)
def list_components(self, repo=None, show_tracking=False):
return self.d.list(repo, show_tracking=show_tracking)
def list_components(self, repo=None):
return self.d.list(repo)
def update_component(self, component, repo, txn = None):
def proc(txn):
+58 -34
View File
@@ -24,7 +24,13 @@ import pisi.util as util
import pisi.context as ctx
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):
pass
@@ -32,9 +38,6 @@ class Error(pisi.Error):
class NotfoundError(pisi.Error):
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):
def __init__(self, name):
@@ -52,38 +55,45 @@ class ItemByRepoDB(object):
def items(self):
return self.d.items()
def list(self, repo = None, show_tracking = False):
if repo:
return [ k for k,data in self.d.items() if data.has_key(self.repo_str(repo))]
else:
if show_tracking:
return [ pkg for pkg in self.d.keys() ]
else:
def not_just_tracking(k, data):
keys = data.keys()
if len(keys)==1:
if 'trdparty' in keys or 'inst' in keys:
return False
elif len(keys)==2:
if 'trdparty' in keys and 'inst' in keys:
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)
@staticmethod
def not_just_tracking(data):
keys = data.keys()
if len(keys)==1:
if 'trdparty' in keys or 'inst' in keys:
return False
elif len(keys)==2:
if 'trdparty' in keys and 'inst' in keys:
return False
return True
#below is a slower way
#for x in data.keys():
# if x.startsWith('repo-'):
# return True
#return False
def list_if(self, pred):
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 :/
def order(self, tracking = True):
def order(self, repo = None):
if repo == None:
repo = repos
assert repo in [all, repos]
import pisi.repodb
order = [ 'repo-' + x for x in ctx.repodb.list() ]
if tracking:
if repo == all:
order += ['trdparty', 'inst']
return order
@@ -96,6 +106,7 @@ class ItemByRepoDB(object):
elif repo==installed:
repo='inst'
else:
assert type(repo) == type("")
repo='repo-'+repo
return repo
@@ -111,21 +122,28 @@ class ItemByRepoDB(object):
def has_key(self, name, repo = None, txn = None):
name = str(name)
if repo == None:
repo = repos
haskey = self.d.has_key(name, txn)
if not repo:
if repo == all:
return haskey
elif repo == repos:
data = self.d.get(name, txn)
return haskey and ItemByRepoDB.not_just_tracking(data)
else:
repostr = self.repo_str(repo)
return haskey and self.d.get(name, txn).has_key(repostr)
def get_item_repo(self, name, repo = None, txn = None):
name = str(name)
if repo == None:
repo = repos
def proc(txn):
if not self.d.has_key(name, txn=txn):
raise NotfoundError(_('Key %s not found') % name)
s = self.d.get(name, txn=txn)
if repo == None:
for repostr in self.order():
if repo in [repos, all]:
for repostr in self.order(repo):
if s.has_key(repostr):
return (s[repostr], self.str_repo(repostr))
else:
@@ -138,6 +156,8 @@ class ItemByRepoDB(object):
return self.d.txn_proc(proc, txn)
def get_item(self, name, repo = None, txn = None):
if repo == None:
repo = repos
x = self.get_item_repo(name, repo, txn)
if x:
item, repo = x
@@ -155,6 +175,7 @@ class ItemByRepoDB(object):
return None
def add_item(self, name, obj, repo, txn = None):
assert not repo in [all, repos]
repostr = self.repo_str(repo)
def proc(txn):
if not self.d.has_key(name):
@@ -166,6 +187,7 @@ class ItemByRepoDB(object):
self.d.txn_proc(proc, txn)
def remove_item_repo(self, name, repo, txn = None):
assert not repo in [all, repos]
name = str(name)
def p(txn):
s = self.d.get(name, txn)
@@ -185,8 +207,10 @@ class ItemByRepoDB(object):
self.d.txn_proc(p, txn)
def remove_item(self, name, repo=None, txn=None):
if repo:
self.remove_item_repo(name,repo,txn=txn)
if repo == None:
repo = repos
if not repo in [all, repos]:
self.remove_item_repo(name, repo,txn=txn)
else:
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)
continue
(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 Version(release) < Version(pkg.release):
+2 -2
View File
@@ -79,8 +79,8 @@ class PackageDB(object):
else:
return []
def list_packages(self, repo=None, show_tracking=False):
return self.d.list(repo, show_tracking=show_tracking)
def list_packages(self, repo=None):
return self.d.list(repo)
def add_package(self, package_info, repo, txn = None):
name = str(package_info.name)