dizin yapımız tamam.

InstallContext düzeltildi.
ödül olarak install.py class yapısı kazandı...
This commit is contained in:
Barış Metin
2005-07-16 20:45:29 +00:00
parent 1471651d3a
commit e892cc8c76
5 changed files with 150 additions and 142 deletions
+11 -10
View File
@@ -1,13 +1,14 @@
import sys
import pisi.install from pisi.install import PisiInstall
from pisi.ui import ui from pisi.context import InstallContext
from pisi.purl import PUrl
def install(packagefile): def install(packagefile):
try: url = PUrl(packagefile)
ui.info('* Installing ' + packagefile + '\n') if url.isRemoteFile():
pisi.install.install(packagefile) pass # bunu simdilik bosverelim, once bir calissin :)
except pisi.install.InstallError, e: else:
print '*** An installation error has occured:' ctx = InstallContext(url.uri)
print '\t', e
sys.exit(1) pi = PisiInstall(ctx)
pi.install()
-9
View File
@@ -42,15 +42,6 @@ class Config(object):
def install_dir(self): def install_dir(self):
return self.tmp_dir() + const.install_dir_suffix return self.tmp_dir() + const.install_dir_suffix
def files_xml_dir(self):
return self.destdir + const.files_xml_dir_suffix
def metadata_xml_dir(self):
return self.destdir + const.metadata_xml_dir_suffix
def comar_files_dir(self):
return self.destdir + const.comar_files_dir_suffix
__configinstance = configimpl() __configinstance = configimpl()
def __init__(self): def __init__(self):
+8 -3
View File
@@ -41,14 +41,19 @@ class Constants:
self.__c.db_dir_suffix = "/var/db/pisi" self.__c.db_dir_suffix = "/var/db/pisi"
self.__c.archives_dir_suffix = "/var/cache/pisi/archives" self.__c.archives_dir_suffix = "/var/cache/pisi/archives"
self.__c.tmp_dir_suffix = "/var/tmp/pisi" self.__c.tmp_dir_suffix = "/var/tmp/pisi"
self.__c.comar_files_dir_suffix = "/var/lib/pisi/comar"
self.__c.files_xml_dir_suffix = "/var/lib/pisi/files"
self.__c.metadata_xml_dir_suffix = "/var/lib/pisi/metadata"
# directory suffixes for build # directory suffixes for build
self.__c.work_dir_suffix = "/work" self.__c.work_dir_suffix = "/work"
self.__c.install_dir_suffix = "/install" self.__c.install_dir_suffix = "/install"
# directory suffixes for intall. We'll use these directories
# for storing files related to the packages. Each package will
# have its own directory under lib_dir with has these
# sub-directories.
self.__c.comar_dir_suffix = "/comar"
self.__c.files_dir_suffix = "/files"
self.__c.metadata_dir_suffix = "/metadata"
# file/directory names # file/directory names
self.__c.actions_file = "actions.py" self.__c.actions_file = "actions.py"
self.__c.files_dir = "files" self.__c.files_dir = "files"
+38 -13
View File
@@ -3,9 +3,12 @@
# Authors: Baris Metin <baris@uludag.org.tr # Authors: Baris Metin <baris@uludag.org.tr
# Eray Ozkural <eray@uludag.org.tr> # Eray Ozkural <eray@uludag.org.tr>
from specfile import SpecFile
from constants import const from constants import const
from config import Config from config import Config
from specfile import SpecFile
from package import Package
from metadata import MetaData
from files import Files
class BuildContext(object): class BuildContext(object):
"""Build Context Singleton""" """Build Context Singleton"""
@@ -59,34 +62,56 @@ class InstallContext(object):
def __init(self): def __init(self):
super(ctximpl, self).__init__() super(ctximpl, self).__init__()
def setMetadataFile(self, metadatafile): def setPackage(self, packagefile):
self.metadatafile = metadatafile self.packagefile = packagefile
self.package = Package(packagefile, 'r')
tmpdir = self.tmp_dir()
# extract control files
self.package.extract_PISI_files(tmpdir)
# read files.xml and metadata.xml
mdxml = tmpdir + '/' + const.metadata_xml
self.setMetadataXML(mdxml)
filesxml = tmpdir + '/' + const.files_xml
self.setFilesXML(filesxml)
def setMetadataXML(self, metadataxml):
self.metadataxml = metadataxml
metadata = MetaData() metadata = MetaData()
metadata.read(metadatafile) metadata.read(metadataxml)
metadata.verify() if not metadata.verify():
raise InstallError("MetaData format wrong")
self.metadata = metadata self.metadata = metadata
def setFilesXML(self, filesxml):
self.filesxml = filesxml
files = Files()
files.read(filesxml)
self.files = files
def pkg_dir(self): def pkg_dir(self):
packageDir = self.metadata.package.name + '-' \ packageDir = self.metadata.package.name + '-' \
+ self.metadata.package.version + '-' + self.metadata.package.release + self.metadata.package.version + '-' \
+ self.metadata.package.release
return self.destdir + config.lib_dir() \ return self.lib_dir() + '/' + packageDir
+ '/' + packageDir
def files_dir(self): def files_dir(self):
return self.pkg_dir() + const.files_xml_dir_suffix return self.pkg_dir() + const.files_dir_suffix
def metadata_dir(self): def metadata_dir(self):
return self.pkg_dir() + const.metadata_xml_dir_suffix return self.pkg_dir() + const.metadata_dir_suffix
def comar_dir(self): def comar_dir(self):
return self.pkg_dir() + const.comar_files_dir_suffix return self.pkg_dir() + const.comar_dir_suffix
__instance = ctximpl() # singleton implementation __instance = ctximpl() # singleton implementation
def __init__(self, mdfile): def __init__(self, packagefile):
self.__instance.setMetadataFile(mdfile) self.__instance.setPackage(packagefile)
def __getattr__(self, attr): def __getattr__(self, attr):
return getattr(self.__instance, attr) return getattr(self.__instance, attr)
+99 -113
View File
@@ -26,42 +26,8 @@ import comariface
class InstallError(Exception): class InstallError(Exception):
pass pass
from os.path import join, exists # bu fonksiyonun burada işi olmamalı. Silmeyi doğrudan install.py'nin
# içinde yapmamalıyız!
def get_pkg_info(package_fn):
package = Package(package_fn, 'r')
# extract control files
util.clean_dir(config.install_dir())
package.extract_PISI_files(config.install_dir())
# verify package
# check if we have all required files
if not exists(join(config.install_dir(), 'metadata.xml')):
raise InstallError('metadata.xml missing')
if not exists(join(config.install_dir(), 'files.xml')):
raise InstallError('files.xml missing')
metadata = MetaData()
metadata.read(join(config.install_dir(), 'metadata.xml'))
files = Files()
files.read(join(config.install_dir(), 'files.xml'))
return metadata, files
def extract_pkg_files(package_fn):
package = Package(package_fn, 'r')
ui.info('Extracting files\n')
package.extract_dir_flat('install', config.destdir)
def copy_from_pkg(package_fn, file, dest):
package = Package(package_fn, 'r')
ui.info('Coping file %s to %s\n' %(file, dest))
package.extract_file(file, dest)
def remove(package_name): def remove(package_name):
"""Remove a goddamn package""" """Remove a goddamn package"""
ui.info('Removing package ' + package_name) ui.info('Removing package ' + package_name)
@@ -72,91 +38,111 @@ def remove(package_name):
os.unlink(fileinfo.path) os.unlink(fileinfo.path)
installdb.remove(package_name) installdb.remove(package_name)
def install(package_fn):
metadata, files = get_pkg_info(package_fn) class PisiInstall:
"PisiInstall class, provides install rutines for pisi packages"
def __init__(self, installcontext):
self.ctx = installcontext
self.metadata = self.ctx.metadata
self.files = self.ctx.files
self.package = self.ctx.package
# check package semantics def extractInstall(self):
if not metadata.verify(): ui.info('Extracting files\n')
raise InstallError("MetaData format wrong") self.package.extract_dir_flat('install', config.destdir)
# check file system requirements def storePisiFiles(self):
# what to do if / is split into /usr, /var, etc.? # put files.xml, metadata.xml, actions.py and COMAR scripts
# somewhere in the file system. We'll need these in future...
package = metadata.package ui.info('Storing %s\n' % const.files_xml)
self.package.extract_file(const.files_xml, self.ctx.files_dir())
# check if package is in database ui.info('Storing %s\n' % const.metadata_xml)
if not packagedb.has_package(package.name): self.package.extract_file(const.metadata_xml, self.ctx.metadata_dir())
packagedb.add_package(package) # terrible solution it seems
# check conflicts for pcomar in self.metadata.package.providesComar:
for pkg in metadata.package.conflicts: fpath = os.path.join(const.comar_dir, pcomar.script)
if installdb.has_package(package): # comar prefix is added to the pkg_dir while extracting comar
raise InstallError("Package conflicts " + pkg) # script file. so we'll use pkg_dir as destination.
ui.info('Storing %s\n' % fpath)
self.package.extract_file(fpath, self.ctx.pkg_dir())
# check dependencies def registerCOMARScripts(self):
if not dependency.installable(package.name): # register COMAR scripts
raise InstallError("Package not installable") for pcomar in self.metadata.package.providesComar:
scriptPath = os.path.join(self.ctx.comar_dir(),pcomar.script)
#TODO: ui.info("Registering COMAR script %s\n" % pcomar.script)
if installdb.is_installed(package.name): # is this a reinstallation? ret = comariface.registerScript(pcomar.om,
self.metadata.package.name,
(iversion, irelease) = installdb.get_version(package.name) scriptPath)
if not ret:
if package.version == iversion and package.release == irelease: ui.error("registerScript failed. Be sure that comard is running!\n")
if not ui.confirm('Re-install same version package?'):
raise InstallError('Package re-install declined')
upgrade = False
# is this an upgrade?
# determine and report the kind of upgrade: version, release, build
if package.version > iversion:
ui.info('Upgrading to new upstream version')
upgrade = True
elif package.release > irelease:
ui.info('Upgrading to new distribution release')
upgrade = True
# is this a downgrade? confirm this action.
if not upgrade:
if package.version < iversion:
x = 'Downgrade to old upstream version?'
elif package.release < irelease:
x = 'Downgrade to old distribution release?'
if not ui.confirm(x):
raise InstallError('Package downgrade declined')
# remove old package then
remove(package.name)
# unzip package in place
extract_pkg_files(package_fn)
# put files.xml, metadata.xml, actions.py and COMAR scripts
# somewhere in the file system. We'll need these in future...
copy_from_pkg(package_fn, const.files_xml , config.files_xml_dir())
copy_from_pkg(package_fn, const.metadata_xml , config.metadata_xml_dir())
for pcomar in package.providesComar:
fpath = os.path.join(const.comar_dir, pcomar.script)
# comar prefix is added to the libdir while extracting comar
# script file. so we'll use lib_dir as destination.
copy_from_pkg(package_fn, fpath, config.lib_dir())
# register COMAR scripts def install(self):
for pcomar in package.providesComar:
scriptPath = config.comar_files_dir() + pcomar.script
ui.info("Registering COMAR script %s\n" % pcomar.script)
ret = comariface.registerScript(pcomar.om,
package.name,
scriptPath)
if not ret:
ui.error("Unable to register COMAR script. Be sure that comard is running!\n")
# update databases # check file system requirements
# what to do if / is split into /usr, /var, etc.?
# installdb pkginfo = self.metadata.package
installdb.install(metadata.package.name,
metadata.package.version, # check if package is in database
metadata.package.release, if not packagedb.has_package(pkginfo.name):
os.path.join(config.install_dir(), 'files.xml')) packagedb.add_package(pkginfo) # terrible solution it seems
# check conflicts
for pkg in self.metadata.package.conflicts:
if installdb.has_package(pkginfo):
raise InstallError("Package conflicts " + pkg)
# check dependencies
if not dependency.installable(pkginfo.name):
raise InstallError("Package not installable")
#TODO:
if installdb.is_installed(pkginfo.name): # is this a reinstallation?
(iversion, irelease) = installdb.get_version(pkginfo.name)
if pkginfo.version == iversion and pkginfo.release == irelease:
if not ui.confirm('Re-install same version package?'):
raise InstallError('Package re-install declined')
upgrade = False
# is this an upgrade?
# determine and report the kind of upgrade: version, release, build
if pkginfo.version > iversion:
ui.info('Upgrading to new upstream version')
upgrade = True
elif pkginfo.release > irelease:
ui.info('Upgrading to new distribution release')
upgrade = True
# is this a downgrade? confirm this action.
if not upgrade:
if pkginfo.version < iversion:
x = 'Downgrade to old upstream version?'
elif pkginfo.release < irelease:
x = 'Downgrade to old distribution release?'
if not ui.confirm(x):
raise InstallError('Package downgrade declined')
# remove old package then
remove(pkginfo.name)
# unzip package in place
self.extractInstall()
# store files.xml, metadata.xml and comar scripts for further usage
self.storePisiFiles()
# register comar scripts
self.registerCOMARScripts()
# update databases
# installdb
installdb.install(self.metadata.package.name,
self.metadata.package.version,
self.metadata.package.release,
os.path.join(self.ctx.files_dir(), 'files.xml'))