]> source.dussan.org Git - nextcloud-server.git/commitdiff
add command to write a file
authorRobin Appelman <robin@icewind.nl>
Fri, 28 Apr 2023 15:34:39 +0000 (17:34 +0200)
committerRobin Appelman <robin@icewind.nl>
Wed, 6 Sep 2023 12:41:21 +0000 (14:41 +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
apps/files/lib/Command/Get.php
apps/files/lib/Command/Put.php [new file with mode: 0644]

index 9c3e4351f42936de7da28776ad3065680b973aa3..340ad851d5c5889964425bce24f4563c3007e09d 100644 (file)
@@ -36,6 +36,7 @@
                <command>OCA\Files\Command\ScanAppData</command>
                <command>OCA\Files\Command\RepairTree</command>
                <command>OCA\Files\Command\Get</command>
+               <command>OCA\Files\Command\Put</command>
                <command>OCA\Files\Command\Delete</command>
        </commands>
 
index a86210506150e32c4b98dbf29ed7da7ed133f879..86236b53cd0b8ad57a2a661f9e74ab7e2d083bc5 100644 (file)
@@ -30,6 +30,7 @@ return array(
     '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\\Put' => $baseDir . '/../lib/Command/Put.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 8c99d674bcea88d1ee5b5d4e0d2c76c5a7deaaad..1751499cb25ef5d6305f8b467e8ece2b2fb01b13 100644 (file)
@@ -45,6 +45,7 @@ class ComposerStaticInitFiles
         '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\\Put' => __DIR__ . '/..' . '/../lib/Command/Put.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',
index c05fa573ab3f2ee0a3f4a115318619c1ead89fb5..da53556870232f296f75e3d2ae9b04899f45374c 100644 (file)
@@ -69,7 +69,7 @@ class Delete extends Command {
                        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);
+                               $question = new ConfirmationQuestion("<info>$fileInput</info> in a shared file, do you want to unshare the file from <info>$user</info> instead of deleting the source file? [Y/n] ", true);
                                if ($helper->ask($input, $output, $question)) {
                                        $storage->unshareStorage();
                                        return 0;
index 2b6c43d792f884fd6deed190d27dfcab9ae55f33..29edefa1cfbaef2a7f5929c4fa849e7f3669fb83 100644 (file)
@@ -68,7 +68,7 @@ class Get extends Command {
                                return 1;
                        }
                        $source = $node->fopen('r');
-                       $target = (!$outputName || strtolower($outputName) === '-') ? STDOUT : fopen($outputName, 'w');
+                       $target = (!$outputName || $outputName === '-') ? STDOUT : fopen($outputName, 'w');
                        stream_copy_to_stream($source, $target);
                        return 0;
                } else {
diff --git a/apps/files/lib/Command/Put.php b/apps/files/lib/Command/Put.php
new file mode 100644 (file)
index 0000000..da24bbc
--- /dev/null
@@ -0,0 +1,82 @@
+<?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 OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+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 Put extends Command {
+       private FileUtils $fileUtils;
+       private IRootFolder $rootFolder;
+
+       public function __construct(FileUtils $fileUtils, IRootFolder $rootFolder) {
+               $this->fileUtils = $fileUtils;
+               $this->rootFolder = $rootFolder;
+               parent::__construct();
+       }
+
+       protected function configure(): void {
+               $this
+                       ->setName('files:put')
+                       ->setDescription('Write contents of a file')
+                       ->addArgument('input', InputArgument::REQUIRED, "Source file to write, use - to read from STDIN")
+                       ->addArgument('file', InputArgument::REQUIRED, "File path to write to or fileid of existing file");
+       }
+
+       public function execute(InputInterface $input, OutputInterface $output): int {
+               $fileOutput = $input->getArgument('file');
+               $inputName = $input->getArgument('input');
+               $node = $this->fileUtils->getNode($fileOutput);
+
+               if ($node instanceof Folder) {
+                       $output->writeln("<error>$fileOutput is a folder</error>");
+                       return 1;
+               }
+               if (!$node and is_numeric($fileOutput)) {
+                       $output->writeln("<error>$fileOutput not found</error>");
+                       return 1;
+               }
+
+               $source = (!$inputName || $inputName === '-') ? STDIN : fopen($inputName, 'r');
+               if (!$source) {
+                       $output->writeln("<error>Failed to open $inputName</error>");
+                       return 1;
+               }
+               if ($node instanceof File) {
+                       $target = $node->fopen('w');
+                       stream_copy_to_stream($source, $target);
+               } else {
+                       $this->rootFolder->newFile($fileOutput, $source);
+               }
+               return 0;
+       }
+
+}