diff --git a/lib/Versions/ExpireManager.php b/lib/Versions/ExpireManager.php index fb12cdf70..02c9f19d4 100644 --- a/lib/Versions/ExpireManager.php +++ b/lib/Versions/ExpireManager.php @@ -103,10 +103,8 @@ protected function getAutoExpireList(int $time, array $versions): array { } /** - * @param IVersion[] $versions - * @param int $time - * @param boolean $quotaExceeded - * @return IVersion[] + * @param GroupVersion[] $versions + * @return GroupVersion[] */ public function getExpiredVersion(array $versions, int $time, bool $quotaExceeded): array { if ($this->expiration->shouldAutoExpire()) { diff --git a/lib/Versions/GroupVersion.php b/lib/Versions/GroupVersion.php index 10f66851a..2938f2222 100644 --- a/lib/Versions/GroupVersion.php +++ b/lib/Versions/GroupVersion.php @@ -28,6 +28,7 @@ public function __construct( array $metadata, private File $versionFile, private int $folderId, + private bool $currentVersion, ) { parent::__construct($timestamp, $revisionId, $name, $size, $mimetype, $path, $sourceFileInfo, $backend, $user, $metadata); } @@ -39,4 +40,8 @@ public function getVersionFile(): File { public function getFolderId(): int { return $this->folderId; } + + public function isCurrentVersion(): bool { + return $this->currentVersion; + } } diff --git a/lib/Versions/GroupVersionsExpireManager.php b/lib/Versions/GroupVersionsExpireManager.php index b7f566252..d71b625ac 100644 --- a/lib/Versions/GroupVersionsExpireManager.php +++ b/lib/Versions/GroupVersionsExpireManager.php @@ -16,6 +16,7 @@ use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\FileInfo; use OCP\IUser; +use Psr\Log\LoggerInterface; /** * @psalm-import-type InternalFolderOut from FolderManager @@ -32,7 +33,8 @@ public function __construct( ExpireManager $expireManager, VersionsBackend $versionsBackend, ITimeFactory $timeFactory, - IEventDispatcher $dispatcher + IEventDispatcher $dispatcher, + private LoggerInterface $logger, ) { $this->folderManager = $folderManager; $this->expireManager = $expireManager; @@ -76,6 +78,18 @@ public function expireFolder(array $folder): void { $versions = $this->versionsBackend->getVersionsForFile($dummyUser, $file); $expireVersions = $this->expireManager->getExpiredVersion($versions, $this->timeFactory->getTime(), false); foreach ($expireVersions as $version) { + if ($version->isCurrentVersion()) { + $this->logger->error( + 'Current version of a groupfolders file was listed for deletion. Skipping.', + [ + 'folderid' => $version->getFolderId(), + 'timestamp' => $version->getTimestamp(), + 'mtime' => $version->getSourceFile()->getMtime(), + 'sourcefilename' => $version->getSourceFileName(), + ] + ); + continue; + } /** @var GroupVersion $version */ $this->emit(self::class, 'deleteVersion', [$version]); $view->unlink('/' . $fileId . '/' . $version->getVersionFile()->getName()); diff --git a/lib/Versions/VersionsBackend.php b/lib/Versions/VersionsBackend.php index 3e6d16cf7..47c2d187a 100644 --- a/lib/Versions/VersionsBackend.php +++ b/lib/Versions/VersionsBackend.php @@ -84,6 +84,9 @@ public function getVersionFolderForFile(FileInfo $file): Folder { } } + /** + * @return GroupVersion[] + */ public function getVersionsForFile(IUser $user, FileInfo $file): array { $versionsFolder = $this->getVersionFolderForFile($file); @@ -138,7 +141,7 @@ public function getVersionsForFile(IUser $user, FileInfo $file): array { } /** - * @return IVersion[] + * @return GroupVersion[] */ private function getVersionsForFileFromDB(FileInfo $fileInfo, IUser $user): array { $folderId = $this->getFolderIdForFile($fileInfo); @@ -150,7 +153,9 @@ private function getVersionsForFileFromDB(FileInfo $fileInfo, IUser $user): arra $versionEntities = $this->groupVersionsMapper->findAllVersionsForFileId($fileInfo->getId()); $mappedVersions = array_map( function (GroupVersionEntity $versionEntity) use ($versionsFolder, $mountPoint, $fileInfo, $user, $folderId, $groupFolder) { + $currentVersion = false; if ($fileInfo->getMtime() === $versionEntity->getTimestamp()) { + $currentVersion = true; if ($fileInfo instanceof File) { $versionFile = $fileInfo; } else { @@ -181,6 +186,7 @@ function (GroupVersionEntity $versionEntity) use ($versionsFolder, $mountPoint, $versionEntity->getDecodedMetadata(), $versionFile, $folderId, + $currentVersion, ); }, $versionEntities,