diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/CoreUpdater/Commands/Update.php | 260 | ||||
-rw-r--r-- | plugins/CoreUpdater/Commands/Update/CliUpdateObserver.php | 54 | ||||
-rw-r--r-- | plugins/CoreUpdater/Controller.php | 28 | ||||
-rw-r--r-- | plugins/CoreUpdater/CoreUpdater.php | 91 | ||||
-rw-r--r-- | plugins/CoreUpdater/templates/runUpdaterAndExit_done_cli.twig | 51 | ||||
-rw-r--r-- | plugins/CoreUpdater/templates/runUpdaterAndExit_welcome_cli.twig | 53 | ||||
-rw-r--r-- | plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php | 118 | ||||
-rw-r--r-- | plugins/Installation/Controller.php | 4 |
8 files changed, 441 insertions, 218 deletions
diff --git a/plugins/CoreUpdater/Commands/Update.php b/plugins/CoreUpdater/Commands/Update.php index 02f774ec44..07d12cada3 100644 --- a/plugins/CoreUpdater/Commands/Update.php +++ b/plugins/CoreUpdater/Commands/Update.php @@ -8,21 +8,31 @@ */ namespace Piwik\Plugins\CoreUpdater\Commands; +use Piwik\Version; +use Piwik\Config; +use Piwik\DbHelper; use Piwik\Filesystem; +use Piwik\Piwik; use Piwik\Plugin\ConsoleCommand; -use Piwik\Plugins\CoreUpdater\Controller; +use Piwik\Plugins\CoreUpdater\Commands\Update\CliUpdateObserver; use Piwik\Plugins\CoreUpdater\NoUpdatesFoundException; use Piwik\Plugins\UserCountry\LocationProvider; +use Piwik\Updater; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; /** - * @package CloudAdmin + * @package CoreUpdater */ class Update extends ConsoleCommand { + /** + * @var string[] + */ + private $migrationQueries; + protected function configure() { $this->setName('core:update'); @@ -61,10 +71,6 @@ class Update extends ConsoleCommand } catch(NoUpdatesFoundException $e) { // Do not fail if no updates were found $this->writeSuccessMessage($output, array($e->getMessage())); - } catch (\Exception $e) { - // Fail in case of any other error during upgrade - $output->writeln("<error>" . $e->getMessage() . "</error>"); - throw $e; } } @@ -85,9 +91,245 @@ class Update extends ConsoleCommand { $this->checkAllRequiredOptionsAreNotEmpty($input); - $updateController = new Controller(); - $content = $updateController->runUpdaterAndExit($doDryRun); + $updater = $this->makeUpdaterInstance($output); + + $componentsWithUpdateFile = $updater->getComponentUpdates(); + if (empty($componentsWithUpdateFile)) { + throw new NoUpdatesFoundException("Everything is already up to date."); + } + + $output->writeln(array( + "", + " *** " . Piwik::translate('CoreUpdater_UpdateTitle') . " ***" + )); + + // handle case of existing database with no tables + if (!DbHelper::isInstalled()) { + $this->handleCoreError($output, Piwik::translate('CoreUpdater_EmptyDatabaseError', Config::getInstance()->database['dbname'])); + return; + } + + $output->writeln(array( + "", + " " . Piwik::translate('CoreUpdater_DatabaseUpgradeRequired'), + "", + " " . Piwik::translate('CoreUpdater_YourDatabaseIsOutOfDate') + )); + + if ($this->isUpdatingCore($componentsWithUpdateFile)) { + $currentVersion = $this->getCurrentVersionForCore($updater); + $output->writeln(array( + "", + " " . Piwik::translate('CoreUpdater_PiwikWillBeUpgradedFromVersionXToVersionY', array($currentVersion, Version::VERSION)) + )); + } + + $pluginsToUpdate = $this->getPluginsToUpdate($componentsWithUpdateFile); + if (!empty($pluginsToUpdate)) { + $output->writeln(array( + "", + " " . Piwik::translate('CoreUpdater_TheFollowingPluginsWillBeUpgradedX', implode(', ', $pluginsToUpdate)) + )); + } + + $dimensionsToUpdate = $this->getDimensionsToUpdate($componentsWithUpdateFile); + if (!empty($dimensionsToUpdate)) { + $output->writeln(array( + "", + " " . Piwik::translate('CoreUpdater_TheFollowingDimensionsWillBeUpgradedX', implode(', ', $dimensionsToUpdate)) + )); + } + + $output->writeln(""); + + if ($doDryRun) { + $this->doDryRun($updater, $output); + } else { + $this->doRealUpdate($updater, $componentsWithUpdateFile, $output); + } + } + + private function doDryRun(Updater $updater, OutputInterface $output) + { + $migrationQueries = $this->getMigrationQueriesToExecute($updater); + + $output->writeln(array(" *** Note: this is a Dry Run ***", "")); + + foreach ($migrationQueries as $query) { + $output->writeln(" " . $query); + } + + $output->writeln(array("", " *** End of Dry Run ***", "")); + } + + private function doRealUpdate(Updater $updater, $componentsWithUpdateFile, OutputInterface $output) + { + $output->writeln(array(" " . Piwik::translate('CoreUpdater_TheUpgradeProcessMayTakeAWhilePleaseBePatient'), "")); + + $updaterResult = $updater->updateComponents($componentsWithUpdateFile); + + if (@$updaterResult['coreError']) { + $this->handleCoreError($output, $updaterResult['errors'], $includeDiyHelp = true); + return; + } + + if (!empty($updaterResult['warnings'])) { + $this->outputUpdaterWarnings($output, $updaterResult['warnings']); + } + + if (!empty($updaterResult['errors'])) { + $this->outputUpdaterErrors($output, $updaterResult['errors'], $updaterResult['deactivatedPlugins']); + } + + if (!empty($updaterResult['warnings']) + || !empty($updaterResult['errors']) + ) { + $output->writeln(array( + " " . Piwik::translate('CoreUpdater_HelpMessageIntroductionWhenWarning'), + "", + " * " . $this->getUpdateHelpMessage() + )); + } + } + + private function handleCoreError(OutputInterface $output, $errors, $includeDiyHelp = false) + { + if (!is_array($errors)) { + $errors = array($errors); + } + + $output->writeln(array( + "", + " [X] " . Piwik::translate('CoreUpdater_CriticalErrorDuringTheUpgradeProcess'), + "", + )); + + foreach ($errors as $errorMessage) { + $errorMessage = trim($errorMessage); + $errorMessage = str_replace("\n", "\n ", $errorMessage); + + $output->writeln(" * $errorMessage"); + } + + $output->writeln(array( + "", + " " . Piwik::translate('CoreUpdater_HelpMessageIntroductionWhenError'), + "", + " * " . $this->getUpdateHelpMessage() + )); + + if ($includeDiyHelp) { + $output->writeln(array( + "", + " " . Piwik::translate('CoreUpdater_ErrorDIYHelp'), + "", + " * " . Piwik::translate('CoreUpdater_ErrorDIYHelp_1'), + " * " . Piwik::translate('CoreUpdater_ErrorDIYHelp_2'), + " * " . Piwik::translate('CoreUpdater_ErrorDIYHelp_3'), + " * " . Piwik::translate('CoreUpdater_ErrorDIYHelp_4'), + " * " . Piwik::translate('CoreUpdater_ErrorDIYHelp_5') + )); + } + + throw new \RuntimeException("Piwik could not be updated! See above for more information."); + } + + private function outputUpdaterWarnings(OutputInterface $output, $warnings) + { + $output->writeln(array( + "", + " [!] " . Piwik::translate('CoreUpdater_WarningMessages'), + "" + )); + + foreach ($warnings as $message) { + $output->writeln(" * $message"); + } + } + + private function outputUpdaterErrors(OutputInterface $output, $errors, $deactivatedPlugins) + { + $output->writeln(array( + "", + " [X] " . Piwik::translate('CoreUpdater_ErrorDuringPluginsUpdates'), + "" + )); + + foreach ($errors as $message) { + $output->writeln(" * $message"); + } + + if (!empty($deactivatedPlugins)) { + $output->writeln(array( + "", + " [!] " . Piwik::translate('CoreUpdater_WeAutomaticallyDeactivatedTheFollowingPlugins', implode(', ', $deactivatedPlugins)) + )); + } + } + + private function getUpdateHelpMessage() + { + return Piwik::translate('CoreUpdater_HelpMessageContent', array('[',']',"\n *")); + } + + private function isUpdatingCore($componentsWithUpdateFile) + { + foreach ($componentsWithUpdateFile as $componentName => $updates) { + if ($componentName == 'core') { + return true; + } + } + return false; + } + + private function getCurrentVersionForCore(Updater $updater) + { + $currentVersion = $updater->getCurrentComponentVersion('core'); + if ($currentVersion === false) { + $currentVersion = "<= 0.2.9"; + } + return $currentVersion; + } + + private function getPluginsToUpdate($componentsWithUpdateFile) + { + $plugins = array(); + foreach ($componentsWithUpdateFile as $componentName => $updates) { + if ($componentName !== 'core' + && 0 !== strpos($componentName, 'log_') + ) { + $plugins[] = $componentName; + } + } + return $plugins; + } + + private function getDimensionsToUpdate($componentsWithUpdateFile) + { + $dimensions = array(); + foreach ($componentsWithUpdateFile as $componentName => $updates) { + if (0 === strpos($componentName, 'log_')) { + $dimensions[] = $componentName; + } + } + return $dimensions; + } + + private function getMigrationQueriesToExecute(Updater $updater) + { + if (empty($this->migrationQueries)) { + $this->migrationQueries = $updater->getSqlQueriesToExecute(); + } + return $this->migrationQueries; + } + + private function makeUpdaterInstance(OutputInterface $output) + { + $updater = new Updater(); + + $migrationQueryCount = count($this->getMigrationQueriesToExecute($updater)); + $updater->addUpdateObserver(new CliUpdateObserver($output, $migrationQueryCount)); - $output->writeln($content); + return $updater; } }
\ No newline at end of file diff --git a/plugins/CoreUpdater/Commands/Update/CliUpdateObserver.php b/plugins/CoreUpdater/Commands/Update/CliUpdateObserver.php new file mode 100644 index 0000000000..a8c95dc604 --- /dev/null +++ b/plugins/CoreUpdater/Commands/Update/CliUpdateObserver.php @@ -0,0 +1,54 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\CoreUpdater\Commands\Update; + +use Piwik\Updater\UpdateObserver; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * UpdateObserver used to output progress of an update initiated on the command line. Prints the currently + * executing query and the total number of queries to run. + * + * @package CoreUpdater + */ +class CliUpdateObserver extends UpdateObserver +{ + /** + * @var OutputInterface + */ + private $output; + + /** + * @var int + */ + private $totalMigrationQueryCount; + + /** + * @var int + */ + private $currentMigrationQueryExecutionCount = 0; + + public function __construct(OutputInterface $output, $totalMigrationQueryCount) + { + $this->output = $output; + $this->totalMigrationQueryCount = $totalMigrationQueryCount; + } + + public function onStartExecutingMigrationQuery($updateFile, $sql) + { + $this->output->write(" Executing <comment>$sql</comment>... "); + + ++$this->currentMigrationQueryExecutionCount; + } + + public function onFinishedExecutingMigrationQuery($updateFile, $sql) + { + $this->output->writeln("Done. <info>[{$this->currentMigrationQueryExecutionCount} / {$this->totalMigrationQueryCount}]</info>"); + } +}
\ No newline at end of file diff --git a/plugins/CoreUpdater/Controller.php b/plugins/CoreUpdater/Controller.php index 49cb1080a2..d15dc231e6 100644 --- a/plugins/CoreUpdater/Controller.php +++ b/plugins/CoreUpdater/Controller.php @@ -110,7 +110,7 @@ class Controller extends \Piwik\Plugin\Controller return $view->render(); } - protected function redirectToDashboardWhenNoError($updater) + protected function redirectToDashboardWhenNoError(DbUpdater $updater) { if (count($updater->getSqlQueriesToExecute()) == 1 && !$this->coreError @@ -146,16 +146,15 @@ class Controller extends \Piwik\Plugin\Controller public function runUpdaterAndExit($doDryRun = null) { $updater = new DbUpdater(); - $componentsWithUpdateFile = CoreUpdater::getComponentUpdates($updater); + $componentsWithUpdateFile = $updater->getComponentUpdates(); if (empty($componentsWithUpdateFile)) { throw new NoUpdatesFoundException("Everything is already up to date."); } SettingsServer::setMaxExecutionTime(0); - $cli = Common::isPhpCliMode() ? '_cli' : ''; - $welcomeTemplate = '@CoreUpdater/runUpdaterAndExit_welcome' . $cli; - $doneTemplate = '@CoreUpdater/runUpdaterAndExit_done' . $cli; + $welcomeTemplate = '@CoreUpdater/runUpdaterAndExit_welcome'; + $doneTemplate = '@CoreUpdater/runUpdaterAndExit_done'; $viewWelcome = new View($welcomeTemplate); $this->addCustomLogoInfo($viewWelcome); @@ -176,21 +175,6 @@ class Controller extends \Piwik\Plugin\Controller return $viewWelcome->render(); } - // CLI - if (Common::isPhpCliMode()) { - $this->doWelcomeUpdates($viewWelcome, $componentsWithUpdateFile); - $output = $viewWelcome->render(); - - // Proceed with upgrade in CLI only if user specifically asked for it, or if running console command - $isUpdateRequested = Common::isRunningConsoleCommand() || Piwik::getModule() == 'CoreUpdater'; - - if (!$this->coreError && $isUpdateRequested) { - $this->doExecuteUpdates($viewDone, $updater, $componentsWithUpdateFile); - $output .= $viewDone->render(); - } - return $output; - } - // Web if ($doExecuteUpdates) { $this->warningMessages = array(); @@ -255,9 +239,9 @@ class Controller extends \Piwik\Plugin\Controller $view->coreToUpdate = $coreToUpdate; } - private function doExecuteUpdates($view, $updater, $componentsWithUpdateFile) + private function doExecuteUpdates($view, DbUpdater $updater, $componentsWithUpdateFile) { - $result = CoreUpdater::updateComponents($updater, $componentsWithUpdateFile); + $result = $updater->updateComponents($componentsWithUpdateFile); $this->coreError = $result['coreError']; $this->warningMessages = $result['warnings']; diff --git a/plugins/CoreUpdater/CoreUpdater.php b/plugins/CoreUpdater/CoreUpdater.php index f6f197db5d..eb5ce6c622 100644 --- a/plugins/CoreUpdater/CoreUpdater.php +++ b/plugins/CoreUpdater/CoreUpdater.php @@ -14,7 +14,6 @@ use Piwik\Common; use Piwik\Filesystem; use Piwik\FrontController; use Piwik\Piwik; -use Piwik\Columns\Updater as ColumnsUpdater; use Piwik\UpdateCheck; use Piwik\Updater; use Piwik\UpdaterErrorException; @@ -36,89 +35,20 @@ class CoreUpdater extends \Piwik\Plugin ); } + /** + * @deprecated + */ public static function updateComponents(Updater $updater, $componentsWithUpdateFile) { - $warnings = array(); - $errors = array(); - $deactivatedPlugins = array(); - $coreError = false; - - if (!empty($componentsWithUpdateFile)) { - $currentAccess = Access::getInstance(); - $hasSuperUserAccess = $currentAccess->hasSuperUserAccess(); - - if (!$hasSuperUserAccess) { - $currentAccess->setSuperUserAccess(true); - } - - // if error in any core update, show message + help message + EXIT - // if errors in any plugins updates, show them on screen, disable plugins that errored + CONTINUE - // if warning in any core update or in any plugins update, show message + CONTINUE - // if no error or warning, success message + CONTINUE - foreach ($componentsWithUpdateFile as $name => $filenames) { - try { - $warnings = array_merge($warnings, $updater->update($name)); - } catch (UpdaterErrorException $e) { - $errors[] = $e->getMessage(); - if ($name == 'core') { - $coreError = true; - break; - } elseif (\Piwik\Plugin\Manager::getInstance()->isPluginActivated($name)) { - \Piwik\Plugin\Manager::getInstance()->deactivatePlugin($name); - $deactivatedPlugins[] = $name; - } - } - } - - if (!$hasSuperUserAccess) { - $currentAccess->setSuperUserAccess(false); - } - } - - Filesystem::deleteAllCacheOnUpdate(); - - $result = array( - 'warnings' => $warnings, - 'errors' => $errors, - 'coreError' => $coreError, - 'deactivatedPlugins' => $deactivatedPlugins - ); - - /** - * Triggered after Piwik has been updated. - */ - Piwik::postEvent('CoreUpdater.update.end'); - - return $result; + return $updater->updateComponents($componentsWithUpdateFile); } + /** + * @deprecated + */ public static function getComponentUpdates(Updater $updater) { - $updater->addComponentToCheck('core', Version::VERSION); - $manager = \Piwik\Plugin\Manager::getInstance(); - $plugins = $manager->getLoadedPlugins(); - foreach ($plugins as $pluginName => $plugin) { - if ($manager->isPluginInstalled($pluginName)) { - $updater->addComponentToCheck($pluginName, $plugin->getVersion()); - } - } - - $columnsVersions = ColumnsUpdater::getAllVersions(); - foreach ($columnsVersions as $component => $version) { - $updater->addComponentToCheck($component, $version); - } - - $componentsWithUpdateFile = $updater->getComponentsWithUpdateFile(); - - if (count($componentsWithUpdateFile) == 0) { - ColumnsUpdater::onNoUpdateAvailable($columnsVersions); - - if (!$updater->hasNewVersion('core')) { - return null; - } - } - - return $componentsWithUpdateFile; + return $updater->getComponentUpdates(); } public function dispatch() @@ -127,12 +57,11 @@ class CoreUpdater extends \Piwik\Plugin $action = Common::getRequestVar('action', '', 'string'); $updater = new Updater(); - $updater->addComponentToCheck('core', Version::VERSION); - $updates = $updater->getComponentsWithNewVersion(); + $updates = $updater->getComponentsWithNewVersion(array('core' => Version::VERSION)); if (!empty($updates)) { Filesystem::deleteAllCacheOnUpdate(); } - if (self::getComponentUpdates($updater) !== null + if ($updater->getComponentUpdates() !== null && $module != 'CoreUpdater' // Proxy module is used to redirect users to piwik.org, should still work when Piwik must be updated && $module != 'Proxy' diff --git a/plugins/CoreUpdater/templates/runUpdaterAndExit_done_cli.twig b/plugins/CoreUpdater/templates/runUpdaterAndExit_done_cli.twig deleted file mode 100644 index bee8fadcbf..0000000000 --- a/plugins/CoreUpdater/templates/runUpdaterAndExit_done_cli.twig +++ /dev/null @@ -1,51 +0,0 @@ -{% autoescape false %} -{% set helpMessage %}{{- 'CoreUpdater_HelpMessageContent'|translate('[',']',"\n\n *") }}{% endset %} -{% if coreError %} - [X] {{ 'CoreUpdater_CriticalErrorDuringTheUpgradeProcess'|translate }} - - {% for message in errorMessages %} - * {{ message }} - {% endfor %} - - {{ 'CoreUpdater_HelpMessageIntroductionWhenError'|translate }} - - * {{ helpMessage }} - - {{ 'CoreUpdater_ErrorDIYHelp'|translate }} - * {{ 'CoreUpdater_ErrorDIYHelp_1'|translate }} - * {{ 'CoreUpdater_ErrorDIYHelp_2'|translate }} - * {{ 'CoreUpdater_ErrorDIYHelp_3'|translate }} - * {{ 'CoreUpdater_ErrorDIYHelp_4'|translate }} - * {{ 'CoreUpdater_ErrorDIYHelp_5'|translate }} - -{% else %} -{% if warningMessages|length > 0 %} - [!] {{ 'CoreUpdater_WarningMessages'|translate }} - - {% for message in warningMessages -%} - * {{ message }} - {%- endfor %} -{%- endif %} -{% if errorMessages|length > 0 -%} - - [X] {{ 'CoreUpdater_ErrorDuringPluginsUpdates'|translate }} - - {% for message in errorMessages %} - * {{ message }} - {% endfor %} - - {% if deactivatedPlugins|length > 0 -%} - {% set listOfDeactivatedPlugins %}{{ deactivatedPlugins|implode(', ') }}{% endset %} - - [!] {{ 'CoreUpdater_WeAutomaticallyDeactivatedTheFollowingPlugins'|translate(listOfDeactivatedPlugins) }} - {% endif %} -{% endif %} -{% if errorMessages|length > 0 or warningMessages|length > 0 %} - {{ 'CoreUpdater_HelpMessageIntroductionWhenWarning'|translate }} - - * {{ helpMessage }} -{% else %} - Done! -{% endif %} -{% endif %} -{% endautoescape %} diff --git a/plugins/CoreUpdater/templates/runUpdaterAndExit_welcome_cli.twig b/plugins/CoreUpdater/templates/runUpdaterAndExit_welcome_cli.twig deleted file mode 100644 index 33c21a15e3..0000000000 --- a/plugins/CoreUpdater/templates/runUpdaterAndExit_welcome_cli.twig +++ /dev/null @@ -1,53 +0,0 @@ -{% autoescape false %} -{% set helpMessage %} -{{- 'CoreUpdater_HelpMessageContent'|translate('[',']','\n\n *') }} -{% endset %} - -*** {{ 'CoreUpdater_UpdateTitle'|translate }} *** -{% if coreError %} - - [X] {{ 'CoreUpdater_CriticalErrorDuringTheUpgradeProcess'|translate }} - - {% for message in errorMessages %} - {{- message }} - {% endfor %} - - {{ 'CoreUpdater_HelpMessageIntroductionWhenError'|translate }} - - * {{ helpMessage }} - -{% elseif coreToUpdate or pluginNamesToUpdate|length > 0 or dimensionsToUpdate|length > 0 %} - - {{ 'CoreUpdater_DatabaseUpgradeRequired'|translate }} - - {{ 'CoreUpdater_YourDatabaseIsOutOfDate'|translate }} - -{% if coreToUpdate %} - {{ 'CoreUpdater_PiwikWillBeUpgradedFromVersionXToVersionY'|translate(current_piwik_version, new_piwik_version) }} -{% endif %} - -{%- if pluginNamesToUpdate|length > 0 %} - {%- set listOfPlugins %}{{ pluginNamesToUpdate|implode(', ') }}{% endset %} - {{ 'CoreUpdater_TheFollowingPluginsWillBeUpgradedX'|translate( listOfPlugins) }} -{% endif %} - -{%- if dimensionsToUpdate|length > 0 %} - {%- set listOfDimensions %}{{ dimensionsToUpdate|implode(', ') }}{% endset %} - {{ 'CoreUpdater_TheFollowingDimensionsWillBeUpgradedX'|translate( listOfDimensions) }} -{% endif %} - -{# dry run #} -{% if queries is defined and queries is not empty %} -*** Note: this is a Dry Run *** - - {% for query in queries %}{{ query|trim }} - {% endfor %} - -*** End of Dry Run *** -{% else %} - {{ 'CoreUpdater_TheUpgradeProcessMayTakeAWhilePleaseBePatient'|translate }} -{% endif %} - -{% endif %} -{% endautoescape %} - diff --git a/plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php b/plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php new file mode 100644 index 0000000000..fd9a817aa4 --- /dev/null +++ b/plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php @@ -0,0 +1,118 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ +namespace Piwik\Plugins\CoreUpdater\tests\Integration\Commands; + +use Piwik\Common; +use Piwik\Config; +use Piwik\DataAccess\ArchiveTableCreator; +use Piwik\Date; +use Piwik\Db; +use Piwik\Option; +use Piwik\Tests\Framework\TestCase\ConsoleCommandTestCase; +use Piwik\Version; +use Symfony\Component\Console\Helper\QuestionHelper; + +/** + * @group CoreUpdater + * @group CoreUpdater_Integration + */ +class UpdateTest extends ConsoleCommandTestCase +{ + const VERSION_TO_UPDATE_FROM = '2.9.0'; + const EXPECTED_SQL_FROM_2_10 = "UPDATE report SET reports = REPLACE(reports, 'UserSettings_getBrowserVersion', 'DevicesDetection_getBrowserVersions');"; + + private $oldScriptName = null; + + public function setUp() + { + parent::setUp(); + + Config::getInstance()->setTestEnvironment(); + Option::set('version_core', self::VERSION_TO_UPDATE_FROM); + + $this->oldScriptName = $_SERVER['SCRIPT_NAME']; + $_SERVER['SCRIPT_NAME'] = $_SERVER['SCRIPT_NAME'] . " console"; // update won't execute w/o this, see Common::isRunningConsoleCommand() + } + + public function tearDown() + { + $_SERVER['SCRIPT_NAME'] = $this->oldScriptName; + + parent::tearDown(); + } + + public function test_UpdateCommand_SuccessfullyExecutesUpdate() + { + $result = $this->applicationTester->run(array( + 'command' => 'core:update', + '--yes' => true + )); + + $this->assertEquals(0, $result); + + $this->assertDryRunExecuted($this->applicationTester->getDisplay()); + + // make sure update went through + $this->assertEquals(Version::VERSION, Option::get('version_core')); + } + + public function test_UpdateCommand_DoesntExecuteSql_WhenUserSaysNo() + { + /** @var QuestionHelper $dialog */ + $dialog = $this->application->getHelperSet()->get('question'); + $dialog->setInputStream($this->getInputStream("N\n")); + + $result = $this->applicationTester->run(array( + 'command' => 'core:update' + )); + + $this->assertEquals(0, $result); + + $this->assertDryRunExecuted($this->applicationTester->getDisplay()); + + // make sure update did not go through + $this->assertEquals(self::VERSION_TO_UPDATE_FROM, Option::get('version_core')); + } + + public function test_UpdateCommand_DoesNotExecuteUpdate_IfPiwikUpToDate() + { + Option::set('version_core', Version::VERSION); + + $result = $this->applicationTester->run(array( + 'command' => 'core:update', + '--yes' => true + )); + + $this->assertEquals(0, $result); + + // check no update occurred + $this->assertContains("Everything is already up to date.", $this->applicationTester->getDisplay()); + $this->assertEquals(Version::VERSION, Option::get('version_core')); + } + + public function test_UpdateCommand_ReturnsCorrectExitCode_WhenErrorOccurs() + { + // create a blob table, then drop it manually so update 2.10.0-b10 will fail + $tableName = ArchiveTableCreator::getBlobTable(Date::factory('2015-01-01')); + Db::exec("DROP TABLE $tableName"); + + $result = $this->applicationTester->run(array( + 'command' => 'core:update', + '--yes' => true + )); + + $this->assertEquals(1, $result); + $this->assertContains("Piwik could not be updated! See above for more information.", $this->applicationTester->getDisplay()); + } + + private function assertDryRunExecuted($output) + { + $this->assertContains("Note: this is a Dry Run", $output); + $this->assertContains(self::EXPECTED_SQL_FROM_2_10, $output); + } +}
\ No newline at end of file diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php index 7641624cb3..9976f4ad58 100644 --- a/plugins/Installation/Controller.php +++ b/plugins/Installation/Controller.php @@ -720,12 +720,12 @@ class Controller extends \Piwik\Plugin\ControllerAdmin return Access::doAsSuperUser(function () { $updater = new Updater(); - $componentsWithUpdateFile = CoreUpdater::getComponentUpdates($updater); + $componentsWithUpdateFile = $updater->getComponentUpdates(); if (empty($componentsWithUpdateFile)) { return false; } - $result = CoreUpdater::updateComponents($updater, $componentsWithUpdateFile); + $result = $updater->updateComponents($componentsWithUpdateFile); return $result; }); } |