Move deleted/updated conflict check to fullRecursiveScan in FileProviderEnumerator...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Sat, 18 Mar 2023 13:10:24 +0000 (14:10 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:29:56 +0000 (13:29 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator+RemoteSync.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift

index d0f406755fed1096f328685dae2aba9ae1d805cd..fd5cc0cdc8017dd1d1e08f2cd4ffb5e5d563fb71 100644 (file)
@@ -29,13 +29,26 @@ extension FileProviderEnumerator {
         dispatchQueue.async {
             let results = scanRecursively(rootContainerDirectoryMetadata, ncAccount: ncAccount, ncKit: ncKit, scanChangesOnly: scanChangesOnly)
 
+            // Run a check to ensure files deleted in one location are not updated in another (e.g. when moved)
+            // The recursive scan provides us with updated/deleted metadatas only on a folder by folder basis;
+            // so we need to check we are not simultaneously marking a moved file as deleted and updated
+            var checkedDeletedMetadatas = results.deletedMetadatas
+
+            for updatedMetadata in results.updatedMetadatas {
+                guard let matchingDeletedMetadataIdx = checkedDeletedMetadatas.firstIndex(where: { $0.ocId == updatedMetadata.ocId } ) else {
+                    continue;
+                }
+
+                checkedDeletedMetadatas.remove(at: matchingDeletedMetadataIdx)
+            }
+
             DispatchQueue.main.async {
-                completionHandler(results.metadatas, results.newMetadatas, results.updatedMetadatas, results.deletedMetadatas, results.error)
+                completionHandler(results.metadatas, results.newMetadatas, results.updatedMetadatas, checkedDeletedMetadatas, results.error)
             }
         }
     }
 
-    static func scanRecursively(_ directoryMetadata: NextcloudItemMetadataTable, ncAccount: NextcloudAccount, ncKit: NextcloudKit, scanChangesOnly: Bool) -> (metadatas: [NextcloudItemMetadataTable], newMetadatas: [NextcloudItemMetadataTable], updatedMetadatas: [NextcloudItemMetadataTable], deletedMetadatas: [NextcloudItemMetadataTable], error: NKError?) {
+    private static func scanRecursively(_ directoryMetadata: NextcloudItemMetadataTable, ncAccount: NextcloudAccount, ncKit: NextcloudKit, scanChangesOnly: Bool) -> (metadatas: [NextcloudItemMetadataTable], newMetadatas: [NextcloudItemMetadataTable], updatedMetadatas: [NextcloudItemMetadataTable], deletedMetadatas: [NextcloudItemMetadataTable], error: NKError?) {
 
         assert(directoryMetadata.directory, "Can only recursively scan a directory.")
 
index 1ae8c9abb809f7bc52d3638d59c672c2bce896ff..8068269be501b0ad3afb55ca8dcd9cd3ff1f847a 100644 (file)
@@ -253,25 +253,12 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
 
                 Logger.enumeration.info("Finished recursive change enumeration of working set for user: \(self.ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash)). Enumerating items.")
 
-                // Run a check to ensure files deleted in one location are not updated in another (e.g. when moved)
-                // The recursive scan provides us with updated/deleted metadatas only on a folder by folder basis;
-                // so we need to check we are not simultaneously marking a moved file as deleted and updated
-                var checkedDeletedMetadatas = deletedMetadatas
-
-                for updatedMetadata in updatedMetadatas {
-                    guard let matchingDeletedMetadataIdx = checkedDeletedMetadatas.firstIndex(where: { $0.ocId == updatedMetadata.ocId } ) else {
-                        continue;
-                    }
-
-                    checkedDeletedMetadatas.remove(at: matchingDeletedMetadataIdx)
-                }
-
                 FileProviderEnumerator.completeChangesObserver(observer,
                                                                anchor: anchor,
                                                                ncKit: self.ncKit,
                                                                newMetadatas: newMetadatas,
                                                                updatedMetadatas: updatedMetadatas,
-                                                               deletedMetadatas: checkedDeletedMetadatas)
+                                                               deletedMetadatas: deletedMetadatas)
             }
             return
         } else if enumeratedItemIdentifier == .trashContainer {