Exemple #1
0
 function testEquality()
 {
     $compare = array(array("1.2.3", "v1.2.3"), array("1.2.3", "=1.2.3"), array("1.2.3", "v 1.2.3"), array("1.2.3", "= 1.2.3"), array("1.2.3", " v1.2.3"), array("1.2.3", " =1.2.3"), array("1.2.3", " v 1.2.3"), array("1.2.3", " = 1.2.3"), array("1.2.3-0", "v1.2.3-0"), array("1.2.3-0", "=1.2.3-0"), array("1.2.3-0", "v 1.2.3-0"), array("1.2.3-0", "= 1.2.3-0"), array("1.2.3-0", " v1.2.3-0"), array("1.2.3-0", " =1.2.3-0"), array("1.2.3-0", " v 1.2.3-0"), array("1.2.3-0", " = 1.2.3-0"), array("1.2.3-01", "v1.2.3-1"), array("1.2.3-01", "=1.2.3-1"), array("1.2.3-01", "v 1.2.3-1"), array("1.2.3-01", "= 1.2.3-1"), array("1.2.3-01", " v1.2.3-1"), array("1.2.3-01", " =1.2.3-1"), array("1.2.3-01", " v 1.2.3-1"), array("1.2.3-01", " = 1.2.3-1"), array("1.2.3beta", "v1.2.3beta"), array("1.2.3beta", "=1.2.3beta"), array("1.2.3beta", "v 1.2.3beta"), array("1.2.3beta", "= 1.2.3beta"), array("1.2.3beta", " v1.2.3beta"), array("1.2.3beta", " =1.2.3beta"), array("1.2.3beta", " v 1.2.3beta"), array("1.2.3beta", " = 1.2.3beta"));
     foreach ($compare as $set) {
         $a = $set[0];
         $b = $set[1];
         $this->assertTrue(SemVer\version::eq($a, $b), "%s > eq('" . $a . "', '" . $b . "')");
         $this->assertFalse(SemVer\version::neq($a, $b), "%s > !neq('" . $a . "', '" . $b . "')");
         $this->assertTrue(SemVer\version::cmp($a, "==", $b), "%s > cmp(" . $a . "==" . $b . ")");
         $this->assertFalse(SemVer\version::cmp($a, "!=", $b), "%s > !cmp(" . $a . "!=" . $b . ")");
         $this->assertFalse(SemVer\version::cmp($a, "===", $b), "%s > !cmp(" . $a . "===" . $b . ")");
         $this->assertTrue(SemVer\version::cmp($a, "!==", $b), "%s > cmp(" . $a . "!==" . $b . ")");
         $this->assertFalse(SemVer\version::gt($a, $b), "%s > !gt('" . $a . "', '" . $b . "')");
         $this->assertTrue(SemVer\version::gte($a, $b), "%s > gte('" . $a . "', '" . $b . "')");
         $this->assertFalse(SemVer\version::lt($a, $b), "%s > !lt('" . $a . "', '" . $b . "')");
         $this->assertTrue(SemVer\version::lte($a, $b), "%s > lte('" . $a . "', '" . $b . "')");
     }
 }
 /**
  * @param $currentVersion
  *
  * @return array|bool
  */
 public function getReleaseToUpgradeTo($currentVersion)
 {
     $currentVersion = new version($currentVersion);
     $releases = $this->getAllReleases();
     $releases = $this->filterPreReleasesAndDrafts($releases);
     $releases = $this->filterReleasesWithoutZipAsset($releases);
     if (count($releases) == 0) {
         return false;
     }
     // Sort by highest / biggest release first.
     usort($releases, function ($a, $b) {
         return version::rcompare($a['tag_name'], $b['tag_name']);
     });
     // Now we need to check whether we already installed the biggest available patch update.
     // I.e. if C1.C2.C3 is the currently installed version, check if there is a version C1.C2.X where X
     // is bigger than C3. If so, always update to this version first, regardless of higher available
     // versions.
     $highestPatchRelease = $this->getHighestPatchRelease($currentVersion, $releases);
     if ($highestPatchRelease === false) {
         // Somehow not even the currently installed version could be found in the GitHub releases.
         return false;
     }
     if (!version::eq($this->getVersionFromRelease($highestPatchRelease), $currentVersion)) {
         // The currently installed version is not equal to the highest patch version.
         // So upgrade to this one first.
         return $highestPatchRelease;
     }
     // If we reach this point, we already have the highest patch version installed.
     // Search for the highest C1.(C2+1).X version then.
     $highestPatchReleaseOfNextMinorVersion = $this->getHighestPatchReleaseOfNextMinorVersion($currentVersion, $releases);
     if ($highestPatchReleaseOfNextMinorVersion === false) {
         // No new version available apparently.
         return false;
     }
     return $highestPatchReleaseOfNextMinorVersion;
 }
