Skip to content

Commit

Permalink
fix rename
Browse files Browse the repository at this point in the history
Signed-off-by: Maxence Lange <[email protected]>
  • Loading branch information
ArtificialOwl committed Dec 11, 2023
1 parent 9e10b1d commit 5f98a0c
Showing 1 changed file with 17 additions and 30 deletions.
47 changes: 17 additions & 30 deletions apps/files/lib/Listener/SyncLivePhotosListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
use OCP\Files\Cache\CacheEntryRemovedEvent;
use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
use OCP\Files\Events\Node\BeforeNodeRenamedEvent;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
Expand All @@ -46,11 +45,11 @@
*/
class SyncLivePhotosListener implements IEventListener {
/** @var Array<int, string> */
private $pendingRenames = [];
private array $pendingRenames = [];
/** @var Array<int, bool> */
private $pendingDeletion = [];
private array $pendingDeletion = [];
/** @var Array<int, bool> */
private $pendingRestores = [];
private array $pendingRestores = [];

public function __construct(
private ?Folder $userFolder,
Expand Down Expand Up @@ -78,7 +77,7 @@ public function handle(Event $event): void {
}

if ($peerFile === null) {
return;
return; // not a Live Photo
}

if ($event instanceof BeforeNodeRenamedEvent) {
Expand All @@ -95,12 +94,9 @@ public function handle(Event $event): void {
/**
* During rename events, which also include move operations,
* we rename the peer file using the same name.
* This means that a move operation on the .jpg will trigger
* another recursive one for the .mov.
* Move operations on the .mov file directly are currently blocked.
* The event listener being singleton, we can store the current state
* of pending renames inside the 'pendingRenames' property,
* to prevent infinite recursivity.
* to prevent infinite recursive.
*/
private function handleMove(BeforeNodeRenamedEvent $event, Node $peerFile): void {
$sourceFile = $event->getSource();
Expand All @@ -111,44 +107,35 @@ private function handleMove(BeforeNodeRenamedEvent $event, Node $peerFile): void
$targetName = $targetFile->getName();
$targetPath = $targetFile->getPath();

// Prevent rename of the .mov file if the peer file do not have the same path.
if ($sourceFile->getMimetype() === 'video/quicktime') {
$peerFilePath = $this->pendingRenames[$peerFile->getId()] ?? $peerFile->getPath();
$targetPathWithoutExtension = preg_replace("/\.$sourceExtension$/", '', $targetPath);
$peerFilePathWithoutExtension = preg_replace("/\.$peerFileExtension$/", '', $peerFilePath);

if ($targetPathWithoutExtension !== $peerFilePathWithoutExtension) {
$event->abortOperation(new NotPermittedException("The video part of a live photo need to have the same name as the image"));
}

unset($this->pendingRenames[$peerFile->getId()]);
return;
}

if (!str_ends_with($targetName, ".".$sourceExtension)) {
$event->abortOperation(new NotPermittedException("Cannot change the extension of a live photo"));
$event->abortOperation(new NotPermittedException("Cannot change the extension of a Live Photo"));
}

try {
$targetParent->get($targetName);
$event->abortOperation(new NotPermittedException("A file already exist at destination path"));
$event->abortOperation(new NotPermittedException("A file already exist at destination path of the Live Photo"));
} catch (NotFoundException $ex) {
}

$peerTargetName = substr($targetName, 0, -strlen($sourceExtension)) . $peerFileExtension;
try {
$peerTargetName = preg_replace("/\.$sourceExtension$/", '.mov', $targetName);
$targetParent->get($peerTargetName);
$event->abortOperation(new NotPermittedException("A file already exist at destination path"));
$event->abortOperation(new NotPermittedException("A file already exist at destination path of the Live Photo"));
} catch (NotFoundException $ex) {
}

$peerTargetPath = preg_replace("/\.$sourceExtension$/", '.mov', $targetPath);
// in case the rename was initiated from this listener, we recursive stuff
if (array_key_exists($peerFile->getId(), $this->pendingRenames)) {
return;
}

$this->pendingRenames[$sourceFile->getId()] = $targetPath;
try {
$peerFile->move($peerTargetPath);
$peerFile->move($targetParent->getPath() . '/' . $peerTargetName);
} catch (\Throwable $ex) {
$event->abortOperation($ex);
}
return;
unset($this->pendingRenames[$sourceFile->getId()]);
}

/**
Expand Down

0 comments on commit 5f98a0c

Please sign in to comment.