summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/helper.php26
-rw-r--r--tests/lib/helper.php36
2 files changed, 48 insertions, 14 deletions
diff --git a/lib/helper.php b/lib/helper.php
index 017221cef77..df0d120976d 100644
--- a/lib/helper.php
+++ b/lib/helper.php
@@ -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;
diff --git a/tests/lib/helper.php b/tests/lib/helper.php
index 410117a9e67..67b5a3d43ec 100644
--- a/tests/lib/helper.php
+++ b/tests/lib/helper.php
@@ -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));
}
}