diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index 5e7f4dc2..72e2edeb 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -17,7 +17,11 @@ def cmdObject(cmd, fail=False): "search-available": SearchAvailable, "remove": Remove, "index": Index, - "updatedb": UpdateDB} + "update-repo": UpdateRepo, + "add-repo": AddRepo, + "remove-repo": RemoveRepo, + "list-repo": ListRepo + } if commands.has_key(cmd): obj = commands[cmd]() @@ -31,6 +35,7 @@ def cmdObject(cmd, fail=False): class Command(object): """generic help string for any command""" + def __init__(self): # now for the real parser self.parser = OptionParser(usage=usage_text, @@ -39,7 +44,7 @@ class Command(object): self.parser = commonopts(self.parser) (self.options, args) = self.parser.parse_args() self.args = args[1:] - + self.checkAuthInfo() def options(self): @@ -54,11 +59,11 @@ class Command(object): # TODO: We'll get the username, password pair from a configuration # file from users home directory. Currently we need user to # give it from the user interface. -# if not username and not password: -# if someauthconfig.username and someauthconfig.password: -# self.authInfo = (someauthconfig.username, -# someauthconfig.password) -# return + # if not username and not password: + # if someauthconfig.username and someauthconfig.password: + # self.authInfo = (someauthconfig.username, + # someauthconfig.password) + # return if username and password: self.authInfo = (username, password) return @@ -70,6 +75,10 @@ class Command(object): else: self.authInfo = None + def init_db(self): + from pisi.repodb import repodb + repodb.init_dbs() + def help(self): print getattr(self, "__doc__") @@ -116,6 +125,7 @@ class Install(Command): self.help() return + self.init_db() pisi.toplevel.install(self.args) class Remove(Command): @@ -132,6 +142,7 @@ class Remove(Command): self.help() return + self.init_db() pisi.toplevel.remove(self.args) class Info(Command): @@ -186,6 +197,7 @@ class ListInstalled(Command): default=False, help="show in long format") def run(self): + self.init_db() from pisi.installdb import installdb for pkg in installdb.list_installed(): from pisi.packagedb import packagedb @@ -195,21 +207,60 @@ class ListInstalled(Command): else: print package -class UpdateDB(Command): - """updatedb: update source and package databases""" +class UpdateRepo(Command): + """update-repo: update the databases of a repository + usage: update-repo ....""" def __init__(self): - super(UpdateDB, self).__init__() + super(UpdateRepo, self).__init__() def run(self): - try: - indexfile = self.args[0] - except IndexError: - # doesn't have an index file, we'll use the repo url in - # configuration file - indexfile = None + self.init_db() + for repo in self.args: + pisi.ui.info('Updating repository ' + repo + '\n') + pisi.toplevel.update_repo(repo) - pisi.toplevel.updatedb(indexfile) +class AddRepo(Command): + """add-repo: add a repository + usage: add-repo """ + def __init__(self): + super(AddRepo, self).__init__() + def run(self): + + if len(self.args)>=2: + name = self.args[0] + indexuri = self.args[1] + pisi.toplevel.add_repo(name, indexuri) + else: + self.help() + return + +class RemoveRepo(Command): + """remove-repo: remove a repository + usage: remove-repo """ + def __init__(self): + super(RemoveRepo, self).__init__() + + def run(self): + + if len(self.args)>=1: + name = self.args[0] + pisi.toplevel.remove_repo(name) + else: + self.help() + return + +class ListRepo(Command): + """list-repo: list repositories""" + def __init__(self): + super(ListRepo, self).__init__() + + def run(self): + + from pisi.repodb import repodb + for repo in repodb.list(): + print repo + print ' ', repodb.get_repo(repo).indexuri.getUri() class ListAvailable(Command): "list-available: list the available packages in the repository" @@ -217,6 +268,7 @@ class ListAvailable(Command): super(ListAvailable, self).__init__() def run(self): + self.init_db() from pisi import util # FIXME: bu asagidaki code bayagi anlamsiz # neden bir packagedb'miz var? diff --git a/pisi/cli/common.py b/pisi/cli/common.py index 02eec12e..308b96f9 100644 --- a/pisi/cli/common.py +++ b/pisi/cli/common.py @@ -10,7 +10,10 @@ install list-installed list-available remove -updatedb +add-repo +remove-repo +list-repo +update-repo Use \"%prog help \" for help on a specific subcommand. diff --git a/pisi/dependency.py b/pisi/dependency.py index 52e5f534..8b2280c8 100644 --- a/pisi/dependency.py +++ b/pisi/dependency.py @@ -2,7 +2,7 @@ # Author: Eray Ozkural from installdb import installdb -from packagedb import packagedb +import packagedb from ui import ui from version import Version @@ -17,6 +17,10 @@ def satisfiesDep(pkg, depinfo): ret &= Version(version) >= Version(depinfo.versionFrom) if depinfo.versionTo: ret &= Version(version) <= Version(depinfo.versionTo) + if depinfo.releaseFrom: + ret &= Version(release) <= Version(depinfo.releaseFrom) + if depinfo.releaseTo: + ret &= Version(release) <= Version(depinfo.releaseTo) return ret def runtimeDeps(pkg): diff --git a/pisi/index.py b/pisi/index.py index bbaf46c9..8e45a3b9 100644 --- a/pisi/index.py +++ b/pisi/index.py @@ -5,7 +5,7 @@ from package import Package from xmlfile import XmlFile import metadata -from packagedb import packagedb +import packagedb from ui import ui import util from config import config @@ -61,10 +61,11 @@ class Index(XmlFile): ui.info('Adding ' + fn + ' to package index\n') self.add_package(join(root, fn)) - def update_db(self): - packagedb.clear() + def update_db(self, repo): + pkgdb = packagedb.get_db(repo) + pkgdb.clear() for pkg in self.packages: - packagedb.add_package(pkg) + pkgdb.add_package(pkg) def add_package(self, path): package = Package(path, 'r') diff --git a/pisi/install.py b/pisi/install.py index b1707e50..46c4f740 100644 --- a/pisi/install.py +++ b/pisi/install.py @@ -10,7 +10,7 @@ from config import config from constants import const from ui import ui from installdb import installdb -from packagedb import packagedb, inst_packagedb +import packagedb import dependency from metadata import MetaData import comariface diff --git a/pisi/packagedb.py b/pisi/packagedb.py index b3fd7d05..9d01afeb 100644 --- a/pisi/packagedb.py +++ b/pisi/packagedb.py @@ -20,14 +20,15 @@ class PackageDB(object): a delegated dbshelve object""" def __init__(self, id): util.check_dir(config.db_dir()) - filename = os.path.join(config.db_dir(), 'package-' + id + '.bdb') - self.d = shelve.open(filename) - self.fdummy = open(filename) + self.filename = os.path.join(config.db_dir(), 'package-' + id + '.bdb') + self.d = shelve.open(self.filename) + self.fdummy = file(self.filename + '.lock', 'w') fcntl.flock(self.fdummy, fcntl.LOCK_EX) def __del__(self): #fcntl.flock(self.fdummy, fcntl.LOCK_UN) self.fdummy.close() + #os.unlink(self.filename + '.lock') def has_package(self, name): name = str(name) @@ -37,6 +38,9 @@ class PackageDB(object): name = str(name) return self.d[name] + def list(self): + return self.d.keys() + def add_package(self, package_info): name = str(package_info.name) self.d[name] = package_info @@ -48,6 +52,20 @@ class PackageDB(object): name = str(name) del self.d[name] -packagedb = PackageDB('repo') +packagedbs = {} + +def add_db(name): + packagedbs[name] = PackageDB(name) + +def get_db(name): + return packagesdb[name] + +def remove_db(name): + del packagedbs[name] + # erase database file + +#def has_package +#def get_package +#def remove_package inst_packagedb = PackageDB('local') diff --git a/pisi/pgraph.py b/pisi/pgraph.py index 958fefae..b3c942f3 100644 --- a/pisi/pgraph.py +++ b/pisi/pgraph.py @@ -1,6 +1,6 @@ # PISI package relation graph that represents the state of packagedb -from packagedb import packagedb +import packagedb from sourcedb import sourcedb from graph import * diff --git a/pisi/repodb.py b/pisi/repodb.py index 6a07bd54..81d72499 100644 --- a/pisi/repodb.py +++ b/pisi/repodb.py @@ -1,28 +1,49 @@ # Author: Eray Ozkural +from bsddb import db +import bsddb.dbshelve as shelve +import os, fcntl + +from config import config +import packagedb, util +from pisi.purl import PUrl + +class Repo: + def __init__(self, indexuri): + self.indexuri = indexuri + class RepoDB(object): - """RepoDB maps repo ids to distribution information""" + """RepoDB maps repo ids to repository information""" def __init__(self): - filename = os.path.join(config.db_dir(), 'repo.bdb') - self.d = shelve.open(filename) - self.fdummy = open(filename) + self.filename = os.path.join(config.db_dir(), 'repo.bdb') + self.d = shelve.open(self.filename) + self.fdummy = open(self.filename + '.lock', 'w') fcntl.flock(self.fdummy, fcntl.LOCK_EX) + def init_dbs(self): + # initialize package/source dbs + for x in self.d.keys(): + packagedb.add_db(x) + def __del__(self): #fcntl.flock(self.fdummy, fcntl.LOCK_UN) self.fdummy.close() + #os.unlink(self.filename + '.lock') - def has_distro(self, name): + def has_repo(self, name): name = str(name) return self.d.has_key(name) - def get_distro(self, name): + def get_repo(self, name): name = str(name) return self.d[name] - def add_distro(self, dist_info): - name = str(dist_info.name) - self.d[name] = dist_info + def add_repo(self, name, repo_info): + self.d[name] = repo_info + packagedb.add_db(name) + + def list(self): + return self.d.keys() def clear(self): self.d.clear() diff --git a/pisi/sourcedb.py b/pisi/sourcedb.py index 75e93bcd..0639cff9 100644 --- a/pisi/sourcedb.py +++ b/pisi/sourcedb.py @@ -17,14 +17,15 @@ class SourceDB(object): def __init__(self): util.check_dir(config.db_dir()) - filename = os.path.join(config.db_dir(), 'source.bdb') - self.d = shelve.open(filename) - self.fdummy = open(filename) + self.filename = os.path.join(config.db_dir(), 'source.bdb') + self.d = shelve.open(self.filename) + self.fdummy = file(self.filename + '.lock', 'w') fcntl.flock(self.fdummy, fcntl.LOCK_EX) def __del__(self): #fcntl.flock(self.fdummy, fcntl.LOCK_UN) self.fdummy.close() + #os.unlink(self.filename + '.lock') def has_source(self, name): name = str(name) diff --git a/pisi/toplevel.py b/pisi/toplevel.py index b5e0e502..27752cee 100644 --- a/pisi/toplevel.py +++ b/pisi/toplevel.py @@ -1,18 +1,15 @@ # top level PISI interfaces # a facade to the entire PISI system -import os -import sys +import os, sys from config import config from constants import const from ui import ui from purl import PUrl -import util -import dependency -import pgraph -import operations -from packagedb import packagedb +import util, dependency, pgraph, operations, packagedb +from repodb import repodb +from index import Index def install(packages): """install a list of packages (either files/urls, or names)""" @@ -101,18 +98,27 @@ def index(repo_dir = '.'): index.write(const.pisi_index) ui.info('* Index file written\n') +class Repo: + def __init__(self, indexuri): + self.indexuri = indexuri -def updatedb(indexfile = None, repo = "default"): - from index import Index +def add_repo(name, indexuri): + repo = Repo(PUrl(indexuri)) + repodb.add_repo(name, repo) + +def remove_repo(name): + repodb.remove_repo(name) + +def update_repo(repo): if not indexfile: repos_path = config.values.repos[repo] indexfile = os.path.join(repos_path, const.pisi_index) - ui.info('* Updating DB from index file: %s\n' % indexfile) + ui.info('* Updating repository: %s\n' % repo) index = Index() - index.read(indexfile, repo) - index.update_db() + index.read(repodb.get_repo(repo).indexuri.uri()) + index.update_db(repo) ui.info('* Package db updated.\n')