diff --git a/pisi/index.py b/pisi/index.py index 534089a2..763331f0 100644 --- a/pisi/index.py +++ b/pisi/index.py @@ -126,6 +126,7 @@ class Index(xmlfile.XmlFile): for comp in self.components: ctx.componentdb.update_component(comp, repo, txn) ctx.packagedb.remove_repo(repo, txn=txn) + ctx.packagedb.add_obsoletes(self.distribution.obsoletes, repo, txn=txn) for pkg in self.packages: ctx.packagedb.add_package(pkg, repo, txn=txn) update_progress() diff --git a/pisi/operations.py b/pisi/operations.py index 4df43403..daed0526 100644 --- a/pisi/operations.py +++ b/pisi/operations.py @@ -226,6 +226,12 @@ def remove_conflicting_packages(conflicts): if remove(conflicts, ignore_dep=True, ignore_safety=True): raise Error(_("Conflicts remain")) +def remove_obsoleted_packages(): + obsoletes = filter(ctx.installdb.is_installed, ctx.packagedb.get_obsoletes()) + if obsoletes: + if remove(obsoletes, ignore_dep=True, ignore_safety=True): + raise Error(_("Obsoleted packages remaining")) + def check_conflicts(order, packagedb): """check if upgrading to the latest versions will cause havoc done in a simple minded way without regard for dependencies of @@ -498,6 +504,8 @@ def upgrade_pkg_names(A = []): if replaces: remove_replaced_packages(order, replaces) + + remove_obsoleted_packages() for path in paths: ctx.ui.info(util.colorize(_("Installing %d / %d") % (paths.index(path)+1, len(paths)), "yellow")) diff --git a/pisi/packagedb.py b/pisi/packagedb.py index 257d2826..072af94c 100644 --- a/pisi/packagedb.py +++ b/pisi/packagedb.py @@ -40,16 +40,19 @@ class PackageDB(object): def __init__(self): self.d = pisi.itembyrepodb.ItemByRepoDB('package') self.dr = pisi.itembyrepodb.ItemByRepoDB('revdep') + self.do = pisi.itembyrepodb.ItemByRepoDB('obsoleted') self.drp = pisi.itembyrepodb.ItemByRepoDB('replaces') def close(self): self.d.close() self.dr.close() + self.do.close() self.drp.close() def destroy(self): self.d.destroy() self.dr.destroy() + self.do.destroy() self.drp.destroy() def has_package(self, name, repo=None, txn = None): @@ -67,6 +70,14 @@ class PackageDB(object): def which_repo(self, name, txn = None): return self.d.which_repo(name, txn=txn) + def get_obsoletes(self, repo=None): + obsoletes = [] + for r in self.do.list(repo): + obsoletes.extend(self.do.get_item(r, repo)) + + replaces = self.get_replaces(repo) + return set(str(o) for o in obsoletes) - set(replaces.keys()) + # replacesdb holds the info about the replaced packages (ex. gaim -> pidgin) def get_replaces(self, repo = None): pairs = {} @@ -94,6 +105,11 @@ class PackageDB(object): def list_packages(self, repo=None): return self.d.list(repo) + def add_obsoletes(self, obsoletes, repo, txn = None): + def proc(txn): + self.do.add_item(repo, obsoletes, repo, txn) + ctx.txn_proc(proc, txn) + def add_package(self, package_info, repo, txn = None): name = str(package_info.name) @@ -120,6 +136,7 @@ class PackageDB(object): def clear(self, txn = None): self.d.clear() self.dr.clear() + self.do.clear() self.drp.clear() def remove_package(self, name, repo = None, txn = None): @@ -151,6 +168,7 @@ class PackageDB(object): def proc(txn): self.d.remove_repo(repo, txn=txn) self.dr.remove_repo(repo, txn=txn) + self.do.remove_repo(repo, txn=txn) self.drp.remove_repo(repo, txn=txn) self.d.txn_proc(proc, txn)