]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix renaming using parenthesis
authorBart Visscher <bartv@thisnet.nl>
Fri, 5 Jul 2013 13:38:09 +0000 (15:38 +0200)
committerBart Visscher <bartv@thisnet.nl>
Fri, 5 Jul 2013 13:38:09 +0000 (15:38 +0200)
lib/helper.php
tests/lib/helper.php

index 017221cef77330d339adf5e53775e57c61b3ece8..df0d120976df44e9ef9bff1e701d9efeb9f123cb 100644 (file)
@@ -660,11 +660,27 @@ class OC_Helper {
                }
 
                $newpath = $path . '/' . $filename;
-               $counter = 2;
-               while ($view->file_exists($newpath)) {
-                       $newname = $name . ' (' . $counter . ')' . $ext;
-                       $newpath = $path . '/' . $newname;
-                       $counter++;
+               if ($view->file_exists($newpath)) {
+                       if(preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
+                               //Replace the last "(number)" with "(number+1)" 
+                               $last_match = count($matches[0])-1;
+                               $counter = $matches[1][$last_match][0]+1;
+                               $offset = $matches[0][$last_match][1];
+                               $match_length = strlen($matches[0][$last_match][0]);
+                       } else {
+                               $counter = 2;
+                               $offset = false;
+                       }
+                       do {
+                               if($offset) {
+                                       //Replace the last "(number)" with "(number+1)" 
+                                       $newname = substr_replace($name, '('.$counter.')', $offset, $match_length);
+                               } else {
+                                       $newname = $name . ' (' . $counter . ')';
+                               }
+                               $newpath = $path . '/' . $newname . $ext;
+                               $counter++;
+                       } while ($view->file_exists($newpath));
                }
 
                return $newpath;
index 410117a9e67632eefbd502adc5ca6b7e22b02e67..67b5a3d43ecc509bd56822e0df00341ea05cb881 100644 (file)
@@ -154,38 +154,56 @@ class Test_Helper extends PHPUnit_Framework_TestCase {
 
                $viewMock->expects($this->at(0))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
+                       ->will($this->returnValue(true)); // filename.ext exists
                $this->assertEquals('dir/filename (2).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename.ext', $viewMock));
 
                $viewMock->expects($this->at(0))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
+                       ->will($this->returnValue(true)); // filename.ext exists
                $viewMock->expects($this->at(1))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
+                       ->will($this->returnValue(true)); // filename (2).ext exists
                $this->assertEquals('dir/filename (3).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename.ext', $viewMock));
 
                $viewMock->expects($this->at(0))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
+                       ->will($this->returnValue(true)); // filename (1).ext exists
                $this->assertEquals('dir/filename (2).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename (1).ext', $viewMock));
 
                $viewMock->expects($this->at(0))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
+                       ->will($this->returnValue(true)); // filename (2).ext exists
+               $this->assertEquals('dir/filename (3).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename (2).ext', $viewMock));
+
+               $viewMock->expects($this->at(0))
+                       ->method('file_exists')
+                       ->will($this->returnValue(true)); // filename (2).ext exists
                $viewMock->expects($this->at(1))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
-               $this->assertEquals('dir/filename (3).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename (2).ext', $viewMock));
+                       ->will($this->returnValue(true)); // filename (3).ext exists
+               $this->assertEquals('dir/filename (4).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename (2).ext', $viewMock));
 
                $viewMock->expects($this->at(0))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
+                       ->will($this->returnValue(true)); // filename(1).ext exists
                $this->assertEquals('dir/filename(2).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename(1).ext', $viewMock));
 
                $viewMock->expects($this->at(0))
                        ->method('file_exists')
-                       ->will($this->returnValue(true));
+                       ->will($this->returnValue(true)); // filename(1) (1).ext exists
                $this->assertEquals('dir/filename(1) (2).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename(1) (1).ext', $viewMock));
+
+               $viewMock->expects($this->at(0))
+                       ->method('file_exists')
+                       ->will($this->returnValue(true)); // filename(1) (1).ext exists
+               $viewMock->expects($this->at(1))
+                       ->method('file_exists')
+                       ->will($this->returnValue(true)); // filename(1) (2).ext exists
+               $this->assertEquals('dir/filename(1) (3).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename(1) (1).ext', $viewMock));
+
+               $viewMock->expects($this->at(0))
+                       ->method('file_exists')
+                       ->will($this->returnValue(true)); // filename(1) (2) (3).ext exists
+               $this->assertEquals('dir/filename(1) (2) (4).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename(1) (2) (3).ext', $viewMock));
        }
 }