From d11f01fa0f2228bb36e7b1a46cd80cec8bf1baac Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 24 Mar 2015 15:00:36 +0100 Subject: [PATCH] Add `getNonExistingName()` to the node api --- lib/private/files/node/folder.php | 12 +++++++++++ lib/public/files/folder.php | 9 ++++++++ tests/lib/files/node/folder.php | 36 +++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/lib/private/files/node/folder.php b/lib/private/files/node/folder.php index 5fd73cc5d36..18a93913f06 100644 --- a/lib/private/files/node/folder.php +++ b/lib/private/files/node/folder.php @@ -389,4 +389,16 @@ class Folder extends Node implements \OCP\Files\Folder { throw new NotPermittedException(); } } + + /** + * Add a suffix to the name in case the file exists + * + * @param string $name + * @return string + * @throws NotPermittedException + */ + public function getNonExistingName($name) { + $uniqueName = \OC_Helper::buildNotExistingFileNameForView($this->getPath(), $name, $this->view); + return trim($this->getRelativePath($uniqueName), '/'); + } } diff --git a/lib/public/files/folder.php b/lib/public/files/folder.php index 9797fbc46ed..916f190ac34 100644 --- a/lib/public/files/folder.php +++ b/lib/public/files/folder.php @@ -146,4 +146,13 @@ interface Folder extends Node { * @return bool */ public function isCreatable(); + + /** + * Add a suffix to the name in case the file exists + * + * @param string $name + * @return string + * @throws NotPermittedException + */ + public function getNonExistingName($name); } diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php index 54b26ebdfe1..4a88e2acd36 100644 --- a/tests/lib/files/node/folder.php +++ b/tests/lib/files/node/folder.php @@ -679,4 +679,40 @@ class Folder extends \Test\TestCase { $this->assertEquals('/bar/foo/qwerty', $result[0]->getPath()); $this->assertEquals('/bar/foo/asd/foo/qwerty', $result[1]->getPath()); } + + public function uniqueNameProvider() { + return [ + // input, existing, expected + ['foo', [] , 'foo'], + ['foo', ['foo'] , 'foo (2)'], + ['foo', ['foo', 'foo (2)'] , 'foo (3)'] + ]; + } + + /** + * @dataProvider uniqueNameProvider + */ + public function testGetUniqueName($name, $existingFiles, $expected) { + $manager = $this->getMock('\OC\Files\Mount\Manager'); + $folderPath = '/bar/foo'; + /** + * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view + */ + $view = $this->getMock('\OC\Files\View'); + $root = $this->getMock('\OC\Files\Node\Root', array('getUser', 'getMountsIn', 'getMount'), array($manager, $view, $this->user)); + + $view->expects($this->any()) + ->method('file_exists') + ->will($this->returnCallback(function ($path) use ($existingFiles, $folderPath) { + foreach ($existingFiles as $existing) { + if ($folderPath . '/' . $existing === $path){ + return true; + } + } + return false; + })); + + $node = new \OC\Files\Node\Folder($root, $view, $folderPath); + $this->assertEquals($expected, $node->getNonExistingName($name)); + } } -- 2.39.5