From: Claudio Cambra Date: Thu, 9 Mar 2023 15:51:31 +0000 (+0100) Subject: Handle 404 errors from readFileOrFolder as special deletion case in FileProviderEnume... X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~10^2~55^2~185 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=03c1731fb5d434b71158be92f991b7f0c56f330b;p=nextcloud-desktop.git Handle 404 errors from readFileOrFolder as special deletion case in FileProviderEnumerator Signed-off-by: Claudio Cambra --- diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift index 34f71312d..b8a0b8846 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift @@ -184,6 +184,20 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { FileProviderEnumerator.readServerUrl(materialMetadataServerUrl, ncAccount: ncAccount, ncKit: ncKit) { [self] _, newMetadatas, updatedMetadatas, deletedMetadatas, readError in guard readError == nil else { NSLog("Finishing enumeration of changes at %@ with error %@", serverUrl) + + if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 { + NSLog("404 error means item no longer exists. Deleting metadata and reporting as deletion without error") + + let dbManager = NextcloudFilesDatabaseManager.shared + if materialMetadata.directory { + dbManager.deleteDirectoryAndSubdirectoriesMetadata(ocId: materialMetadata.ocId) + } else { + dbManager.deleteItemMetadata(ocId: materialMetadata.ocId) + } + + allDeletedMetadatas.append(materialMetadata) + } + dispatchGroup.leave() return } @@ -226,6 +240,26 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { FileProviderEnumerator.readServerUrl(serverUrl, ncAccount: ncAccount, ncKit: ncKit) { [self] _, newMetadatas, updatedMetadatas, deletedMetadatas, readError in guard readError == nil else { NSLog("Finishing enumeration of changes with error") + + if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 { + NSLog("404 error means item no longer exists. Deleting metadata and reporting %@ as deletion without error", serverUrl) + + guard let itemMetadata = self.enumeratedItemMetadata else { + NSLog("Invalid enumeratedItemMetadata, could not delete metadata nor report deletion") + observer.finishEnumeratingWithError(readError!) + return + } + + let dbManager = NextcloudFilesDatabaseManager.shared + if itemMetadata.directory { + dbManager.deleteDirectoryAndSubdirectoriesMetadata(ocId: itemMetadata.ocId) + } else { + dbManager.deleteItemMetadata(ocId: itemMetadata.ocId) + } + + FileProviderEnumerator.completeChangesObserver(observer, anchor: anchor, ncKit: ncKit, newMetadatas: nil, updatedMetadatas: nil, deletedMetadatas: [itemMetadata]) + } + observer.finishEnumeratingWithError(readError!) return }