Exemple #3
0
 protected function doExecute(InputInterface $input, OutputInterface $output)
 {
     $interactive = !$input->getOption('yes');
     $dialog = $this->getHelperSet()->get('dialog');
     if (!$this->container['phraseanet.configuration']->isSetup()) {
         throw new RuntimeException(sprintf('Phraseanet is not setup. You can run <info>bin/setup system::install</info> command to install Phraseanet.'));
     }
     // get dbs
     $conf = $this->container['phraseanet.configuration']->getConfig();
     $dbs = array('ab' => $conf['main']['database']['dbname'], 'dbs' => array(), 'setup_dbs' => array());
     foreach ($this->container->getDataboxes() as $databox) {
         $dbs['dbs'][] = $databox;
     }
     if (count($dbs['dbs']) > 1) {
         if ($input->getOption('db-name')) {
             $dbName = $input->getOption('db-name');
         } else {
             $dialog = $this->getHelperSet()->get('dialog');
             $dbName = $dialog->ask($output, _('Please enter the databox name to reset or create'));
         }
     } else {
         if ($input->getOption('db-name')) {
             $dbName = $input->getOption('db-name');
         } else {
             $dbName = current($dbs['dbs'])->get_dbname();
         }
     }
     $continue = 'y';
     if (count($dbs['dbs']) > 1 && in_array($dbName, array_map(function ($db) {
         return $db->get_dbname();
     }, $dbs['dbs']))) {
         if ($interactive) {
             do {
                 $continue = mb_strtolower($dialog->ask($output, '<question>' . $dbName . ' database is going to be truncated, do you want to continue ? (Y/n)</question>', 'Y'));
             } while (!in_array($continue, array('y', 'n')));
         }
     }
     if ('y' !== $continue) {
         return;
     }
     $unmountedDbs = $dbToMount = array_diff(array_map(function ($db) {
         return $db->get_dbname();
     }, $dbs['dbs']), array($dbName));
     if (count($unmountedDbs) > 1 && $interactive) {
         array_unshift($unmountedDbs, 'all');
         $selected = $dialog->select($output, 'Choose Dbs to mount', $unmountedDbs, 0, false, 'Invalid choice', true);
         $dbToMount = array_map(function ($c) use($unmountedDbs) {
             return $unmountedDbs[$c];
         }, $selected);
     }
     if ($input->getOption('dependencies') || !SemVer::eq($this->container->getApplicationBox()->get_version(), $this->container['phraseanet.version']->getNumber())) {
         $this->getApplication()->find('dependencies:all')->run(new ArrayInput(array('command' => 'dependencies:all')), $output);
     }
     // get data paths
     $dataPath = $this->container['conf']->get(['main', 'storage', 'subdefs'], $this->container['root.path'] . '/datas');
     $schema = $this->container['orm.em']->getConnection()->getSchemaManager();
     $output->writeln('Creating database "' . $dbs['ab'] . '"...<info>OK</info>');
     $schema->dropAndCreateDatabase($dbs['ab']);
     $output->writeln('Creating database "' . $dbName . '"...<info>OK</info>');
     $schema->dropAndCreateDatabase($dbName);
     // inject v3.1 fixtures
     if ($input->getOption('run-patches')) {
         $content = file_get_contents($this->container['root.path'] . '/resources/hudson/connexion.inc');
         $content = str_replace('{{dbname}}', $conf['main']['database']['dbname'], $content);
         $content = str_replace('{{hostname}}', $conf['main']['database']['host'], $content);
         $content = str_replace('{{port}}', $conf['main']['database']['port'], $content);
         $content = str_replace('{{user}}', $conf['main']['database']['user'], $content);
         $content = str_replace('{{password}}', $conf['main']['database']['password'], $content);
         $tmpFile = tempnam(sys_get_temp_dir(), 'connexion.inc-v3.1-');
         $this->container['filesystem']->dumpFile($tmpFile, $content);
         $this->container['filesystem']->copy($tmpFile, $this->container['root.path'] . '/config/connexion.inc');
         $this->container['filesystem']->copy($this->container['root.path'] . '/resources/hudson/_GV.php', $this->container['root.path'] . '/config/_GV.php');
         $content = file_get_contents($this->container['root.path'] . '/resources/hudson/fixtures.sql');
         $content = str_replace('{{APPLICATION_BOX}}', $dbs['ab'], $content);
         $content = str_replace('{{DATA_BOX}}', $dbName, $content);
         $content = str_replace('{{DB_HOST}}', $conf['main']['database']['host'], $content);
         $content = str_replace('{{DB_PORT}}', $conf['main']['database']['port'], $content);
         $content = str_replace('{{DB_USER}}', $conf['main']['database']['user'], $content);
         $content = str_replace('{{DB_PASSWORD}}', $conf['main']['database']['password'], $content);
         $content = str_replace('{{DATA_BOX}}', $dbName, $content);
         $content = str_replace('{{USER_EMAIL}}', $input->getOption('email'), $content);
         $content = str_replace('{{USER_PASSWORD}}', hash('sha256', $input->getOption('password')), $content);
         $tmpFile = tempnam(sys_get_temp_dir(), 'fixtures-v3.1-');
         $this->container['filesystem']->dumpFile($tmpFile, $content);
         $verbosity = $output->getVerbosity();
         $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
         $this->getApplication()->find('dbal:import')->run(new ArrayInput(array('command' => 'dbal:import', 'file' => $tmpFile)), $output);
         $output->setVerbosity($verbosity);
         $output->writeln('Importing Phraseanet v3.1 fixtures...<info>OK</info>');
     } else {
         $this->getApplication()->find('system:uninstall')->run(new ArrayInput(array('command' => 'system:uninstall')), $output);
         $cmd = sprintf('php ' . __DIR__ . '/../../../../../bin/setup system:install --email=%s --password=%s --db-user=%s --db-template=%s --db-password=%s --databox=%s --appbox=%s --server-name=%s --db-host=%s --db-port=%s -y', $input->getOption('email'), $input->getOption('password'), $conf['main']['database']['user'], 'en', $conf['main']['database']['password'], $dbName, $dbs['ab'], $conf['servername'], $conf['main']['database']['host'], $conf['main']['database']['port']);
         $process = new Process($cmd);
         $process->setTimeout(300);
         $process->run(function ($type, $buffer) {
             if ('err' === $type) {
                 echo 'ERR > ' . $buffer;
             }
         });
         if (false === $process->isSuccessful()) {
             $output->writeln('<error>Failed to execute the following command "' . $cmd . '"</error>');
             return 1;
         }
         $output->writeln("<info>Install successful !</info>");
     }
     foreach ($dbs['dbs'] as $databox) {
         if (!in_array($databox->get_dbname(), $dbToMount) && !in_array('all', $dbToMount)) {
             continue;
         }
         $credentials = $databox->get_connection()->get_credentials();
         \databox::mount($this->container, $credentials['hostname'], $credentials['port'], $credentials['user'], $credentials['password'], $databox->get_dbname());
         $output->writeln('Mounting database "' . $databox->get_dbname() . '"...<info>OK</info>');
     }
     if ($input->getOption('run-patches') || false === $this->container['phraseanet.configuration']->isUpToDate()) {
         $version = new Version();
         if ($input->getOption('run-patches')) {
             $output->write(sprintf('Upgrading... from version <info>3.1.21</info> to <info>%s</info>', $version->getNumber()), true);
         } else {
             $output->write(sprintf('Upgrading... from version <info>%s</info> to <info>%s</info>', $this->app->getApplicationBox()->get_version(), $version->getNumber()), true);
         }
         $cmd = 'php ' . __DIR__ . '/../../../../../bin/setup system:upgrade -y -f -v';
         $process = new Process($cmd);
         $process->setTimeout(600);
         $process->run(function ($type, $buffer) {
             if ('err' === $type) {
                 echo 'ERR > ' . $buffer;
             }
         });
         if (false === $process->isSuccessful()) {
             $output->writeln('<error>Failed to execute the following command "' . $cmd . '"</error>');
             return 1;
         }
     }
     if (!$input->getOption('no-setup-dbs')) {
         // create setup dbs
         $command = $this->getApplication()->find('ini:setup-tests-dbs');
         $input = new ArrayInput(array('command' => 'ini:setup-tests-dbs'));
         $command->run($input, $output);
     }
     $this->container['conf']->set(['main', 'storage', 'subdefs'], $dataPath);
     return 0;
 }
