From 60a4b83cb241dba108e1cf746b01f7fb1c6a2ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Mon, 11 Jul 2005 01:07:17 +0000 Subject: [PATCH] * installdb files'i guzel dondursun * eger yeniden kurumsa, eski paketi once remove edelim, aha! * upgrade mi downgrade mi info'lar confirm'ler cabasi * dunyanin en dandik installation seysi degil artik :) ama daha calismadi --- pisi/install.py | 52 +++++++++++++++++++++++++++++++++++++++++++---- pisi/installdb.py | 5 ++++- pisi/version.py | 1 + 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/pisi/install.py b/pisi/install.py index 1995a5d7..a15b4623 100644 --- a/pisi/install.py +++ b/pisi/install.py @@ -48,6 +48,17 @@ def get_pkg_info(package_fn): return metadata, files + +def remove(package_name): + """Remove a goddamn package""" + ui.info('Removing package ' + package_name) + if not installdb.is_installed(package_name): + raise InstallError('Trying to remove nonexistent package ' + + package_name) + for fileinfo in installdb.files(package_name): + os.unlink(fileinfo.path) + installdb.remove(package_name) + def install(package_fn): metadata, files = get_pkg_info(package_fn) @@ -59,19 +70,52 @@ def install(package_fn): # check file system requirements # what to do if / is split into /usr, /var, etc.? + package = metadata.package + # check if package is in database - if not packagedb.has_package(metadata.package.name): - packagedb.add_package(metadata.package) # terrible solution it seems + if not packagedb.has_package(package.name): + packagedb.add_package(package) # terrible solution it seems # check conflicts for pkg in metadata.package.conflicts: - if installdb.has_package(pkg): + if installdb.has_package(package): raise InstallError("Package conflicts " + pkg) # check dependencies - if not dependency.installable(metadata.package.name): + if not dependency.installable(package.name): raise InstallError("Package not installable") + #TODO: + if installdb.is_installed(package.name): # is this a reinstallation? + + (iversion, irelease) = installdb.get_version(package.name) + + 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 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 ui.info('Extracting files\n') package.extract_dir_flat('install', config.destdir) diff --git a/pisi/installdb.py b/pisi/installdb.py index 8681f0a5..bf713da6 100644 --- a/pisi/installdb.py +++ b/pisi/installdb.py @@ -7,6 +7,7 @@ import os, fcntl import bsddb.dbshelve as shelve from config import config +from files import Files import util class InstallDBError(Exception): @@ -33,7 +34,9 @@ class InstallDB: def files(self, pkg): pkg = str(pkg) (status, version, release) = self.d[pkg] - return file(self.files_name(pkg,version,release)) + files = Files() + files.read(self.files_name(pkg,version,release)) + return files def is_recorded(self, pkg): pkg = str(pkg) diff --git a/pisi/version.py b/pisi/version.py index e7518583..e7d64035 100644 --- a/pisi/version.py +++ b/pisi/version.py @@ -29,3 +29,4 @@ class Version: def ge(self,rhs): return self.pred(rhs, lambda x,y: x>=y) +