Example #1
0
 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);
 }
Example #2
0
 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);
 }
Example #3
0
 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;
     }
 }
Example #4
0
 /**
  * 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);
             }
         }
     }
 }