Unlock first path on rename if second path is locked
This commit is contained in:
parent
3217d4dad1
commit
167f57c15e
|
@ -631,7 +631,12 @@ class View {
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->lockFile($path1, ILockingProvider::LOCK_SHARED, true);
|
$this->lockFile($path1, ILockingProvider::LOCK_SHARED, true);
|
||||||
$this->lockFile($path2, ILockingProvider::LOCK_SHARED, true);
|
try {
|
||||||
|
$this->lockFile($path2, ILockingProvider::LOCK_SHARED, true);
|
||||||
|
} catch (LockedException $e) {
|
||||||
|
$this->unlockFile($path1, ILockingProvider::LOCK_SHARED);
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
|
||||||
$run = true;
|
$run = true;
|
||||||
if ($this->shouldEmitHooks() && (Cache\Scanner::isPartialFile($path1) && !Cache\Scanner::isPartialFile($path2))) {
|
if ($this->shouldEmitHooks() && (Cache\Scanner::isPartialFile($path1) && !Cache\Scanner::isPartialFile($path2))) {
|
||||||
|
|
|
@ -1758,6 +1758,39 @@ class View extends \Test\TestCase {
|
||||||
$this->assertNull($this->getFileLockType($view, $targetPath), 'Target file not locked after operation');
|
$this->assertNull($this->getFileLockType($view, $targetPath), 'Target file not locked after operation');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test rename operation: unlock first path when second path was locked
|
||||||
|
*/
|
||||||
|
public function testLockFileRenameUnlockOnException() {
|
||||||
|
$this->loginAsUser('test');
|
||||||
|
|
||||||
|
$view = new \OC\Files\View('/' . $this->user . '/files/');
|
||||||
|
|
||||||
|
$sourcePath = 'original.txt';
|
||||||
|
$targetPath = 'target.txt';
|
||||||
|
$view->file_put_contents($sourcePath, 'meh');
|
||||||
|
|
||||||
|
// simulate that the target path is already locked
|
||||||
|
$view->lockFile($targetPath, ILockingProvider::LOCK_EXCLUSIVE);
|
||||||
|
|
||||||
|
$this->assertNull($this->getFileLockType($view, $sourcePath), 'Source file not locked before operation');
|
||||||
|
$this->assertEquals(ILockingProvider::LOCK_EXCLUSIVE, $this->getFileLockType($view, $targetPath), 'Target file is locked before operation');
|
||||||
|
|
||||||
|
$thrown = false;
|
||||||
|
try {
|
||||||
|
$view->rename($sourcePath, $targetPath);
|
||||||
|
} catch (\OCP\Lock\LockedException $e) {
|
||||||
|
$thrown = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->assertTrue($thrown, 'LockedException thrown');
|
||||||
|
|
||||||
|
$this->assertNull($this->getFileLockType($view, $sourcePath), 'Source file not locked after operation');
|
||||||
|
$this->assertEquals(ILockingProvider::LOCK_EXCLUSIVE, $this->getFileLockType($view, $targetPath), 'Target file still locked after operation');
|
||||||
|
|
||||||
|
$view->unlockFile($targetPath, ILockingProvider::LOCK_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
|
||||||
public function lockFileRenameOrCopyCrossStorageDataProvider() {
|
public function lockFileRenameOrCopyCrossStorageDataProvider() {
|
||||||
return [
|
return [
|
||||||
['rename', 'moveFromStorage', ILockingProvider::LOCK_EXCLUSIVE],
|
['rename', 'moveFromStorage', ILockingProvider::LOCK_EXCLUSIVE],
|
||||||
|
|
Loading…
Reference in New Issue