* @author michag86 * @author Morris Jobke * @author Roeland Jago Douma * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ namespace OC\Core\Command\App; use OC\Installer; use OCP\App\IAppManager; use OCP\ILogger; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class Update extends Command { /** @var IAppManager */ protected $manager; /** @var Installer */ private $installer; /** @var ILogger */ private $logger; /** * @param IAppManager $manager * @param Installer $installer */ public function __construct(IAppManager $manager, Installer $installer, ILogger $logger) { parent::__construct(); $this->manager = $manager; $this->installer = $installer; $this->logger = $logger; } protected function configure() { $this ->setName('app:update') ->setDescription('update an app or all apps') ->addArgument( 'app-id', InputArgument::OPTIONAL, 'update the specified app' ) ->addOption( 'all', null, InputOption::VALUE_NONE, 'update all updatable apps' ) ->addOption( 'showonly', null, InputOption::VALUE_NONE, 'show update(s) without updating' ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $singleAppId = $input->getArgument('app-id'); if ($singleAppId) { $apps = [$singleAppId]; try { $this->manager->getAppPath($singleAppId); } catch (\OCP\App\AppPathNotFoundException $e) { $output->writeln($singleAppId . ' not installed'); return 1; } } else if ($input->getOption('all') || $input->getOption('showonly')) { $apps = \OC_App::getAllApps(); } else { $output->writeln("Please specify an app to update or \"--all\" to update all updatable apps\""); return 1; } $return = 0; foreach ($apps as $appId) { $newVersion = $this->installer->isUpdateAvailable($appId); if ($newVersion) { $output->writeln($appId . ' new version available: ' . $newVersion); if (!$input->getOption('showonly')) { try { $result = $this->installer->updateAppstoreApp($appId); } catch(\Exception $e) { $this->logger->logException($e, ['message' => 'Failure during update of app "' . $appId . '"','app' => 'app:update']); $output->writeln('Error: ' . $e->getMessage()); $return = 1; } if ($result === false) { $output->writeln($appId . ' couldn\'t be updated'); $return = 1; } else if($result === true) { $output->writeln($appId . ' updated'); } } } } return $return; } }