Merge pull request #6008 from owncloud/extstorage-smb-webdav-renamefix

Fixed SMB rename function to overwrite target file
This commit is contained in:
Vincent Petry 2013-11-26 06:42:36 -08:00
commit 2653d914d9
3 changed files with 25 additions and 3 deletions

View File

@ -302,6 +302,7 @@ class smb {
}
function rename ($url_from, $url_to) {
$replace = false;
list ($from, $to) = array (smb::parse_url($url_from), smb::parse_url($url_to));
if ($from['host'] <> $to['host'] ||
$from['share'] <> $to['share'] ||
@ -314,7 +315,20 @@ class smb {
trigger_error('rename(): error in URL', E_USER_ERROR);
}
smb::clearstatcache ($url_from);
$result = smb::execute ('rename "'.$from['path'].'" "'.$to['path'].'"', $to);
$cmd = '';
// check if target file exists
if (smb::url_stat($url_to)) {
// delete target file first
$cmd = 'del "' . $to['path'] . '"; ';
$replace = true;
}
$cmd .= 'rename "' . $from['path'] . '" "' . $to['path'] . '"';
$result = smb::execute($cmd, $to);
if ($replace) {
// clear again, else the cache will return the info
// from the old file
smb::clearstatcache ($url_to);
}
return $result !== false;
}

View File

@ -38,7 +38,7 @@ abstract class StreamWrapper extends Common {
}
public function filetype($path) {
return filetype($this->constructUrl($path));
return @filetype($this->constructUrl($path));
}
public function file_exists($path) {

View File

@ -139,7 +139,15 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$this->instance->rename('/source.txt', '/target2.txt');
$this->assertTrue($this->instance->file_exists('/target2.txt'));
$this->assertFalse($this->instance->file_exists('/source.txt'));
$this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target.txt'));
$this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target2.txt'));
// move to overwrite
$testContents = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$this->instance->file_put_contents('/target3.txt', $testContents);
$this->instance->rename('/target2.txt', '/target3.txt');
$this->assertTrue($this->instance->file_exists('/target3.txt'));
$this->assertFalse($this->instance->file_exists('/target2.txt'));
$this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target3.txt'));
}
public function testLocal() {