public function __construct($message = null, $code = 0, Exception $previous = null) { if ($code == 0) { Package_Message::set($message, 'error', 'package'); } else { Package_Message::set($message, 'error', $code); } parent::__construct($message); }
public static function checkTransaction($name, $operation = NULL) { $transaction = self::$instance->transaction; if (is_null($operation)) { $operation = Package_Manager::OPERATION_INSTALL; } if (empty($transaction[$operation])) { Package_Message::set('No packages queued for operation ' . $operation); throw new Package_Transaction_Exception('No packages queued for operation ' . $operation); } foreach ($transaction[$operation] as $identifier) { $package = Package_Catalog::getPackageByIdentifier($identifier); if ($package['packageName'] == $name) { return $package; } } throw new Package_Transaction_Exception('Transcation does not contain requested package ' . $name); }
public static function validateAbandon($identifier) { $package = Package_Catalog::getPackageByIdentifier($identifier); if (!empty($package['denyRemoval'])) { Package_Message::log('debug', 'denyRemoval flag set on package ' . $package['packageName']); Package_Message::set($package['displayName'] . ' is not eligible for removal', 'error', $identifier); throw new Package_Dependency_Exception('Package is not eligible for removal'); } $dependents = self::listDependents($package['packageName']); $failures = array(); foreach ($dependents as $dependent) { if ($dependentPackage = Package_Catalog::getInstalledPackage($dependent)) { Package_Message::log('debug', 'dependency restriction ' . $package['packageName'] . ' is being used by ' . $dependent . ' version ' . $dependentPackage['version']); Package_Message::set($package['displayName'] . ' is being used by ' . $dependentPackage['displayName'] . ' version ' . $dependentPackage['version'], 'error', $identifier); Package_Message::set($dependentPackage['displayName'] . ' is using ' . $package['displayName'], 'alert', $dependentPackage['identifier']); $failures['indispensable'][$dependent] = $dependentPackage['version']; } } if (!empty($failures)) { $dependencyException = new Package_Dependency_Exception('Package did not pass dependency validation'); $dependencyException->loadFailures($failures); throw $dependencyException; } }
/** * 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); } } } }