From cdcd49b473dc7bad4ffb500977b2b8ea5d6f676e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 26 Apr 2016 16:24:50 +0200 Subject: [PATCH 1/4] Adding progress to occ maintenance:repair --- core/Command/Maintenance/Repair.php | 69 ++++++++++++++++++++++------ core/register_command.php | 4 +- lib/private/Repair/DropOldTables.php | 5 +- 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/core/Command/Maintenance/Repair.php b/core/Command/Maintenance/Repair.php index 2da7614339..286df5fd7b 100644 --- a/core/Command/Maintenance/Repair.php +++ b/core/Command/Maintenance/Repair.php @@ -25,24 +25,36 @@ namespace OC\Core\Command\Maintenance; use Exception; +use OCP\IConfig; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\EventDispatcher\EventDispatcher; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\GenericEvent; class Repair extends Command { /** @var \OC\Repair $repair */ protected $repair; - /** @var \OCP\IConfig */ + /** @var IConfig */ protected $config; + /** @var EventDispatcherInterface */ + private $dispatcher; + /** @var ProgressBar */ + private $progress; + /** @var OutputInterface */ + private $output; /** * @param \OC\Repair $repair - * @param \OCP\IConfig $config + * @param IConfig $config */ - public function __construct(\OC\Repair $repair, \OCP\IConfig $config) { + public function __construct(\OC\Repair $repair, IConfig $config, EventDispatcherInterface $dispatcher) { $this->repair = $repair; $this->config = $config; + $this->dispatcher = $dispatcher; parent::__construct(); } @@ -87,21 +99,48 @@ class Repair extends Command { $maintenanceMode = $this->config->getSystemValue('maintenance', false); $this->config->setSystemValue('maintenance', true); - $this->repair->listen('\OC\Repair', 'step', function ($description) use ($output) { - $output->writeln(' - ' . $description); - }); - $this->repair->listen('\OC\Repair', 'info', function ($description) use ($output) { - $output->writeln(' - ' . $description); - }); - $this->repair->listen('\OC\Repair', 'warning', function ($description) use ($output) { - $output->writeln(' - WARNING: ' . $description); - }); - $this->repair->listen('\OC\Repair', 'error', function ($description) use ($output) { - $output->writeln(' - ERROR: ' . $description); - }); + $this->progress = new ProgressBar($output); + $this->output = $output; + $this->dispatcher->addListener('\OC\Repair::startProgress', [$this, 'handleRepairFeedBack']); + $this->dispatcher->addListener('\OC\Repair::advance', [$this, 'handleRepairFeedBack']); + $this->dispatcher->addListener('\OC\Repair::finishProgress', [$this, 'handleRepairFeedBack']); + $this->dispatcher->addListener('\OC\Repair::step', [$this, 'handleRepairFeedBack']); + $this->dispatcher->addListener('\OC\Repair::info', [$this, 'handleRepairFeedBack']); + $this->dispatcher->addListener('\OC\Repair::warning', [$this, 'handleRepairFeedBack']); + $this->dispatcher->addListener('\OC\Repair::error', [$this, 'handleRepairFeedBack']); $this->repair->run(); $this->config->setSystemValue('maintenance', $maintenanceMode); } + + public function handleRepairFeedBack($event) { + if (!$event instanceof GenericEvent) { + return; + } + switch ($event->getSubject()) { + case '\OC\Repair::startProgress': + $this->progress->start($event->getArgument(0)); + break; + case '\OC\Repair::advance': + $this->progress->advance($event->getArgument(0)); + break; + case '\OC\Repair::finishProgress': + $this->progress->finish(); + $this->output->writeln(''); + break; + case '\OC\Repair::step': + $this->output->writeln(' - ' . $event->getArgument(0)); + break; + case '\OC\Repair::info': + $this->output->writeln(' - ' . $event->getArgument(0)); + break; + case '\OC\Repair::warning': + $this->output->writeln(' - WARNING: ' . $event->getArgument(0)); + break; + case '\OC\Repair::error': + $this->output->writeln(' - ERROR: ' . $event->getArgument(0)); + break; + } + } } diff --git a/core/register_command.php b/core/register_command.php index 0b1a019f99..798497d97d 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -112,7 +112,9 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) { $application->add(new OC\Core\Command\Maintenance\Mimetype\UpdateDB(\OC::$server->getMimeTypeDetector(), \OC::$server->getMimeTypeLoader())); $application->add(new OC\Core\Command\Maintenance\Mimetype\UpdateJS(\OC::$server->getMimeTypeDetector())); $application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig())); - $application->add(new OC\Core\Command\Maintenance\Repair(new \OC\Repair(\OC\Repair::getRepairSteps()), \OC::$server->getConfig())); + $application->add(new OC\Core\Command\Maintenance\Repair( + new \OC\Repair(\OC\Repair::getRepairSteps(), \OC::$server->getEventDispatcher()), \OC::$server->getConfig(), + \OC::$server->getEventDispatcher())); $application->add(new OC\Core\Command\Maintenance\SingleUser(\OC::$server->getConfig())); $application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig(), \OC::$server->getLogger())); diff --git a/lib/private/Repair/DropOldTables.php b/lib/private/Repair/DropOldTables.php index 15d5b9a357..59e8487c2a 100644 --- a/lib/private/Repair/DropOldTables.php +++ b/lib/private/Repair/DropOldTables.php @@ -55,12 +55,15 @@ class DropOldTables implements IRepairStep { * @throws \Exception in case of failure */ public function run(IOutput $output) { + $tables = $this->oldDatabaseTables(); + $output->startProgress(count($tables)); foreach ($this->oldDatabaseTables() as $tableName) { if ($this->connection->tableExists($tableName)){ - $output->info(sprintf('Table %s has been deleted', $tableName)); $this->connection->dropTable($tableName); } + $output->advance(); } + $output->finishProgress(); } /** From bbd2a07525db6b70645720f4c022b5562543127e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 27 Apr 2016 10:51:02 +0200 Subject: [PATCH 2/4] Remove emitter from class Repair --- lib/private/repair.php | 8 +- lib/private/updater.php | 29 +------ tests/lib/RepairTest.php | 134 +++++++++++++++++++++++++++++++++ tests/lib/repair.php | 159 --------------------------------------- 4 files changed, 142 insertions(+), 188 deletions(-) create mode 100644 tests/lib/RepairTest.php delete mode 100644 tests/lib/repair.php diff --git a/lib/private/repair.php b/lib/private/repair.php index 586e4e42b1..c6887ab5ce 100644 --- a/lib/private/repair.php +++ b/lib/private/repair.php @@ -28,7 +28,6 @@ namespace OC; -use OC\Hooks\BasicEmitter; use OC\Hooks\Emitter; use OC\Repair\AssetCache; use OC\Repair\CleanTags; @@ -51,7 +50,7 @@ use OCP\Migration\IRepairStep; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\GenericEvent; -class Repair extends BasicEmitter implements IOutput{ +class Repair implements IOutput{ /* @var IRepairStep[] */ private $repairSteps; /** @var EventDispatcher */ @@ -178,10 +177,11 @@ class Repair extends BasicEmitter implements IOutput{ } /** - * {@inheritDoc} + * @param string $scope + * @param string $method + * @param array $arguments */ public function emit($scope, $method, array $arguments = []) { - parent::emit($scope, $method, $arguments); if (!is_null($this->dispatcher)) { $this->dispatcher->dispatch("$scope::$method", new GenericEvent("$scope::$method", $arguments)); diff --git a/lib/private/updater.php b/lib/private/updater.php index 66f410b779..093ebebbbe 100644 --- a/lib/private/updater.php +++ b/lib/private/updater.php @@ -132,6 +132,8 @@ class Updater extends BasicEmitter { * @return bool true if the operation succeeded, false otherwise */ public function upgrade() { + $this->emitRepairEvents(); + $logLevel = $this->config->getSystemValue('loglevel', \OCP\Util::WARN); $this->emit('\OC\Updater', 'setDebugLogLevel', [ $logLevel, $this->logLevelNames[$logLevel] ]); $this->config->setSystemValue('loglevel', \OCP\Util::DEBUG); @@ -195,26 +197,6 @@ class Updater extends BasicEmitter { && (version_compare($oldVersion, $newVersion, '<=') || $this->config->getSystemValue('debug', false))); } - /** - * Forward messages emitted by the repair routine - * - * @param Repair $repair repair routine - */ - private function emitRepairMessages(Repair $repair) { - $repair->listen('\OC\Repair', 'warning', function ($description) { - $this->emit('\OC\Updater', 'repairWarning', array($description)); - }); - $repair->listen('\OC\Repair', 'error', function ($description) { - $this->emit('\OC\Updater', 'repairError', array($description)); - }); - $repair->listen('\OC\Repair', 'info', function ($description) { - $this->emit('\OC\Updater', 'repairInfo', array($description)); - }); - $repair->listen('\OC\Repair', 'step', function ($description) { - $this->emit('\OC\Updater', 'repairStep', array($description)); - }); - } - /** * runs the update actions in maintenance mode, does not upgrade the source files * except the main .htaccess file @@ -245,8 +227,7 @@ class Updater extends BasicEmitter { file_put_contents($this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/.ocdata', ''); // pre-upgrade repairs - $repair = new Repair(Repair::getBeforeUpgradeRepairSteps()); - $this->emitRepairMessages($repair); + $repair = new Repair(Repair::getBeforeUpgradeRepairSteps(), \OC::$server->getEventDispatcher()); $repair->run(); // simulate DB upgrade @@ -278,8 +259,7 @@ class Updater extends BasicEmitter { } // post-upgrade repairs - $repair = new Repair(Repair::getRepairSteps()); - $this->emitRepairMessages($repair); + $repair = new Repair(Repair::getRepairSteps(), \OC::$server->getEventDispatcher()); $repair->run(); //Invalidate update feed @@ -362,7 +342,6 @@ class Updater extends BasicEmitter { * @throws NeedsUpdateException */ protected function doAppUpgrade() { - $this->emitRepairEvents(); $apps = \OC_App::getEnabledApps(); $priorityTypes = array('authentication', 'filesystem', 'logging'); $pseudoOtherType = 'other'; diff --git a/tests/lib/RepairTest.php b/tests/lib/RepairTest.php new file mode 100644 index 0000000000..9ae1318eb3 --- /dev/null +++ b/tests/lib/RepairTest.php @@ -0,0 +1,134 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test; + +use OCP\Migration\IRepairStep; +use Symfony\Component\EventDispatcher\EventDispatcher; + +class TestRepairStep implements IRepairStep { + private $warning; + + public function __construct($warning = false) { + $this->warning = $warning; + } + + public function getName() { + return 'Test Name'; + } + + public function run(\OCP\Migration\IOutput $out) { + if ($this->warning) { + $out->warning('Simulated warning'); + } + else { + $out->info('Simulated info'); + } + } +} + +class RepairTest extends TestCase { + /** @var \OC\Repair */ + private $repair; + + /** @var string[] */ + private $outputArray; + + public function setUp() { + parent::setUp(); + $dispatcher = new EventDispatcher(); + $this->repair = new \OC\Repair([], $dispatcher); + + $dispatcher->addListener('\OC\Repair::warning', function ($event) { + /** @var \Symfony\Component\EventDispatcher\GenericEvent $event */ + $this->outputArray[] = 'warning: ' . $event->getArgument(0); + }); + $dispatcher->addListener('\OC\Repair::info', function ($event) { + /** @var \Symfony\Component\EventDispatcher\GenericEvent $event */ + $this->outputArray[] = 'info: ' . $event->getArgument(0); + }); + $dispatcher->addListener('\OC\Repair::step', function ($event) { + /** @var \Symfony\Component\EventDispatcher\GenericEvent $event */ + $this->outputArray[] = 'step: ' . $event->getArgument(0); + }); + } + + public function testRunRepairStep() { + + $this->repair->addStep(new TestRepairStep(false)); + $this->repair->run(); + + $this->assertEquals( + array( + 'step: Test Name', + 'info: Simulated info', + ), + $this->outputArray + ); + } + + public function testRunRepairStepThatFail() { + + $this->repair->addStep(new TestRepairStep(true)); + $this->repair->run(); + + $this->assertEquals( + array( + 'step: Test Name', + 'warning: Simulated warning', + ), + $this->outputArray + ); + } + + public function testRunRepairStepsWithException() { + $mock = $this->getMock('\Test\TestRepairStep'); + $mock->expects($this->any()) + ->method('run') + ->will($this->throwException(new \Exception())); + $mock->expects($this->any()) + ->method('getName') + ->will($this->returnValue('Exception Test')); + + $this->repair->addStep($mock); + $this->repair->addStep(new TestRepairStep(false)); + + $thrown = false; + try { + $this->repair->run(); + } + catch (\Exception $e) { + $thrown = true; + } + + $this->assertTrue($thrown); + // jump out after exception + $this->assertEquals( + array( + 'step: Exception Test', + ), + $this->outputArray + ); + } + + public function testRunRepairStepsContinueAfterWarning() { + $this->repair->addStep(new TestRepairStep(true)); + $this->repair->addStep(new TestRepairStep(false)); + $this->repair->run(); + + $this->assertEquals( + array( + 'step: Test Name', + 'warning: Simulated warning', + 'step: Test Name', + 'info: Simulated info', + ), + $this->outputArray + ); + } +} diff --git a/tests/lib/repair.php b/tests/lib/repair.php deleted file mode 100644 index a598d3c1a2..0000000000 --- a/tests/lib/repair.php +++ /dev/null @@ -1,159 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -use OCP\Migration\IRepairStep; - -class TestRepairStep implements IRepairStep { - private $warning; - - public function __construct($warning = false) { - $this->warning = $warning; - } - - public function getName() { - return 'Test Name'; - } - - public function run(\OCP\Migration\IOutput $out) { - if ($this->warning) { - $out->warning('Simulated warning'); - } - else { - $out->info('Simulated info'); - } - } -} - -class Test_Repair extends \Test\TestCase { - public function testRunRepairStep() { - $output = array(); - - $repair = new \OC\Repair(); - $repair->addStep(new TestRepairStep(false)); - - $repair->listen('\OC\Repair', 'warning', function ($description) use (&$output) { - $output[] = 'warning: ' . $description; - }); - $repair->listen('\OC\Repair', 'info', function ($description) use (&$output) { - $output[] = 'info: ' . $description; - }); - $repair->listen('\OC\Repair', 'step', function ($description) use (&$output) { - $output[] = 'step: ' . $description; - }); - - $repair->run(); - - $this->assertEquals( - array( - 'step: Test Name', - 'info: Simulated info', - ), - $output - ); - } - - public function testRunRepairStepThatFail() { - $output = array(); - - $repair = new \OC\Repair(); - $repair->addStep(new TestRepairStep(true)); - - $repair->listen('\OC\Repair', 'warning', function ($description) use (&$output) { - $output[] = 'warning: ' . $description; - }); - $repair->listen('\OC\Repair', 'info', function ($description) use (&$output) { - $output[] = 'info: ' . $description; - }); - $repair->listen('\OC\Repair', 'step', function ($description) use (&$output) { - $output[] = 'step: ' . $description; - }); - - $repair->run(); - - $this->assertEquals( - array( - 'step: Test Name', - 'warning: Simulated warning', - ), - $output - ); - } - - public function testRunRepairStepsWithException() { - $output = array(); - - $mock = $this->getMock('TestRepairStep'); - $mock->expects($this->any()) - ->method('run') - ->will($this->throwException(new Exception)); - $mock->expects($this->any()) - ->method('getName') - ->will($this->returnValue('Exception Test')); - - $repair = new \OC\Repair(); - $repair->addStep($mock); - $repair->addStep(new TestRepairStep(false)); - - $repair->listen('\OC\Repair', 'warning', function ($description) use (&$output) { - $output[] = 'warning: ' . $description; - }); - $repair->listen('\OC\Repair', 'info', function ($description) use (&$output) { - $output[] = 'info: ' . $description; - }); - $repair->listen('\OC\Repair', 'step', function ($description) use (&$output) { - $output[] = 'step: ' . $description; - }); - - $thrown = false; - try { - $repair->run(); - } - catch (Exception $e) { - $thrown = true; - } - - $this->assertTrue($thrown); - // jump out after exception - $this->assertEquals( - array( - 'step: Exception Test', - ), - $output - ); - } - - public function testRunRepairStepsContinueAfterWarning() { - $output = array(); - - $repair = new \OC\Repair(); - $repair->addStep(new TestRepairStep(true)); - $repair->addStep(new TestRepairStep(false)); - - $repair->listen('\OC\Repair', 'warning', function ($description) use (&$output) { - $output[] = 'warning: ' . $description; - }); - $repair->listen('\OC\Repair', 'info', function ($description) use (&$output) { - $output[] = 'info: ' . $description; - }); - $repair->listen('\OC\Repair', 'step', function ($description) use (&$output) { - $output[] = 'step: ' . $description; - }); - - $repair->run(); - - $this->assertEquals( - array( - 'step: Test Name', - 'warning: Simulated warning', - 'step: Test Name', - 'info: Simulated info', - ), - $output - ); - } -} From 821d8736c89eae3ad35c0ddc726a583b0c0cf99c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 27 Apr 2016 12:21:31 +0200 Subject: [PATCH 3/4] Adding progress to web upgrade --- core/ajax/update.php | 64 +++++++++++++++++++++++++--- lib/private/Repair/DropOldTables.php | 2 +- lib/private/repair.php | 12 ++++-- lib/public/migration/ioutput.php | 3 +- 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/core/ajax/update.php b/core/ajax/update.php index 0e6c1176ac..f673467f64 100644 --- a/core/ajax/update.php +++ b/core/ajax/update.php @@ -39,6 +39,56 @@ $eventSource = \OC::$server->createEventSource(); // message $eventSource->send('success', (string)$l->t('Preparing update')); +class FeedBackHandler { + /** @var integer */ + private $progressStateMax = 100; + /** @var integer */ + private $progressStateStep = 0; + /** @var string */ + private $currentStep; + + public function __construct(\OCP\IEventSource $eventSource, \OCP\IL10N $l10n) { + $this->eventSource = $eventSource; + $this->l10n = $l10n; + } + + public function handleRepairFeedback($event) { + if (!$event instanceof GenericEvent) { + return; + } + + switch ($event->getSubject()) { + case '\OC\Repair::startProgress': + $this->progressStateMax = $event->getArgument(0); + $this->progressStateStep = 0; + $this->currentStep = $event->getArgument(1); + break; + case '\OC\Repair::advance': + $this->progressStateStep += $event->getArgument(0); + $desc = $event->getArgument(1); + if (empty($desc)) { + $desc = $this->currentStep; + } + $this->eventSource->send('success', (string)$this->l10n->t('[%d / %d]: %s', [$this->progressStateStep, $this->progressStateMax, $desc])); + break; + case '\OC\Repair::finishProgress': + $this->progressStateMax = $this->progressStateStep; + $this->eventSource->send('success', (string)$this->l10n->t('[%d / %d]: %s', [$this->progressStateStep, $this->progressStateMax, $this->currentStep])); + break; + case '\OC\Repair::step': + break; + case '\OC\Repair::info': + break; + case '\OC\Repair::warning': + $this->eventSource->send('notice', (string)$this->l10n->t('Repair warning: ') . $event->getArgument(0)); + break; + case '\OC\Repair::error': + $this->eventSource->send('notice', (string)$this->l10n->t('Repair error: ') . $event->getArgument(0)); + break; + } + } +} + if (OC::checkUpgrade(false)) { $config = \OC::$server->getSystemConfig(); @@ -73,6 +123,14 @@ if (OC::checkUpgrade(false)) { $eventSource->send('success', (string)$l->t('[%d / %d]: Checking table %s', [$event[0], $event[1], $event->getSubject()])); } }); + $feedBack = new FeedBackHandler($eventSource, $l); + $dispatcher->addListener('\OC\Repair::startProgress', [$feedBack, 'handleRepairFeedback']); + $dispatcher->addListener('\OC\Repair::advance', [$feedBack, 'handleRepairFeedback']); + $dispatcher->addListener('\OC\Repair::finishProgress', [$feedBack, 'handleRepairFeedback']); + $dispatcher->addListener('\OC\Repair::step', [$feedBack, 'handleRepairFeedback']); + $dispatcher->addListener('\OC\Repair::info', [$feedBack, 'handleRepairFeedback']); + $dispatcher->addListener('\OC\Repair::warning', [$feedBack, 'handleRepairFeedback']); + $dispatcher->addListener('\OC\Repair::error', [$feedBack, 'handleRepairFeedback']); $updater->listen('\OC\Updater', 'maintenanceEnabled', function () use ($eventSource, $l) { $eventSource->send('success', (string)$l->t('Turned on maintenance mode')); @@ -107,12 +165,6 @@ if (OC::checkUpgrade(false)) { $updater->listen('\OC\Updater', 'appUpgrade', function ($app, $version) use ($eventSource, $l) { $eventSource->send('success', (string)$l->t('Updated "%s" to %s', array($app, $version))); }); - $updater->listen('\OC\Updater', 'repairWarning', function ($description) use ($eventSource, $l) { - $eventSource->send('notice', (string)$l->t('Repair warning: ') . $description); - }); - $updater->listen('\OC\Updater', 'repairError', function ($description) use ($eventSource, $l) { - $eventSource->send('notice', (string)$l->t('Repair error: ') . $description); - }); $updater->listen('\OC\Updater', 'incompatibleAppDisabled', function ($app) use (&$incompatibleApps) { $incompatibleApps[]= $app; }); diff --git a/lib/private/Repair/DropOldTables.php b/lib/private/Repair/DropOldTables.php index 59e8487c2a..b9963b5077 100644 --- a/lib/private/Repair/DropOldTables.php +++ b/lib/private/Repair/DropOldTables.php @@ -61,7 +61,7 @@ class DropOldTables implements IRepairStep { if ($this->connection->tableExists($tableName)){ $this->connection->dropTable($tableName); } - $output->advance(); + $output->advance(1, "Drop old database table: $tableName"); } $output->finishProgress(); } diff --git a/lib/private/repair.php b/lib/private/repair.php index c6887ab5ce..590b0bee72 100644 --- a/lib/private/repair.php +++ b/lib/private/repair.php @@ -55,6 +55,8 @@ class Repair implements IOutput{ private $repairSteps; /** @var EventDispatcher */ private $dispatcher; + /** @var string */ + private $currentStep; /** * Creates a new repair step runner @@ -78,7 +80,8 @@ class Repair implements IOutput{ } // run each repair step foreach ($this->repairSteps as $step) { - $this->emit('\OC\Repair', 'step', array($step->getName())); + $this->currentStep = $step->getName(); + $this->emit('\OC\Repair', 'step', [$this->currentStep]); if ($step instanceof Emitter) { $step->listen('\OC\Repair', 'warning', function ($description) use ($self) { @@ -206,15 +209,16 @@ class Repair implements IOutput{ */ public function startProgress($max = 0) { // for now just emit as we did in the past - $this->emit('\OC\Repair', 'startProgress', [$max]); + $this->emit('\OC\Repair', 'startProgress', [$max, $this->currentStep]); } /** * @param int $step + * @param string $description */ - public function advance($step = 1) { + public function advance($step = 1, $description = '') { // for now just emit as we did in the past - $this->emit('\OC\Repair', 'advance', [$step]); + $this->emit('\OC\Repair', 'advance', [$step, $description]); } /** diff --git a/lib/public/migration/ioutput.php b/lib/public/migration/ioutput.php index c52f13b31d..d3b4302849 100644 --- a/lib/public/migration/ioutput.php +++ b/lib/public/migration/ioutput.php @@ -48,9 +48,10 @@ interface IOutput { /** * @param int $step + * @param string $description * @since 9.1.0 */ - public function advance($step = 1); + public function advance($step = 1, $description = ''); /** * @param int $max From 7ad1d491f488a5c949e9c8b146d243cdd72e4d38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 27 Apr 2016 13:19:00 +0200 Subject: [PATCH 4/4] Adding progress to occ upgrade --- core/Command/Upgrade.php | 66 +++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/core/Command/Upgrade.php b/core/Command/Upgrade.php index 1001962c6a..d61acf0451 100644 --- a/core/Command/Upgrade.php +++ b/core/Command/Upgrade.php @@ -162,8 +162,59 @@ class Upgrade extends Command { } } }; + $repairListener = function($event) use ($progress, $output) { + if (!$event instanceof GenericEvent) { + return; + } + switch ($event->getSubject()) { + case '\OC\Repair::startProgress': + $progress->setMessage('Starting ...'); + $output->writeln($event->getArgument(1)); + $output->writeln(''); + $progress->start($event->getArgument(0)); + break; + case '\OC\Repair::advance': + $desc = $event->getArgument(1); + if (!empty($desc)) { + $progress->setMessage($desc); + } + $progress->advance($event->getArgument(0)); + + break; + case '\OC\Repair::finishProgress': + $progress->setMessage('Done'); + $progress->finish(); + $output->writeln(''); + break; + case '\OC\Repair::step': + if(OutputInterface::VERBOSITY_NORMAL < $output->getVerbosity()) { + $output->writeln('Repair step: ' . $event->getArgument(0) . ''); + } + break; + case '\OC\Repair::info': + if(OutputInterface::VERBOSITY_NORMAL < $output->getVerbosity()) { + $output->writeln('Repair info: ' . $event->getArgument(0) . ''); + } + break; + case '\OC\Repair::warning': + $output->writeln('Repair warning: ' . $event->getArgument(0) . ''); + break; + case '\OC\Repair::error': + $output->writeln('Repair error: ' . $event->getArgument(0) . ''); + break; + } + }; + $dispatcher->addListener('\OC\DB\Migrator::executeSql', $listener); $dispatcher->addListener('\OC\DB\Migrator::checkTable', $listener); + $dispatcher->addListener('\OC\Repair::startProgress', $repairListener); + $dispatcher->addListener('\OC\Repair::advance', $repairListener); + $dispatcher->addListener('\OC\Repair::finishProgress', $repairListener); + $dispatcher->addListener('\OC\Repair::step', $repairListener); + $dispatcher->addListener('\OC\Repair::info', $repairListener); + $dispatcher->addListener('\OC\Repair::warning', $repairListener); + $dispatcher->addListener('\OC\Repair::error', $repairListener); + $updater->listen('\OC\Updater', 'maintenanceEnabled', function () use($output) { $output->writeln('Turned on maintenance mode'); @@ -205,12 +256,6 @@ class Upgrade extends Command { $updater->listen('\OC\Updater', 'upgradeAppStoreApp', function ($app) use($output) { $output->writeln('Update 3rd-party app: ' . $app . ''); }); - $updater->listen('\OC\Updater', 'repairWarning', function ($app) use($output) { - $output->writeln('Repair warning: ' . $app . ''); - }); - $updater->listen('\OC\Updater', 'repairError', function ($app) use($output) { - $output->writeln('Repair error: ' . $app . ''); - }); $updater->listen('\OC\Updater', 'appUpgradeCheckBefore', function () use ($output) { $output->writeln('Checking updates of apps'); }); @@ -242,15 +287,6 @@ class Upgrade extends Command { $output->writeln("Finished code integrity check"); }); - if(OutputInterface::VERBOSITY_NORMAL < $output->getVerbosity()) { - $updater->listen('\OC\Updater', 'repairInfo', function ($message) use($output) { - $output->writeln('Repair info: ' . $message . ''); - }); - $updater->listen('\OC\Updater', 'repairStep', function ($message) use($output) { - $output->writeln('Repair step: ' . $message . ''); - }); - } - $success = $updater->upgrade(); $this->postUpgradeCheck($input, $output);