Exemple #4
0
 protected function apply_patches($from, $to, $post_process, Setup_Upgrade $upgrader, Application $app)
 {
     if (version::eq($from, $to)) {
         return true;
     }
     $list_patches = [];
     $upgrader->add_steps(1)->set_current_message($app->trans('Looking for patches'));
     $iterator = new DirectoryIterator($this->app['root.path'] . '/lib/classes/patch/');
     foreach ($iterator as $fileinfo) {
         if (!$fileinfo->isDot()) {
             if (substr($fileinfo->getFilename(), 0, 1) == '.') {
                 continue;
             }
             $versions = array_reverse(explode('.', $fileinfo->getFilename()));
             $classname = 'patch_' . array_pop($versions);
             $patch = new $classname();
             if (!in_array($this->get_base_type(), $patch->concern())) {
                 continue;
             }
             if (!!$post_process !== !!$patch->require_all_upgrades()) {
                 continue;
             }
             // if patch is older than current install
             if (version::lte($patch->get_release(), $from)) {
                 continue;
             }
             // if patch is new than current target
             if (version::gt($patch->get_release(), $to)) {
                 continue;
             }
             $n = 0;
             do {
                 $key = $patch->get_release() . '.' . $n;
                 $n++;
             } while (isset($list_patches[$key]));
             $list_patches[$key] = $patch;
         }
     }
     $upgrader->add_steps_complete(1)->add_steps(count($list_patches))->set_current_message($app->trans('Applying patches on %databox_name%', ['%databox_name%' => $this->get_dbname()]));
     uasort($list_patches, function (\patchInterface $patch1, \patchInterface $patch2) {
         return version::lt($patch1->get_release(), $patch2->get_release()) ? -1 : 1;
     });
     $success = true;
     foreach ($list_patches as $patch) {
         // Gets doctrine migrations required for current patch
         foreach ($patch->getDoctrineMigrations() as $doctrineVersion) {
             $version = $app['doctrine-migration.configuration']->getVersion($doctrineVersion);
             // Skip if already migrated
             if ($version->isMigrated()) {
                 continue;
             }
             $migration = $version->getMigration();
             // Inject entity manager
             $migration->setEntityManager($app['EM']);
             // Execute migration if not marked as migrated and not already applied by an older patch
             if (!$migration->isAlreadyApplied()) {
                 $version->execute('up');
                 continue;
             }
             // Or mark it as migrated
             $version->markMigrated();
         }
         if (false === $patch->apply($this, $app)) {
             $success = false;
         }
         $upgrader->add_steps_complete(1);
     }
     return $success;
 }
 private function getMappedVersionTag(array $tags, $versionTag)
 {
     foreach ($tags as $tag) {
         try {
             if (SemanticVersion::eq($versionTag, $tag)) {
                 return $tag;
             }
         } catch (RuntimeException $e) {
             // Do nothing
         }
     }
     return null;
 }
 public function applyPatches(\base $base, $from, $to, $post_process)
 {
     if (version::eq($from, $to)) {
         return true;
     }
     $list_patches = [];
     $iterator = new \DirectoryIterator($this->app['root.path'] . '/lib/classes/patch/');
     foreach ($iterator as $fileinfo) {
         if (!$fileinfo->isDot()) {
             if (substr($fileinfo->getFilename(), 0, 1) == '.') {
                 continue;
             }
             $versions = array_reverse(explode('.', $fileinfo->getFilename()));
             $classname = 'patch_' . array_pop($versions);
             /** @var \patchAbstract $patch */
             $patch = new $classname();
             if (!in_array($base->get_base_type(), $patch->concern())) {
                 continue;
             }
             if (!!$post_process !== !!$patch->require_all_upgrades()) {
                 continue;
             }
             // if patch is older than current install
             if (version::lte($patch->get_release(), $from)) {
                 continue;
             }
             // if patch is new than current target
             if (version::gt($patch->get_release(), $to)) {
                 continue;
             }
             $n = 0;
             do {
                 $key = $patch->get_release() . '.' . $n;
                 $n++;
             } while (isset($list_patches[$key]));
             $list_patches[$key] = $patch;
         }
     }
     uasort($list_patches, function (\patchInterface $patch1, \patchInterface $patch2) {
         return version::lt($patch1->get_release(), $patch2->get_release()) ? -1 : 1;
     });
     $success = true;
     // disable mail
     $this->app['swiftmailer.transport'] = null;
     foreach ($list_patches as $patch) {
         // Gets doctrine migrations required for current patch
         foreach ($patch->getDoctrineMigrations() as $doctrineVersion) {
             /** @var \Doctrine\DBAL\Migrations\Version $version */
             $version = $this->app['doctrine-migration.configuration']->getVersion($doctrineVersion);
             // Skip if already migrated
             if ($version->isMigrated()) {
                 continue;
             }
             $migration = $version->getMigration();
             // Handle legacy migrations
             if ($migration instanceof AbstractMigration) {
                 // Inject entity manager
                 $migration->setEntityManager($this->app['orm.em']);
                 // Execute migration if not marked as migrated and not already applied by an older patch
                 if (!$migration->isAlreadyApplied()) {
                     $version->execute('up');
                     continue;
                 }
                 // Or mark it as migrated
                 $version->markMigrated();
             } else {
                 $version->execute('up');
             }
         }
         if (false === $patch->apply($base, $this->app)) {
             $success = false;
         }
     }
     return $success;
 }