* @author Joas Schilling * @author Morris Jobke * @author Robin Appelman * @author Victor Dubiniuk * * @license AGPL-3.0 * * This code is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * 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, version 3, * along with this program. If not, see * */ namespace OC\Core\Command\App; use OC\Core\Command\Base; use OCP\App\IAppManager; use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class ListApps extends Base { protected IAppManager $manager; public function __construct(IAppManager $manager) { parent::__construct(); $this->manager = $manager; } protected function configure() { parent::configure(); $this ->setName('app:list') ->setDescription('List all available apps') ->addOption( 'shipped', null, InputOption::VALUE_REQUIRED, 'true - limit to shipped apps only, false - limit to non-shipped apps only' ) ; } protected function execute(InputInterface $input, OutputInterface $output): int { if ($input->getOption('shipped') === 'true' || $input->getOption('shipped') === 'false') { $shippedFilter = $input->getOption('shipped') === 'true'; } else { $shippedFilter = null; } $apps = \OC_App::getAllApps(); $enabledApps = $disabledApps = []; $versions = \OC_App::getAppVersions(); //sort enabled apps above disabled apps foreach ($apps as $app) { if ($shippedFilter !== null && $this->manager->isShipped($app) !== $shippedFilter) { continue; } if ($this->manager->isInstalled($app)) { $enabledApps[] = $app; } else { $disabledApps[] = $app; } } $apps = ['enabled' => [], 'disabled' => []]; sort($enabledApps); foreach ($enabledApps as $app) { $apps['enabled'][$app] = $versions[$app] ?? true; } sort($disabledApps); foreach ($disabledApps as $app) { $apps['disabled'][$app] = $this->manager->getAppVersion($app) . (isset($versions[$app]) ? ' (installed ' . $versions[$app] . ')' : ''); } $this->writeAppList($input, $output, $apps); return 0; } /** * @param InputInterface $input * @param OutputInterface $output * @param array $items */ protected function writeAppList(InputInterface $input, OutputInterface $output, $items) { switch ($input->getOption('output')) { case self::OUTPUT_FORMAT_PLAIN: $output->writeln('Enabled:'); parent::writeArrayInOutputFormat($input, $output, $items['enabled']); $output->writeln('Disabled:'); parent::writeArrayInOutputFormat($input, $output, $items['disabled']); break; default: parent::writeArrayInOutputFormat($input, $output, $items); break; } } /** * @param string $optionName * @param CompletionContext $context * @return array */ public function completeOptionValues($optionName, CompletionContext $context) { if ($optionName === 'shipped') { return ['true', 'false']; } return []; } /** * @param string $argumentName * @param CompletionContext $context * @return string[] */ public function completeArgumentValues($argumentName, CompletionContext $context) { return []; } }