* database: filename + '.loc' seklinde lock dosyalarini ac

* packagedb: her repo icin bir tane destekle
* repodb: ilk haline getir
* repodb'ye erisim icin add-repo, remove-repo, list-repo, update-repo
  komutlarini yaz
* database update'i bir repo'dan yapilir
* dependency: eksik release karsilastirmalarini ekle
* database'leri entry point'de Commands class'inde init_db'yle hazirla
  bunu database kullanan komutlarda cagir
* seveyim boyle turkceyi
This commit is contained in:
Eray Özkural
2005-07-28 18:58:02 +00:00
parent 86829c0878
commit c1e1b69d1d
10 changed files with 159 additions and 53 deletions
+69 -17
View File
@@ -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 <repo1> <repo2> ...."""
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 <repo> <indexuri>"""
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 <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?
+4 -1
View File
@@ -10,7 +10,10 @@ install
list-installed
list-available
remove
updatedb
add-repo
remove-repo
list-repo
update-repo
Use \"%prog help <command>\" for help on a specific subcommand.
+5 -1
View File
@@ -2,7 +2,7 @@
# Author: Eray Ozkural <eray@uludag.org.tr>
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):
+5 -4
View File
@@ -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')
+1 -1
View File
@@ -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
+22 -4
View File
@@ -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')
+1 -1
View File
@@ -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 *
+30 -9
View File
@@ -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()
+4 -3
View File
@@ -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)
+18 -12
View File
@@ -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')