diff --git a/TODO b/TODO index 3e242333..a73af609 100644 --- a/TODO +++ b/TODO @@ -73,20 +73,10 @@ Legend: 3. Beta - - API: yeah, we even got application users (eray) - / i18n support - + upgrade (eray) - + upgrade operation - + test upgrade op - + system-wide upgrade (upgrade-all) komutu - - overhaul installdb (try to merge its use with packagedb) (eray) - - configure-pending (eray) - - ordered configure install thing (eray) + / API: yeah, we even got application users (eray) / multiple package repository (eray) + decide how to implement - / make a package and sourcedb for each repo - + packagedb - - sourceb + + support repo order - support medium types :( uhuuuu - internet: http/ftp - local repository @@ -97,17 +87,19 @@ Legend: - PISIMAT / pykde GUI (cartman) + metaclass coolness for CLI command framework (eray) + / i18n support (those who know how to do it) + + upgrade (eray) + + upgrade operation + + test upgrade op + + system-wide upgrade (upgrade-all) komutu + - overhaul installdb (try to merge its use with packagedb) (eray) + - configure-pending (eray) + - ordered configure install thing (eray) - partial caching and automatic resume for file download (meren) - use a separate "partial/" subdir like urpmi / exception handling (baris) / better/more sensible exception hierarchy (eray) ? recovery from exceptions where necessary - - incremental build/fetch for repository index (pisi-index.xml) - - diffsets (caglar) - / component/category - + requirements - - xml format (baris) (bunlarin class'leri yazilmali) - - usage (build process'in icine koymak baris - meren) / query - comar OM information (Provides) + package by name, summary/description @@ -135,9 +127,18 @@ Legend: 5. Post Release + / make a package and sourcedb for each repo + + packagedb + - sourceb - transaction stuff for database (eray) - multi-architecture support (baris, caglar) / design decisions / extend XML specs to support that - cross-platform building support + / component/category + + requirements + - xml format (baris) (bunlarin class'leri yazilmali) + - usage (build process'in icine koymak baris - meren) + - incremental build/fetch for repository index (pisi-index.xml) + - diffsets (caglar) diff --git a/pisi/api.py b/pisi/api.py index 38fec398..acaa998a 100644 --- a/pisi/api.py +++ b/pisi/api.py @@ -30,6 +30,7 @@ import pisi.repodb import pisi.installdb from pisi.index import Index + class Error(pisi.Error): pass @@ -428,12 +429,9 @@ def index(repo_dir = '.'): index.write(ctx.const.pisi_index) ctx.ui.info('* Index file written\n') -class Repo: - def __init__(self, indexuri): - self.indexuri = indexuri def add_repo(name, indexuri): - repo = Repo(URI(indexuri)) + repo = pisi.repodb.Repo(URI(indexuri)) ctx.repodb.add_repo(name, repo) def remove_repo(name): diff --git a/pisi/packagedb.py b/pisi/packagedb.py index 980c9bbd..138db435 100644 --- a/pisi/packagedb.py +++ b/pisi/packagedb.py @@ -19,7 +19,6 @@ # we basically store everything in PackageInfo class # yes, we are cheap -#from bsddb.dbshelve import DBShelf import bsddb.dbshelve as shelve import os, fcntl from bsddb import db @@ -28,7 +27,7 @@ import pisi import pisi.util as util import pisi.context as ctx -class PackageDBError(pisi.Error): +class Error(pisi.Error): pass class PackageDB(object): @@ -114,7 +113,8 @@ def has_package(name): return False def which_repo(name): - for repo in packagedbs.keys(): + import pisi.repodb + for repo in pisi.repodb.db.list(): if get_db(repo).has_package(name): return repo return None @@ -127,7 +127,7 @@ def get_package(name): return thirdparty_packagedb.get_package(name) if inst_packagedb.has_package(name): return inst_packagedb.get_package(name) - raise PackageDBError, 'get_package: package %s not found' % name + raise Error('get_package: package %s not found' % name) def get_rev_deps(name): repo = which_repo(name) diff --git a/pisi/repodb.py b/pisi/repodb.py index b7bfc73d..e64d672f 100644 --- a/pisi/repodb.py +++ b/pisi/repodb.py @@ -13,46 +13,84 @@ from bsddb import db import os, fcntl +import pisi import pisi.lockeddbshelve as shelve import pisi.context as ctx import pisi.packagedb as packagedb import pisi.util as util from pisi.uri import URI +class Error(pisi.Error): + pass + +class Repo: + def __init__(self, indexuri): + self.indexuri = indexuri + +#class HttpRepo + +#class FtpRepo + +#class RemovableRepo + + class RepoDB(object): """RepoDB maps repo ids to repository information""" + def __init__(self): self.d = shelve.LockedDBShelf("repo") + if not self.d.has_key("order"): + self.d["order"] = [] def init_dbs(self): # initialize package/source dbs - for x in self.d.keys(): + for x in self.list(): packagedb.add_db(x) def __del__(self): self.d.close() + def repo_name(self, ix): + l = self.list() + return l[ix] + + def swap(self, x,y): + l = d["order"] + t = l[x] + l[x] = l[y] + l[y] = t + d["order"] = l + def has_repo(self, name): name = str(name) - return self.d.has_key(name) + return self.d.has_key("repo-" + name) def get_repo(self, name): name = str(name) - return self.d[name] + return self.d["repo-" + name] def add_repo(self, name, repo_info): - self.d[name] = repo_info + if self.d.has_key("repo-" + name): + raise Error('Repository %s already exists' % name) + self.d["repo-" + name] = repo_info + order = self.d["order"] + order.append(name) + self.d["order"] = order packagedb.add_db(name) def list(self): - return self.d.keys() + return self.d["order"] def clear(self): self.d.clear() def remove_repo(self, name): name = str(name) - del self.d[name] + del self.d["repo-" + name] + l = self.d["order"] + l.remove(name) + self.d["order"] = l + db = None