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.ui import ui
from pisi.install import PisiInstall
from pisi.context import InstallContext
from pisi.purl import PUrl
def install(packagefile):
try:
ui.info('* Installing ' + packagefile + '\n')
pisi.install.install(packagefile)
except pisi.install.InstallError, e:
print '*** An installation error has occured:'
print '\t', e
sys.exit(1)
url = PUrl(packagefile)
if url.isRemoteFile():
pass # bunu simdilik bosverelim, once bir calissin :)
else:
ctx = InstallContext(url.uri)
pi = PisiInstall(ctx)
pi.install()
-9
View File
@@ -42,15 +42,6 @@ class Config(object):
def install_dir(self):
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()
def __init__(self):
+8 -3
View File
@@ -41,14 +41,19 @@ class Constants:
self.__c.db_dir_suffix = "/var/db/pisi"
self.__c.archives_dir_suffix = "/var/cache/pisi/archives"
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
self.__c.work_dir_suffix = "/work"
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
self.__c.actions_file = "actions.py"
self.__c.files_dir = "files"
+38 -13
View File
@@ -3,9 +3,12 @@
# Authors: Baris Metin <baris@uludag.org.tr
# Eray Ozkural <eray@uludag.org.tr>
from specfile import SpecFile
from constants import const
from config import Config
from specfile import SpecFile
from package import Package
from metadata import MetaData
from files import Files
class BuildContext(object):
"""Build Context Singleton"""
@@ -59,34 +62,56 @@ class InstallContext(object):
def __init(self):
super(ctximpl, self).__init__()
def setMetadataFile(self, metadatafile):
self.metadatafile = metadatafile
def setPackage(self, packagefile):
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.read(metadatafile)
metadata.verify()
metadata.read(metadataxml)
if not metadata.verify():
raise InstallError("MetaData format wrong")
self.metadata = metadata
def setFilesXML(self, filesxml):
self.filesxml = filesxml
files = Files()
files.read(filesxml)
self.files = files
def pkg_dir(self):
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() \
+ '/' + packageDir
return self.lib_dir() + '/' + packageDir
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):
return self.pkg_dir() + const.metadata_xml_dir_suffix
return self.pkg_dir() + const.metadata_dir_suffix
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
def __init__(self, mdfile):
self.__instance.setMetadataFile(mdfile)
def __init__(self, packagefile):
self.__instance.setPackage(packagefile)
def __getattr__(self, attr):
return getattr(self.__instance, attr)
+93 -107
View File
@@ -26,42 +26,8 @@ import comariface
class InstallError(Exception):
pass
from os.path import join, exists
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)
# bu fonksiyonun burada işi olmamalı. Silmeyi doğrudan install.py'nin
# içinde yapmamalıyız!
def remove(package_name):
"""Remove a goddamn package"""
ui.info('Removing package ' + package_name)
@@ -72,91 +38,111 @@ def remove(package_name):
os.unlink(fileinfo.path)
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
def extractInstall(self):
ui.info('Extracting files\n')
self.package.extract_dir_flat('install', config.destdir)
# check package semantics
if not metadata.verify():
raise InstallError("MetaData format wrong")
def storePisiFiles(self):
# put files.xml, metadata.xml, actions.py and COMAR scripts
# somewhere in the file system. We'll need these in future...
# check file system requirements
# what to do if / is split into /usr, /var, etc.?
ui.info('Storing %s\n' % const.files_xml)
self.package.extract_file(const.files_xml, self.ctx.files_dir())
package = metadata.package
ui.info('Storing %s\n' % const.metadata_xml)
self.package.extract_file(const.metadata_xml, self.ctx.metadata_dir())
# check if package is in database
if not packagedb.has_package(package.name):
packagedb.add_package(package) # terrible solution it seems
for pcomar in self.metadata.package.providesComar:
fpath = os.path.join(const.comar_dir, pcomar.script)
# comar prefix is added to the pkg_dir while extracting comar
# 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())
def registerCOMARScripts(self):
# register COMAR scripts
for pcomar in self.metadata.package.providesComar:
scriptPath = os.path.join(self.ctx.comar_dir(),pcomar.script)
ui.info("Registering COMAR script %s\n" % pcomar.script)
ret = comariface.registerScript(pcomar.om,
self.metadata.package.name,
scriptPath)
if not ret:
ui.error("registerScript failed. Be sure that comard is running!\n")
def install(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
if not packagedb.has_package(pkginfo.name):
packagedb.add_package(pkginfo) # terrible solution it seems
# check conflicts
for pkg in metadata.package.conflicts:
if installdb.has_package(package):
raise InstallError("Package conflicts " + pkg)
# 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(package.name):
raise InstallError("Package not installable")
# check dependencies
if not dependency.installable(pkginfo.name):
raise InstallError("Package not installable")
#TODO:
if installdb.is_installed(package.name): # is this a reinstallation?
#TODO:
if installdb.is_installed(pkginfo.name): # is this a reinstallation?
(iversion, irelease) = installdb.get_version(pkginfo.name)
(iversion, irelease) = installdb.get_version(package.name)
if pkginfo.version == iversion and pkginfo.release == irelease:
if not ui.confirm('Re-install same version package?'):
raise InstallError('Package re-install declined')
if package.version == iversion and package.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
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 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')
# 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(pkginfo.name)
# remove old package then
remove(package.name)
# unzip package in place
self.extractInstall()
# unzip package in place
extract_pkg_files(package_fn)
# store files.xml, metadata.xml and comar scripts for further usage
self.storePisiFiles()
# 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
self.registerCOMARScripts()
# register COMAR scripts
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
# update databases
# installdb
installdb.install(metadata.package.name,
metadata.package.version,
metadata.package.release,
os.path.join(config.install_dir(), 'files.xml'))
# installdb
installdb.install(self.metadata.package.name,
self.metadata.package.version,
self.metadata.package.release,
os.path.join(self.ctx.files_dir(), 'files.xml'))