Kaydet (Commit) 2aa15738 authored tarafından Eray Özkural's avatar Eray Özkural

* 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
üst a369c547
...@@ -120,13 +120,13 @@ class ComponentDB(object): ...@@ -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): ...@@ -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):
......
...@@ -24,7 +24,13 @@ import pisi.util as util ...@@ -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): ...@@ -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):
...@@ -52,38 +55,45 @@ class ItemByRepoDB(object): ...@@ -52,38 +55,45 @@ 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):
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))] return [ k for k,data in self.d.items() if data.has_key(self.repo_str(repo))]
else: else:
if show_tracking: if repo == all:
return [ pkg for pkg in self.d.keys() ] return [ pkg for pkg in self.d.keys() ]
else: else:
def not_just_tracking(k, data): return self.list_if( lambda k,data: ItemByRepoDB.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 False
#return True
return self.list_if(not_just_tracking)
def list_if(self, pred):
return [ k for k,data in self.d.items() if pred(k, 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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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)
......
...@@ -363,7 +363,11 @@ def upgrade_pkg_names(A = [], bypass_safety = False): ...@@ -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):
......
...@@ -79,8 +79,8 @@ class PackageDB(object): ...@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment