* packagedb'yi cogaltmaya basla

* repodb'ye basla
* installer'i biraz duzenle
* temizlik
This commit is contained in:
Eray Özkural
2005-07-24 19:48:07 +00:00
parent 5c920137da
commit 6be64b8191
5 changed files with 90 additions and 54 deletions
+50 -38
View File
@@ -10,7 +10,7 @@ from config import config
from constants import const from constants import const
from ui import ui from ui import ui
from installdb import installdb from installdb import installdb
from packagedb import packagedb from packagedb import packagedb, inst_packagedb
import dependency import dependency
from metadata import MetaData from metadata import MetaData
import comariface import comariface
@@ -22,19 +22,32 @@ class InstallError(Exception):
class Installer: class Installer:
"Installer class, provides install routines for pisi packages" "Installer class, provides install routines for pisi packages"
def __init__(self, package_fname): def __init__(self, package_fname):
self.package = Package(package_fname) self.package = Package(package_fname)
self.package.read() self.package.read()
self.metadata = self.package.metadata self.metadata = self.package.metadata
self.files = self.package.files self.files = self.package.files
def install(self):
self.pkginfo = self.metadata.package
self.check_requirements()
self.check_relations()
self.reinstall()
self.extractInstall()
self.storePisiFiles()
self.registerCOMARScripts()
self.update_databases()
def extractInstall(self): def extractInstall(self):
"unzip package in place"
ui.info('Extracting files\n') ui.info('Extracting files\n')
self.package.extract_dir_flat('install', config.destdir) self.package.extract_dir_flat('install', config.destdir)
def storePisiFiles(self): def storePisiFiles(self):
# put files.xml, metadata.xml, actions.py and COMAR scripts """put files.xml, metadata.xml, actions.py and COMAR scripts
# somewhere in the file system. We'll need these in future... somewhere in the file system. We'll need these in future..."""
ui.info('Storing %s\n' % const.files_xml) ui.info('Storing %s\n' % const.files_xml)
self.package.extract_file(const.files_xml, self.package.pkg_dir()) self.package.extract_file(const.files_xml, self.package.pkg_dir())
@@ -50,7 +63,8 @@ class Installer:
self.package.extract_file(fpath, self.package.pkg_dir()) self.package.extract_file(fpath, self.package.pkg_dir())
def registerCOMARScripts(self): def registerCOMARScripts(self):
# register COMAR scripts "register COMAR scripts"
for pcomar in self.metadata.package.providesComar: for pcomar in self.metadata.package.providesComar:
scriptPath = os.path.join(self.package.comar_dir(),pcomar.script) scriptPath = os.path.join(self.package.comar_dir(),pcomar.script)
ui.info("Registering COMAR script %s\n" % pcomar.script) ui.info("Registering COMAR script %s\n" % pcomar.script)
@@ -60,72 +74,70 @@ class Installer:
if not ret: if not ret:
ui.error("registerScript failed. Be sure that comard is running!\n") ui.error("registerScript failed. Be sure that comard is running!\n")
def check_requirements(self):
"""check system requirements"""
#TODO: IS THERE ENOUGH SPACE?
# what to do if / is split into /usr, /var, etc.
pass
def install(self): def check_relations(self):
# check file system requirements
# what to do if / is split into /usr, /var, etc.?
pkginfo = self.metadata.package
# check if package is in database # check if package is in database
if not packagedb.has_package(pkginfo.name): # TODO: when repodb comes alive, this will put it into 3rd
packagedb.add_package(pkginfo) # terrible solution it seems # party packagedb
if not packagedb.has_package(self.pkginfo.name):
packagedb.add_package(self.pkginfo) # terrible solution it seems
# check conflicts # check conflicts
for pkg in self.metadata.package.conflicts: for pkg in self.metadata.package.conflicts:
if installdb.has_package(pkginfo): if installdb.has_package(self.pkginfo):
raise InstallError("Package conflicts " + pkg) raise InstallError("Package conflicts " + pkg)
# check dependencies # check dependencies
if not dependency.installable(pkginfo.name): if not dependency.installable(self.pkginfo.name):
ui.error('Dependencies for ' + pkginfo.name + ui.error('Dependencies for ' + self.pkginfo.name +
' not satisfied\n') ' not satisfied\n')
raise InstallError("Package not installable") raise InstallError("Package not installable")
if installdb.is_installed(pkginfo.name): # is this a reinstallation? def reinstall(self):
(iversion, irelease) = installdb.get_version(pkginfo.name) "check reinstall, confirm action, and remove package if reinstall"
if pkginfo.version == iversion and pkginfo.release == irelease: if installdb.is_installed(self.pkginfo.name): # is this a reinstallation?
(iversion, irelease) = installdb.get_version(self.pkginfo.name)
if self.pkginfo.version == iversion and self.pkginfo.release == irelease:
if not ui.confirm('Re-install same version package?'): if not ui.confirm('Re-install same version package?'):
raise InstallError('Package re-install declined') raise InstallError('Package re-install declined')
else: else:
upgrade = False upgrade = False
# is this an upgrade? # is this an upgrade?
# determine and report the kind of upgrade: version, release, build # determine and report the kind of upgrade: version, release, build
if pkginfo.version > iversion: if self.pkginfo.version > iversion:
ui.info('Upgrading to new upstream version') ui.info('Upgrading to new upstream version')
upgrade = True upgrade = True
elif pkginfo.release > irelease: elif self.pkginfo.release > irelease:
ui.info('Upgrading to new distribution release') ui.info('Upgrading to new distribution release')
upgrade = True upgrade = True
# is this a downgrade? confirm this action. # is this a downgrade? confirm this action.
if not upgrade: if not upgrade:
if pkginfo.version < iversion: if self.pkginfo.version < iversion:
x = 'Downgrade to old upstream version?' x = 'Downgrade to old upstream version?'
elif pkginfo.release < irelease: elif self.pkginfo.release < irelease:
x = 'Downgrade to old distribution release?' x = 'Downgrade to old distribution release?'
if not ui.confirm(x): if not ui.confirm(x):
raise InstallError('Package downgrade declined') raise InstallError('Package downgrade declined')
# remove old package then # remove old package then
operations.remove(pkginfo.name) operations.remove(self.pkginfo.name)
# unzip package in place def update_databases(self):
self.extractInstall() "update databases"
# store files.xml, metadata.xml and comar scripts for further usage
self.storePisiFiles()
# register comar scripts
self.registerCOMARScripts()
# update databases
# installdb # installdb
installdb.install(self.metadata.package.name, installdb.install(self.metadata.package.name,
self.metadata.package.version, self.metadata.package.version,
self.metadata.package.release, self.metadata.package.release)
os.path.join(self.package.pkg_dir(), 'files.xml'))
# installed packages
inst_packagedb.add_package(self.pkginfo)
+1 -9
View File
@@ -72,17 +72,12 @@ class InstallDB:
else: else:
return False return False
def install(self, pkg, version, release, files_xml): def install(self, pkg, version, release):
"""install package with specific version and release""" """install package with specific version and release"""
pkg = str(pkg) pkg = str(pkg)
if self.is_installed(pkg): if self.is_installed(pkg):
raise InstallDBError("already installed") raise InstallDBError("already installed")
self.d[pkg] = ('i', version, release) self.d[pkg] = ('i', version, release)
# files dosyasını config.lib_dir()+name+version+release+/files
# altına saklıyoruz zaten. bu yüzden bu işleme gerek
# yok. Paketin diğer dosyaları ile birlikte aynı dizin
# hiyerarşisi altında durması daha iyi...
# util.copy_file(files_xml, self.files_name(pkg, version, release))
def remove(self, pkg): def remove(self, pkg):
pkg = str(pkg) pkg = str(pkg)
@@ -93,9 +88,6 @@ class InstallDB:
pkg = str(pkg) pkg = str(pkg)
if self.d.has_key(pkg): if self.d.has_key(pkg):
(status, version, release) = self.d[pkg] (status, version, release) = self.d[pkg]
#f = self.files_name(pkg, version, release)
#if util.check_file(f):
# os.unlink(f)
del self.d[pkg] del self.d[pkg]
installdb = InstallDB() installdb = InstallDB()
+1 -4
View File
@@ -6,7 +6,6 @@ from ui import ui
from purl import PUrl from purl import PUrl
import util import util
# all package operation interfaces are here # all package operation interfaces are here
def remove(package_name): def remove(package_name):
@@ -59,9 +58,7 @@ def install(pkg):
def install_package(pkg_location): def install_package(pkg_location):
from install import Installer from install import Installer
Installer(pkg_location).install()
i = Installer(pkg_location)
i.install()
def info(package_name): def info(package_name):
+4 -3
View File
@@ -18,9 +18,9 @@ from bsddb import db
class PackageDB(object): class PackageDB(object):
"""PackageDB class provides an interface to the package database with """PackageDB class provides an interface to the package database with
a delegated dbshelve object""" a delegated dbshelve object"""
def __init__(self): def __init__(self, id):
util.check_dir(config.db_dir()) util.check_dir(config.db_dir())
filename = os.path.join(config.db_dir(), 'package.bdb') filename = os.path.join(config.db_dir(), 'package-' + id + '.bdb')
self.d = shelve.open(filename) self.d = shelve.open(filename)
self.fdummy = open(filename) self.fdummy = open(filename)
fcntl.flock(self.fdummy, fcntl.LOCK_EX) fcntl.flock(self.fdummy, fcntl.LOCK_EX)
@@ -48,5 +48,6 @@ class PackageDB(object):
name = str(name) name = str(name)
del self.d[name] del self.d[name]
packagedb = PackageDB() packagedb = PackageDB('repo')
inst_packagedb = PackageDB('local')
+34
View File
@@ -0,0 +1,34 @@
# Author: Eray Ozkural
class RepoDB(object):
"""RepoDB maps repo ids to distribution information"""
def __init__(self):
filename = os.path.join(config.db_dir(), 'repo.bdb')
self.d = shelve.open(filename)
self.fdummy = open(filename)
fcntl.flock(self.fdummy, fcntl.LOCK_EX)
def __del__(self):
#fcntl.flock(self.fdummy, fcntl.LOCK_UN)
self.fdummy.close()
def has_distro(self, name):
name = str(name)
return self.d.has_key(name)
def get_distro(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 clear(self):
self.d.clear()
def remove_repo(self, name):
name = str(name)
del self.d[name]
repodb = RepoDB()