]> source.dussan.org Git - nextcloud-server.git/commitdiff
move get/delete commands to files namespace, make get take the output as argument...
authorRobin Appelman <robin@icewind.nl>
Fri, 28 Apr 2023 15:13:20 +0000 (17:13 +0200)
committerRobin Appelman <robin@icewind.nl>
Thu, 4 May 2023 16:21:58 +0000 (18:21 +0200)
Signed-off-by: Robin Appelman <robin@icewind.nl>
apps/files/appinfo/info.xml
apps/files/composer/composer/autoload_classmap.php
apps/files/composer/composer/autoload_static.php
apps/files/lib/Command/Delete.php [new file with mode: 0644]
apps/files/lib/Command/Get.php [new file with mode: 0644]
core/Command/Info/Delete.php [deleted file]
core/Command/Info/Get.php [deleted file]
core/register_command.php

index 985a26f6611cca220b34bf9a8d3e370c1a297582..77e90a9cbb4dc0185efbd8e11ad540aa0790d8a6 100644 (file)
@@ -35,6 +35,8 @@
                <command>OCA\Files\Command\TransferOwnership</command>
                <command>OCA\Files\Command\ScanAppData</command>
                <command>OCA\Files\Command\RepairTree</command>
+               <command>OCA\Files\Command\Get</command>
+               <command>OCA\Files\Command\Delete</command>
        </commands>
 
        <activity>
