public static function getDisplayList() { $packageList = Package_Catalog::getPackageList(); $avaliablePackages = array('Upgrade Avaliable' => array(), 'Installed' => array(), 'Uninstalled' => array()); foreach ($packageList as $name => $avaliable) { if (isset($avaliable[self::STATUS_INSTALLED])) { $packages = $avaliable[self::STATUS_INSTALLED]; $package = reset($packages); if (!empty($package['upgrades'])) { $avaliablePackages['Upgrade Avaliable'][$name] = $package; } else { $avaliablePackages['Installed'][$name] = $package; } continue; } $newestPackage = array(); foreach ($avaliable as $status => $packages) { foreach ($packages as $key => $package) { if (empty($newestPackage['version'])) { $newestPackage = $package; continue; } if (Package_Dependency::compareVersion($package['version'], $newestPackage['version'])) { $newestPackage = $package; } } } if (!empty($newestPackage)) { $avaliablePackages['Uninstalled'][$name] = $newestPackage; } } return $avaliablePackages; }
public function exec($identifier) { self::verify($identifier); self::runCheckMethods($identifier); Package_Dependency::validateIntegration($identifier); }
protected static function findAvaliableMigrations() { foreach (self::$packageList as $name => $packages) { if (empty($packages[Package_Manager::STATUS_INSTALLED])) { continue; } $installedIdentifier = key($packages[Package_Manager::STATUS_INSTALLED]); $installedPackage =& $packages[Package_Manager::STATUS_INSTALLED][$installedIdentifier]; foreach ($packages as $status => $avaliable) { if ($status == Package_Manager::STATUS_INSTALLED) { continue; } foreach ($avaliable as $identifier => $package) { if (Package_Dependency::compareVersion($package['version'], $installedPackage['version'])) { $installedPackage['upgrades'][$package['version']] = $identifier; } else { $installedPackage['downgrades'][$package['version']] = $identifier; } } } if (!empty($installedPackage['upgrades'])) { uksort($installedPackage['upgrades'], array('Package_Dependency', 'compareVersion')); $installedPackage['upgrades'] = array_reverse($installedPackage['upgrades']); } if (!empty($installedPackage['downgrades'])) { uksort($installedPackage['downgrades'], array('Package_Dependency', 'compareVersion')); $installedPackage['downgrades'] = array_reverse($installedPackage['downgrades']); } } }
/** * Perform a migration of this module. * * Make sure you rollback any changes if your migration fails! * * By default, the migrate routine just runs the migrations in Doctrine for your models, based on the version of * this module and the version registered in the database. * If that's all you need for your migrations, you don't need to override this function. * All models in the directory of your module will be migrated. * * You do not need to override this class if you are not adding additional functionality to it. * * @return array | NULL Array of failures, or NULL if everything is OK */ public function migrate($identifier) { $package = Package_Catalog::getPackageByIdentifier($identifier); if (!empty($package['models'])) { $loadedModels = Doctrine::loadModels($package['directory'] . '/models', Doctrine::MODEL_LOADING_CONSERVATIVE); } if (empty($loadedModels)) { return; } $installed = Package_Catalog::getInstalledPackage($package['packageName']); if (Package_Dependency::compareVersion($package['version'], $installed['version'])) { kohana::log('debug', 'Attempting to upgrade package ' . $installed['packageName'] . ' version ' . $installed['version'] . ' to ' . $package['version']); foreach ($loadedModels as $modelName) { if (get_parent_class($modelName) != 'Bluebox_Record' and get_parent_class($modelName) != 'Doctrine_Record') { continue; } $migrationDirectory = $package['directory'] . '/migrations/' . $modelName; kohana::log('debug', 'Looking for migrations in `' . $migrationDirectory . '`'); if (is_dir($migrationDirectory)) { try { $migration = new Bluebox_Migration($migrationDirectory, NULL, strtolower($modelName)); kohana::log('debug', 'Running migration on ' . $modelName . ' from model version ' . $migration->getCurrentVersion() . ' to ' . $migration->getLatestVersion()); $migration->migrate(); $msg = inflector::humanizeModelName($modelName); $msg .= ' database table upgraded to model version # ' . $migration->getCurrentVersion(); Package_Message::set($msg, 'info', $identifier); } catch (Exception $e) { kohana::log('alert', 'Alerts during migration, this can USUALLY be ignored: ' . $e->getMessage()); // TODO: This isnt a great idea, but migrations are so noisy with needless failures... PITA $migration->setCurrentVersion($migration->getLatestVersion()); foreach ($migration->getErrors() as $error) { if (strstr($error->getMessage(), 'Already at version')) { $msg = inflector::humanizeModelName($modelName); $msg .= ' database table ' . inflector::lcfirst($error->getMessage()); Package_Message::set($msg, 'info', $identifier); } else { Package_Message::set($error->getMessage(), 'alert', $identifier); } } } } else { $migration = new Bluebox_Migration(NULL, NULL, strtolower($modelName)); $migration->setCurrentVersion(0); } } } else { kohana::log('debug', 'Attempting to downgrade package ' . $installed['packageName'] . ' version ' . $installed['version'] . ' to ' . $package['version']); foreach ($loadedModels as $modelName) { if (get_parent_class($modelName) != 'Bluebox_Record' and get_parent_class($modelName) != 'Doctrine_Record') { continue; } $migrationDirectory = $installed['directory'] . '/migrations/' . $modelName; kohana::log('debug', 'Looking for migrations in `' . $migrationDirectory . '`'); if (is_dir($migrationDirectory)) { try { $modelVersion = 0; if (is_dir($package['directory'] . '/migrations/' . $modelName)) { $previousMigration = new Doctrine_Migration($package['directory'] . '/migrations/' . $modelName); $modelVersion = $previousMigration->getLatestVersion(); } kohana::log('debug', 'Determined that ' . $package['packageName'] . ' version ' . $package['version'] . ' works against ' . $modelName . ' version ' . $modelVersion); $migration = new Bluebox_Migration($migrationDirectory, NULL, strtolower($modelName)); kohana::log('debug', 'Running migration on ' . $modelName . ' from model version ' . $migration->getCurrentVersion() . ' to ' . $modelVersion); $migration->migrate($modelVersion); $msg = inflector::humanizeModelName($modelName); $msg .= ' database table downgraded to model version # ' . $migration->getCurrentVersion(); Package_Message::set($msg, 'info', $identifier); } catch (Exception $e) { kohana::log('alert', 'Alerts during migration, this can USUALLY be ignored: ' . $e->getMessage()); // TODO: This isnt a great idea, but migrations are so noisy with needless failures... PITA $migration->setCurrentVersion($migration->getLatestVersion()); foreach ($migration->getErrors() as $error) { if (strstr($error->getMessage(), 'Already at version')) { $msg = inflector::humanizeModelName($modelName); $msg .= ' database table ' . inflector::lcfirst($error->getMessage()); Package_Message::set($msg, 'info', $identifier); } else { Package_Message::set($error->getMessage(), 'alert', $identifier); } } } } else { $migration = new Bluebox_Migration(NULL, NULL, strtolower($modelName)); $migration->setCurrentVersion(0); } } } }
public function validate($identifier) { $package = Package_Catalog::getPackageByIdentifier($identifier); Package_Dependency::validateAbandon($identifier); }