Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/CoreUpdater/Commands/Update.php260
-rw-r--r--plugins/CoreUpdater/Commands/Update/CliUpdateObserver.php54
-rw-r--r--plugins/CoreUpdater/Controller.php28
-rw-r--r--plugins/CoreUpdater/CoreUpdater.php91
-rw-r--r--plugins/CoreUpdater/templates/runUpdaterAndExit_done_cli.twig51
-rw-r--r--plugins/CoreUpdater/templates/runUpdaterAndExit_welcome_cli.twig53
-rw-r--r--plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php118
-rw-r--r--plugins/Installation/Controller.php4
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;
});
}