]> 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>
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
apps/files/lib/Command/Get.php
apps/files/lib/Command/Put.php [new file with mode: 0644]

index 77e90a9cbb4dc0185efbd8e11ad540aa0790d8a6..5d9e630704daeb656b14a4a2c0d5ada8dfe6aa36 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 686f1b6cd5e52ef2eeb35d4cd1daac4f4fd1e4aa..2f99d4a88decba7e224fc7eee8394ed9e43b43d5 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 5ce8d048b384d37b25730b539a78bd9768201d52..e7b822e386dbe76f022c114bd11045581e679885 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;
+       }
+
+}