From 5fecb00a2dfe53e6a5709fc56b2beca4779ffa49 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 25 Feb 2026 18:19:58 +0100 Subject: [PATCH] feat: add output options and '--cached-only' to list mounts command Signed-off-by: Robin Appelman --- apps/files/lib/Command/Mount/ListMounts.php | 86 ++++++++++++++------- 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/apps/files/lib/Command/Mount/ListMounts.php b/apps/files/lib/Command/Mount/ListMounts.php index b4abeac5ab8..487e769ad2c 100644 --- a/apps/files/lib/Command/Mount/ListMounts.php +++ b/apps/files/lib/Command/Mount/ListMounts.php @@ -8,17 +8,18 @@ declare(strict_types=1); namespace OCA\Files\Command\Mount; +use OC\Core\Command\Base; use OCP\Files\Config\ICachedMountInfo; use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Config\IUserMountCache; use OCP\Files\Mount\IMountPoint; use OCP\IUserManager; -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 ListMounts extends Command { +class ListMounts extends Base { public function __construct( private readonly IUserManager $userManager, private readonly IUserMountCache $userMountCache, @@ -28,52 +29,81 @@ class ListMounts extends Command { } protected function configure(): void { + parent::configure(); $this ->setName('files:mount:list') ->setDescription('List of mounts for a user') - ->addArgument('user', InputArgument::REQUIRED, 'User to list mounts for'); + ->addArgument('user', InputArgument::REQUIRED, 'User to list mounts for') + ->addOption('cached-only', null, InputOption::VALUE_NONE, 'Only return cached mounts, prevents filesystem setup'); } public function execute(InputInterface $input, OutputInterface $output): int { $userId = $input->getArgument('user'); + $cachedOnly = $input->getOption('cached-only'); $user = $this->userManager->get($userId); if (!$user) { $output->writeln("User $userId not found"); return 1; } - $mounts = $this->mountProviderCollection->getMountsForUser($user); - $mounts[] = $this->mountProviderCollection->getHomeMountForUser($user); - /** @var array $cachedByMountpoint */ - $mountsByMountpoint = array_combine(array_map(fn (IMountPoint $mount) => $mount->getMountPoint(), $mounts), $mounts); + if ($cachedOnly) { + $mounts = []; + } else { + $mounts = $this->mountProviderCollection->getMountsForUser($user); + $mounts[] = $this->mountProviderCollection->getHomeMountForUser($user); + } + /** @var array $cachedByMountPoint */ + $mountsByMountPoint = array_combine(array_map(fn (IMountPoint $mount) => $mount->getMountPoint(), $mounts), $mounts); usort($mounts, fn (IMountPoint $a, IMountPoint $b) => $a->getMountPoint() <=> $b->getMountPoint()); $cachedMounts = $this->userMountCache->getMountsForUser($user); usort($cachedMounts, fn (ICachedMountInfo $a, ICachedMountInfo $b) => $a->getMountPoint() <=> $b->getMountPoint()); /** @var array $cachedByMountpoint */ - $cachedByMountpoint = array_combine(array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts), $cachedMounts); + $cachedByMountPoint = array_combine(array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts), $cachedMounts); - foreach ($mounts as $mount) { - $output->writeln('' . $mount->getMountPoint() . ': ' . $mount->getStorageId()); - if (isset($cachedByMountpoint[$mount->getMountPoint()])) { - $cached = $cachedByMountpoint[$mount->getMountPoint()]; - $output->writeln("\t- provider: " . $cached->getMountProvider()); - $output->writeln("\t- storage id: " . $cached->getStorageId()); - $output->writeln("\t- root id: " . $cached->getRootId()); - } else { - $output->writeln("\tnot registered"); - } - } - foreach ($cachedMounts as $cachedMount) { - if (!isset($mountsByMountpoint[$cachedMount->getMountPoint()])) { - $output->writeln('' . $cachedMount->getMountPoint() . ':'); - $output->writeln("\tregistered but no longer provided"); - $output->writeln("\t- provider: " . $cachedMount->getMountProvider()); - $output->writeln("\t- storage id: " . $cachedMount->getStorageId()); - $output->writeln("\t- root id: " . $cachedMount->getRootId()); - } - } + $format = $input->getOption('output'); + if ($format === self::OUTPUT_FORMAT_PLAIN) { + foreach ($mounts as $mount) { + $output->writeln('' . $mount->getMountPoint() . ': ' . $mount->getStorageId()); + if (isset($cachedByMountPoint[$mount->getMountPoint()])) { + $cached = $cachedByMountPoint[$mount->getMountPoint()]; + $output->writeln("\t- provider: " . $cached->getMountProvider()); + $output->writeln("\t- storage id: " . $cached->getStorageId()); + $output->writeln("\t- root id: " . $cached->getRootId()); + } else { + $output->writeln("\tnot registered"); + } + } + foreach ($cachedMounts as $cachedMount) { + if ($cachedOnly || !isset($mountsByMountPoint[$cachedMount->getMountPoint()])) { + $output->writeln('' . $cachedMount->getMountPoint() . ':'); + if (!$cachedOnly) { + $output->writeln("\tregistered but no longer provided"); + } + $output->writeln("\t- provider: " . $cachedMount->getMountProvider()); + $output->writeln("\t- storage id: " . $cachedMount->getStorageId()); + $output->writeln("\t- root id: " . $cachedMount->getRootId()); + } + } + } else { + $cached = array_map(fn (ICachedMountInfo $cachedMountInfo) => [ + 'mountpoint' => $cachedMountInfo->getMountPoint(), + 'provider' => $cachedMountInfo->getMountProvider(), + 'storage_id' => $cachedMountInfo->getStorageId(), + 'root_id' => $cachedMountInfo->getRootId(), + ], $cachedMounts); + $provided = array_map(fn (IMountPoint $cachedMountInfo) => [ + 'mountpoint' => $cachedMountInfo->getMountPoint(), + 'provider' => $cachedMountInfo->getMountProvider(), + 'storage_id' => $cachedMountInfo->getStorageId(), + 'root_id' => $cachedMountInfo->getStorageRootId(), + ], $mounts); + $this->writeArrayInOutputFormat($input, $output, array_filter([ + 'cached' => $cached, + 'provided' => $cachedOnly ? null : $provided, + ])); + } return 0; }