index 868014ecfe743f04e2cecf8044e1702ba838974c..686f1b6cd5e52ef2eeb35d4cd1daac4f4fd1e4aa 100644 (file)
@@ -27,7 +27,9 @@ return array(
     'OCA\\Files\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
     'OCA\\Files\\Collaboration\\Resources\\Listener' => $baseDir . '/../lib/Collaboration/Resources/Listener.php',
     'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => $baseDir . '/../lib/Collaboration/Resources/ResourceProvider.php',
+    'OCA\\Files\\Command\\Delete' => $baseDir . '/../lib/Command/Delete.php',
     'OCA\\Files\\Command\\DeleteOrphanedFiles' => $baseDir . '/../lib/Command/DeleteOrphanedFiles.php',
+    'OCA\\Files\\Command\\Get' => $baseDir . '/../lib/Command/Get.php',
     'OCA\\Files\\Command\\RepairTree' => $baseDir . '/../lib/Command/RepairTree.php',
     'OCA\\Files\\Command\\Scan' => $baseDir . '/../lib/Command/Scan.php',
     'OCA\\Files\\Command\\ScanAppData' => $baseDir . '/../lib/Command/ScanAppData.php',
index 0946a5c39c2021cf51fc43cce92f84f06878cd12..5ce8d048b384d37b25730b539a78bd9768201d52 100644 (file)
@@ -42,7 +42,9 @@ class ComposerStaticInitFiles
         'OCA\\Files\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
         'OCA\\Files\\Collaboration\\Resources\\Listener' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/Listener.php',
         'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/ResourceProvider.php',
+        'OCA\\Files\\Command\\Delete' => __DIR__ . '/..' . '/../lib/Command/Delete.php',
         'OCA\\Files\\Command\\DeleteOrphanedFiles' => __DIR__ . '/..' . '/../lib/Command/DeleteOrphanedFiles.php',
+        'OCA\\Files\\Command\\Get' => __DIR__ . '/..' . '/../lib/Command/Get.php',
         'OCA\\Files\\Command\\RepairTree' => __DIR__ . '/..' . '/../lib/Command/RepairTree.php',
         'OCA\\Files\\Command\\Scan' => __DIR__ . '/..' . '/../lib/Command/Scan.php',
         'OCA\\Files\\Command\\ScanAppData' => __DIR__ . '/..' . '/../lib/Command/ScanAppData.php',
diff --git a/apps/files/lib/Command/Delete.php b/apps/files/lib/Command/Delete.php
new file mode 100644 (file)
index 0000000..c05fa57
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Info\FileUtils;
+use OCA\Files_Sharing\SharedStorage;
+use OCP\Files\Folder;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Delete extends Command {
+       private FileUtils $fileUtils;
+
+       public function __construct(FileUtils $fileUtils) {
+               $this->fileUtils = $fileUtils;
+               parent::__construct();
+       }
+
+       protected function configure(): void {
+               $this
+                       ->setName('files:delete')
+                       ->setDescription('Delete a file or folder')
+                       ->addArgument('file', InputArgument::REQUIRED, "File id or path")
+                       ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for configuration and don't output any warnings");
+       }
+
+       public function execute(InputInterface $input, OutputInterface $output): int {
+               $fileInput = $input->getArgument('file');
+               $inputIsId = is_numeric($fileInput);
+               $force = $input->getOption('force');
+               $node = $this->fileUtils->getNode($fileInput);
+
+               if (!$node) {
+                       $output->writeln("<error>file $fileInput not found</error>");
+                       return 1;
+               }
+
+               $deleteConfirmed = $force;
+               if (!$deleteConfirmed) {
+                       /** @var QuestionHelper $helper */
+                       $helper = $this->getHelper('question');
+                       $storage = $node->getStorage();
+                       if (!$inputIsId && $storage->instanceOfStorage(SharedStorage::class) && $node->getInternalPath() === '') {
+                               /** @var SharedStorage $storage */
+                               [,$user] = explode('/', $fileInput, 3);
+                               $question = new ConfirmationQuestion("<info>$fileInput</info> in a shared file, do you want to unshare the file <info>$user</info> instead of deleting the source file? [Y/n] ", true);
+                               if ($helper->ask($input, $output, $question)) {
+                                       $storage->unshareStorage();
+                                       return 0;
+                               } else {
+                                       $node = $storage->getShare()->getNode();
+                                       $output->writeln("");
+                               }
+                       }
+
+                       $filesByUsers = $this->fileUtils->getFilesByUser($node);
+                       if (count($filesByUsers) > 1) {
+                               $output->writeln("Warning: the provided file is accessible by more than one user");
+                               $output->writeln("  all of the following users will lose access to the file when deleted:");
+                               $output->writeln("");
+                               foreach ($filesByUsers as $user => $filesByUser) {
+                                       $output->writeln($user . ":");
+                                       foreach($filesByUser as $file) {
+                                               $output->writeln("  - " . $file->getPath());
+                                       }
+                               }
+                               $output->writeln("");
+                       }
+
+                       if ($node instanceof Folder) {
+                               $maybeContents = " and all it's contents";
+                       } else {
+                               $maybeContents = "";
+                       }
+                       $question = new ConfirmationQuestion("Delete " . $node->getPath() . $maybeContents . "? [y/N] ", false);
+                       $deleteConfirmed = $helper->ask($input, $output, $question);
+               }
+
+               if ($deleteConfirmed) {
+                       if ($node->isDeletable()) {
+                               $node->delete();
+                       } else {
+                               $output->writeln("<error>File cannot be deleted, insufficient permissions.</error>");
+                       }
+               }
+
+               return 0;
+       }
+
+}
diff --git a/apps/files/lib/Command/Get.php b/apps/files/lib/Command/Get.php
new file mode 100644 (file)
index 0000000..2b6c43d
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Files\Command;
+
+
+use OC\Core\Command\Info\FileUtils;
+use OCP\Files\File;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Get extends Command {
+       private FileUtils $fileUtils;
+
+       public function __construct(FileUtils $fileUtils) {
+               $this->fileUtils = $fileUtils;
+               parent::__construct();
+       }
+
+       protected function configure(): void {
+               $this
+                       ->setName('files:get')
+                       ->setDescription('Get the contents of a file')
+                       ->addArgument('file', InputArgument::REQUIRED, "File id or path")
+                       ->addArgument('output', InputArgument::OPTIONAL, "Target file to output to, defaults to STDOUT");
+       }
+
+       public function execute(InputInterface $input, OutputInterface $output): int {
+               $fileInput = $input->getArgument('file');
+               $outputName = $input->getArgument('output');
+               $node = $this->fileUtils->getNode($fileInput);
+
+               if (!$node) {
+                       $output->writeln("<error>file $fileInput not found</error>");
+                       return 1;
+               }
+
+               if ($node instanceof File) {
+                       $isTTY = stream_isatty(STDOUT);
+                       if ($outputName === null && $isTTY && $node->getMimePart() !== 'text') {
+                               $output->writeln([
+                                       "<error>Warning: Binary output can mess up your terminal</error>",
+                                       "         Use <info>occ files:get $fileInput -</info> to output it to the terminal anyway",
+                                       "         Or <info>occ files:get $fileInput <FILE></info> to save to a file instead"
+                               ]);
+                               return 1;
+                       }
+                       $source = $node->fopen('r');
+                       $target = (!$outputName || strtolower($outputName) === '-') ? STDOUT : fopen($outputName, 'w');
+                       stream_copy_to_stream($source, $target);
+                       return 0;
+               } else {
+                       $output->writeln("<error>$fileInput is a directory</error>");
+                       return 1;
+               }
+       }
+
+}
diff --git a/core/Command/Info/Delete.php b/core/Command/Info/Delete.php
deleted file mode 100644 (file)
index 867938b..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
- *
- * @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 <http://www.gnu.org/licenses/>.
- *
- */
-
-namespace OC\Core\Command\Info;
-
-use OCA\Files_Sharing\SharedStorage;
-use OCP\Files\Folder;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Helper\QuestionHelper;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Question\ConfirmationQuestion;
-
-class Delete extends Command {
-       private FileUtils $fileUtils;
-
-       public function __construct(FileUtils $fileUtils) {
-               $this->fileUtils = $fileUtils;
-               parent::__construct();
-       }
-
-       protected function configure(): void {
-               $this
-                       ->setName('info:file:delete')
-                       ->setDescription('Delete a file or folder')
-                       ->addArgument('file', InputArgument::REQUIRED, "File id or path")
-                       ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for configuration and don't output any warnings");
-       }
-
-       public function execute(InputInterface $input, OutputInterface $output): int {
-               $fileInput = $input->getArgument('file');
-               $inputIsId = is_numeric($fileInput);
-               $force = $input->getOption('force');
-               $node = $this->fileUtils->getNode($fileInput);
-
-               if (!$node) {
-                       $output->writeln("<error>file $fileInput not found</error>");
-                       return 1;
-               }
-
-               $deleteConfirmed = $force;
-               if (!$deleteConfirmed) {
-                       /** @var QuestionHelper $helper */
-                       $helper = $this->getHelper('question');
-                       $storage = $node->getStorage();
-                       if (!$inputIsId && $storage->instanceOfStorage(SharedStorage::class) && $node->getInternalPath() === '') {
-                               /** @var SharedStorage $storage */
-                               [,$user] = explode('/', $fileInput, 3);
-                               $question = new ConfirmationQuestion("<info>$fileInput</info> in a shared file, do you want to unshare the file <info>$user</info> instead of deleting the source file? [Y/n] ", true);
-                               if ($helper->ask($input, $output, $question)) {
-                                       $storage->unshareStorage();
-                                       return 0;
-                               } else {
-                                       $node = $storage->getShare()->getNode();
-                                       $output->writeln("");
-                               }
-                       }
-
-                       $filesByUsers = $this->fileUtils->getFilesByUser($node);
-                       if (count($filesByUsers) > 1) {
-                               $output->writeln("Warning: the provided file is accessible by more than one user");
-                               $output->writeln("  all of the following users will lose access to the file when deleted:");
-                               $output->writeln("");
-                               foreach ($filesByUsers as $user => $filesByUser) {
-                                       $output->writeln($user . ":");
-                                       foreach($filesByUser as $file) {
-                                               $output->writeln("  - " . $file->getPath());
-                                       }
-                               }
-                               $output->writeln("");
-                       }
-
-                       if ($node instanceof Folder) {
-                               $maybeContents = " and all it's contents";
-                       } else {
-                               $maybeContents = "";
-                       }
-                       $question = new ConfirmationQuestion("Delete " . $node->getPath() . $maybeContents . "? [y/N] ", false);
-                       $deleteConfirmed = $helper->ask($input, $output, $question);
-               }
-
-               if ($deleteConfirmed) {
-                       if ($node->isDeletable()) {
-                               $node->delete();
-                       } else {
-                               $output->writeln("<error>File cannot be deleted, insufficient permissions.</error>");
-                       }
-               }
-
-               return 0;
-       }
-
-}
diff --git a/core/Command/Info/Get.php b/core/Command/Info/Get.php
deleted file mode 100644 (file)
index f3ab5dd..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
- *
- * @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 <http://www.gnu.org/licenses/>.
- *
- */
-
-namespace OC\Core\Command\Info;
-
-
-use OCP\Files\File;
-use OCP\Util;
-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 Get extends Command {
-       private FileUtils $fileUtils;
-
-       public function __construct(FileUtils $fileUtils) {
-               $this->fileUtils = $fileUtils;
-               parent::__construct();
-       }
-
-       protected function configure(): void {
-               $this
-                       ->setName('info:file:get')
-                       ->setDescription('Get the contents of a file')
-                       ->addArgument('file', InputArgument::REQUIRED, "File id or path")
-                       ->addOption('output', 'o', InputOption::VALUE_REQUIRED, "Target file to output to");
-       }
-
-       public function execute(InputInterface $input, OutputInterface $output): int {
-               $fileInput = $input->getArgument('file');
-               $outputName = $input->getOption('output');
-               $node = $this->fileUtils->getNode($fileInput);
-
-               if (!$node) {
-                       $output->writeln("<error>file $fileInput not found</error>");
-                       return 1;
-               }
-
-               if ($node instanceof File) {
-                       $isTTY = stream_isatty(STDOUT);
-                       if ($outputName === null && $isTTY && $node->getMimePart() !== 'text') {
-                               $output->writeln([
-                                       "<error>Warning: Binary output can mess up your terminal</error>",
-                                       "         Use '--output STDOUT' to output it to the terminal anyway",
-                                       "         Or '--output <FILE>' to save to a file instead"
-                               ]);
-                               return 1;
-                       }
-                       $source = $node->fopen('r');
-                       $target = (!$outputName || strtolower($outputName) === 'stdout') ? STDOUT : fopen($outputName, 'w');
-                       stream_copy_to_stream($source, $target);
-                       return 0;
-               } else {
-                       $output->writeln("<error>$fileInput is a directory</error>");
-                       return 1;
-               }
-       }
-
-}
index dfbaac8655159b85bfa6dc321908db6797581e78..8f600d7b8948865e242e89a8d1c004011f756796 100644 (file)
@@ -105,8 +105,6 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
 
        $application->add(\OC::$server->get(OC\Core\Command\Info\File::class));
        $application->add(\OC::$server->get(OC\Core\Command\Info\Space::class));
-       $application->add(\OC::$server->get(OC\Core\Command\Info\Get::class));
-       $application->add(\OC::$server->get(OC\Core\Command\Info\Delete::class));
 
        $application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory(\OC::$server->getSystemConfig())));
        $application->add(new OC\Core\Command\Db\ConvertMysqlToMB4(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection(), \OC::$server->getURLGenerator(), \OC::$server->get(LoggerInterface::class)));