Fix erroneous deletion of metadata when updating serverUrl subject directory
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 10 Mar 2023 17:51:14 +0000 (18:51 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:25 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift

index 51d63806d2cb3da3e036001380c5c42af5ea2776..fdced9fa7d6baa2c4e9b5055b1d94e48f8a488e4 100644 (file)
@@ -383,7 +383,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
         var allFpItemUpdates: [FileProviderItem] = []
         var allFpItemDeletionsIdentifiers = Array(allDeletedMetadatas.map { NSFileProviderItemIdentifier($0.ocId) })
 
-        DispatchQueue.main.sync {
+        DispatchQueue.main.sync { // TODO: Find a way to make this non-blocking
             for updMetadata in allUpdatedMetadatas {
                 guard let parentItemIdentifier = parentItemIdentifierFromMetadata(updMetadata) else {
                     NSLog("Not enumerating change for metadata: %@ %@ as could not get parent item metadata.", updMetadata.ocId, updMetadata.fileName)
@@ -464,7 +464,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                 }
 
                 NSLog("Starting async conversion of NKFiles for serverUrl: %@ for user: %@", serverUrl, ncKitAccount)
-                DispatchQueue.main.async {
+                DispatchQueue.main.async { // TODO: Background thread? But avoid crash with Realm
                     dbManager.convertNKFilesFromDirectoryReadToItemMetadatas(files, account: ncKitAccount) { directoryMetadata, childDirectoriesMetadata, metadatas in
 
                         // STORE DATA FOR CURRENTLY SCANNED DIRECTORY
@@ -472,7 +472,8 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                         // unless it's the root container -- this method deletes metadata for directories under the path that we do not
                         // provide as the updatedDirectoryItemMetadatas, don't do this with root folder or we will purge metadatas wrongly
                         if serverUrl != ncAccount.davFilesUrl {
-                            dbManager.updateDirectoryMetadatasFromItemMetadatas(account: ncKitAccount, parentDirectoryServerUrl: serverUrl, updatedDirectoryItemMetadatas: [directoryMetadata], recordEtag: true)
+                            // Don't use serverUrl here, get the parent serverUrl from retrieved metadata
+                            dbManager.updateDirectoryMetadatasFromItemMetadatas(account: ncKitAccount, parentDirectoryServerUrl: directoryMetadata.serverUrl, updatedDirectoryItemMetadatas: [directoryMetadata], recordEtag: true)
                         }
 
                         // STORE ETAG-LESS DIRECTORY METADATA FOR CHILD DIRECTORIES