summaryrefslogtreecommitdiff
path: root/BitInstaller.php
diff options
context:
space:
mode:
authorMax Kremmel <xing@synapse.plus.com>2008-10-26 11:04:59 +0000
committerMax Kremmel <xing@synapse.plus.com>2008-10-26 11:04:59 +0000
commit144ac2706c4687db67b473d3ef223bdc29401c0c (patch)
tree2c1b179975896f644f92c953fd7ec5d633e25e10 /BitInstaller.php
parentf92dab993226f176ab9aa2afe245c481083d39ef (diff)
downloadinstall-144ac2706c4687db67b473d3ef223bdc29401c0c.tar.gz
install-144ac2706c4687db67b473d3ef223bdc29401c0c.tar.bz2
install-144ac2706c4687db67b473d3ef223bdc29401c0c.zip
add some rudimentary dependency calculations. this simply checks if deps are met. i think this should do for the beginning.
Diffstat (limited to 'BitInstaller.php')
-rw-r--r--BitInstaller.php155
1 files changed, 132 insertions, 23 deletions
diff --git a/BitInstaller.php b/BitInstaller.php
index eaf2f69..06bbaaf 100644
--- a/BitInstaller.php
+++ b/BitInstaller.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Header: /cvsroot/bitweaver/_bit_install/BitInstaller.php,v 1.37 2008/10/25 09:49:45 squareing Exp $
+ * @version $Header: /cvsroot/bitweaver/_bit_install/BitInstaller.php,v 1.38 2008/10/26 11:04:59 squareing Exp $
* @package install
*/
@@ -21,16 +21,6 @@ class BitInstaller extends BitSystem {
}
/**
- * unloadUpgradeFiles Clear out upgrades hash
- *
- * @access public
- * @return void
- */
- function unloadUpgradeFiles() {
- $this->mPackageUpgrades = array();
- }
-
- /**
* loadUpgradeFiles This will load all files in the dir <pckage>/admin/upgrades/<version>.php with a version greater than the one installed
*
* @param array $pPackage
@@ -68,6 +58,7 @@ class BitInstaller extends BitSystem {
*/
function registerPackageUpgrade( $pParams, $pUpgradeHash = array() ) {
if( $this->verifyPackageUpgrade( $pParams )) {
+ $this->registerPackageVersion( $pParams['package'], $pParams['version'] );
$this->mPackageUpgrades[$pParams['package']][$pParams['version']] = $pParams;
$this->mPackageUpgrades[$pParams['package']][$pParams['version']]['upgrade'] = $pUpgradeHash;
// ensure all upgrades are in ascending order
@@ -119,24 +110,142 @@ class BitInstaller extends BitSystem {
* @return void
*/
function registerPackageDependencies( $pParams, $pDepHash ) {
- if( !empty( $pParams['package'] ) && !empty( $pParams['version'] ) && $this->validateVersion( $pParams['version'] ) && !empty( $pDepHash ) && is_array( $pDepHash )) {
- foreach( $pDepHash as $pkg => $version ) {
- if( $this->validateVersion( $version )) {
- $this->mPackageDependencies[$pParams['package']][$pParams['version']]['dependencies'] = $pDepHash;
+ if( !empty( $pParams['package'] ) && !empty( $pParams['version'] ) && $this->validateVersion( $pParams['version'] ) && $this->verifyPackageDependencies( $pDepHash )) {
+ $this->mPackageDependencies[$pParams['package']][$pParams['version']]['dependencies'] = $pDepHash;
+ }
+ }
+
+ /**
+ * verifyPackageDependencies
+ *
+ * @param array $pDepHash
+ * @access public
+ * @return TRUE on success, FALSE on failure - mErrors will contain reason for failure
+ */
+ function verifyPackageDependencies( &$pDepHash ) {
+ if( !empty( $pDepHash ) && is_array( $pDepHash )) {
+ foreach( $pDepHash as $pkg => $versions ) {
+ if( empty( $versions['min'] )) {
+ $this->mErrors['version_min'] = "You have to provide a minimum version number for the $pkg dependency.";
+ } elseif( !$this->validateVersion( $versions['min'] )) {
+ $this->mErrors['version_min'] = "Please make sure you use a valid minimum version number for the $pkg dependency.";
} else {
- vd( "Please make sure you use a valid version number." );
+ // maximum version number is not required
+ if( !empty( $versions['max'] ) && !$this->validateVersion( $versions['max'] )) {
+ $this->mErrors['version_max'] = "Please make sure you use a valid maximum version number for the $pkg dependency.";
+ }
+ }
+ }
+ } else {
+ $this->mErrors['deps'] = "If you want to register dependencies, please do so with a valid dependency hash.";
+ }
+
+ // since this should only show up when devs are working, we'll simply display the output:
+ if( !empty( $this->mErrors )) {
+ vd( $this->mErrors );
+ bt();
+ }
+
+ return( count( $this->mErrors ) == 0 );
+ }
+
+ /**
+ * getPackageDependencies
+ *
+ * @param array $pPackage
+ * @access public
+ * @return array of package dependencies
+ */
+ function getPackageDependencies( $pPackage ) {
+ $ret = array();
+ if( !empty( $pPackage )) {
+ $version = $this->getLatestUpgradeVersion( $pPackage );
+ if( !empty( $version ) && !empty( $this->mPackageDependencies[$pPackage][$version]['dependencies'] )) {
+ return $this->mPackageDependencies[$pPackage][$version]['dependencies'];
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * calculateDependencies will calculate all dependencies and return a hash of the results
+ *
+ * @access public
+ * @return array of calculated dependencies
+ */
+ function calculateDependencies() {
+ $ret = array();
+ // first we gather all version information.
+ foreach( array_keys( $this->mPackages ) as $package ) {
+ if( $this->isPackageActive( $package )) {
+
+ // get the latest upgrade version, since this is the version the package will be at after install
+ if( !$version = $this->getLatestUpgradeVersion( $package )) {
+ $version = $this->getVersion( $package );
+ }
+ $installed[$package] = $version;
+
+ if( $deps = $this->getPackageDependencies( $package )) {
+ $dependencies[$package] = $deps;
+ }
+ }
+ }
+
+ if( !empty( $dependencies )) {
+ foreach( $dependencies as $package => $deps ) {
+ foreach( $deps as $depPackage => $depVersion ) {
+ $hash = array(
+ 'package' => $package,
+ 'requires' => $depPackage,
+ 'version' => $depVersion,
+ );
+
+ if( !empty( $installed[$depPackage] )) {
+ $hash['version']['available'] = $installed[$depPackage];
+ }
+
+ if( empty( $installed[$depPackage] )) {
+ $hash['result'] = 'missing';
+ } elseif( version_compare( $depVersion['min'], $installed[$depPackage], '>' )) {
+ $hash['result'] = 'min_dep';
+ } elseif( !empty( $depVersion['max'] ) && version_compare( $depVersion['max'], $installed[$depPackage], '<' )) {
+ $hash['result'] = 'max_dep';
+ } else {
+ $hash['result'] = 'ok';
+ }
+
+ $ret[] = $hash;
}
}
}
+
+ return $ret;
}
- function verifyDependencies() {
- // anyone feel like it?
- // thoughts:
- // - get version of installed packages and merge them with the ones that are about to be installed
- // - check if all dependencies will be met at the end of the installation
- // - is there a need to specify in which order the installs need to be performed?
- return TRUE;
+ /**
+ * getLatestUpgradeVersion will fetch the greatest upgrade number for a given package
+ *
+ * @param array $pPackage package we want to fetch the latest version number for
+ * @access public
+ * @return string greatest upgrade number for a given package
+ */
+ function getLatestUpgradeVersion( $pPackage ) {
+ $ret = '0.0.0';
+ if( !empty( $pPackage )) {
+ $dir = constant( strtoupper( $pPackage )."_PKG_PATH" )."admin/upgrades/";
+ if( is_dir( $dir ) && $upDir = opendir( $dir )) {
+ while( FALSE !== ( $file = readdir( $upDir ))) {
+ if( is_file( $dir.$file )) {
+ $upVersion = str_replace( ".php", "", $file );
+ // we only want to update $ret if the version of the file is greater than the previous one
+ if( $this->validateVersion( $upVersion ) && version_compare( $ret, $upVersion, "<" )) {
+ $ret = $upVersion;
+ }
+ }
+ }
+ }
+ }
+ return(( $ret == '0.0.0' ) ? FALSE : $ret );
}
/**