Skip to content

Commit 0f6c3b5

Browse files
authored
Merge pull request #9601 from nextcloud/i2h3/fix/9553-remote-folder-deletion-discovery
Refactored change enumeration completion
2 parents 0b75988 + 818a5b3 commit 0f6c3b5

File tree

2 files changed

+43
-25
lines changed

2 files changed

+43
-25
lines changed

shell_integration/MacOSX/NextcloudFileProviderKit/Sources/NextcloudFileProviderKit/Enumeration/Enumerator+SyncEngine.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ extension Enumerator {
196196
metadata.downloaded = existing?.downloaded == true
197197
metadata.keepDownloaded = existing?.keepDownloaded == true
198198
dbManager.addItemMetadata(metadata)
199-
return ([metadata], newItems, updatedItems, nil, nextPage, nil)
199+
return ([metadata], newItems, updatedItems, [], nextPage, nil)
200200
}
201201
}
202202

@@ -211,7 +211,7 @@ extension Enumerator {
211211
metadata.keepDownloaded = existing?.keepDownloaded == true
212212
dbManager.addItemMetadata(metadata)
213213

214-
return ([metadata], newMetadatas, updatedMetadatas, nil, nextPage, nil)
214+
return ([metadata], newMetadatas, updatedMetadatas, [], nextPage, nil)
215215
} else if depth == .targetAndDirectChildren {
216216
let (allMetadatas, newMetadatas, updatedMetadatas, deletedMetadatas, readError) = await handleDepth1ReadFileOrFolder(
217217
serverUrl: serverUrl,

shell_integration/MacOSX/NextcloudFileProviderKit/Sources/NextcloudFileProviderKit/Enumeration/Enumerator.swift

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,8 @@ public final class Enumerator: NSObject, NSFileProviderEnumerator, Sendable {
384384
account: account,
385385
remoteInterface: remoteInterface,
386386
dbManager: dbManager,
387-
newMetadatas: nil,
388-
updatedMetadatas: nil,
387+
newMetadatas: [],
388+
updatedMetadatas: [],
389389
deletedMetadatas: [itemMetadata]
390390
)
391391
return
@@ -615,52 +615,66 @@ public final class Enumerator: NSObject, NSFileProviderEnumerator, Sendable {
615615
deletedMetadatas: [SendableItemMetadata]?,
616616
handleInvalidParent: Bool = true
617617
) {
618-
guard newMetadatas != nil || updatedMetadatas != nil || deletedMetadatas != nil else {
619-
logger.error("Received invalid newMetadatas, updatedMetadatas or deletedMetadatas. Finished enumeration of changes with error.")
618+
logger.info("Completing change observation...")
620619

621-
observer.finishEnumeratingWithError(NSError.fileProviderErrorForNonExistentItem(withIdentifier: enumeratedItemIdentifier))
620+
guard let newMetadatas else {
621+
let error = NSError.fileProviderErrorForNonExistentItem(withIdentifier: enumeratedItemIdentifier)
622+
logger.error("Received no new metadata objects. Finishing enumeration of changes with error.", [.error: error])
623+
observer.finishEnumeratingWithError(error)
624+
return
625+
}
622626

627+
guard let updatedMetadatas else {
628+
let error = NSError.fileProviderErrorForNonExistentItem(withIdentifier: enumeratedItemIdentifier)
629+
logger.error("Received no updated metadata objects. Finishing enumeration of changes with error.", [.error: error])
630+
observer.finishEnumeratingWithError(error)
623631
return
624632
}
625633

626-
// Observer does not care about new vs updated, so join
627-
var allUpdatedMetadatas: [SendableItemMetadata] = []
628-
var allDeletedMetadatas: [SendableItemMetadata] = []
634+
guard let deletedMetadatas else {
635+
let error = NSError.fileProviderErrorForNonExistentItem(withIdentifier: enumeratedItemIdentifier)
636+
logger.error("Received no deleted metadata objects. Finishing enumeration of changes with error.", [.error: error])
637+
observer.finishEnumeratingWithError(error)
638+
return
639+
}
629640

630-
if let newMetadatas {
631-
allUpdatedMetadatas += newMetadatas
641+
for metadata in newMetadatas {
642+
logger.debug("Got added metadata.", [.item: metadata.ocId, .name: metadata.fileName])
632643
}
633644

634-
if let updatedMetadatas {
635-
allUpdatedMetadatas += updatedMetadatas
645+
for metadata in updatedMetadatas {
646+
logger.debug("Got updated metadata.", [.item: metadata.ocId, .name: metadata.fileName])
636647
}
637648

638-
if let deletedMetadatas {
639-
allDeletedMetadatas = deletedMetadatas
649+
for metadata in deletedMetadatas {
650+
logger.debug("Got deleted metadata.", [.item: metadata.ocId, .name: metadata.fileName])
640651
}
641652

642-
let allFpItemDeletionsIdentifiers = Array(allDeletedMetadatas.map { NSFileProviderItemIdentifier($0.ocId) })
653+
// The file provider framework does not differentiate between newly added and updated items, hence the collections are merged.
654+
let newAndUpdatedMetadatas: [SendableItemMetadata] = newMetadatas + updatedMetadatas
643655

644-
if !allFpItemDeletionsIdentifiers.isEmpty {
645-
observer.didDeleteItems(withIdentifiers: allFpItemDeletionsIdentifiers)
656+
let deletedFileProviderItemIdentifiers = Array(deletedMetadatas.map {
657+
NSFileProviderItemIdentifier($0.ocId)
658+
})
659+
660+
if deletedFileProviderItemIdentifiers.isEmpty == false {
661+
observer.didDeleteItems(withIdentifiers: deletedFileProviderItemIdentifiers)
646662
}
647663

648-
Task { [allUpdatedMetadatas, allDeletedMetadatas] in
664+
Task { [newAndUpdatedMetadatas, deletedMetadatas] in
649665
do {
650-
let updatedItems = try await allUpdatedMetadatas.toFileProviderItems(account: account, remoteInterface: remoteInterface, dbManager: dbManager, log: self.logger.log)
666+
let updatedItems = try await newAndUpdatedMetadatas.toFileProviderItems(account: account, remoteInterface: remoteInterface, dbManager: dbManager, log: self.logger.log)
651667

652668
Task { @MainActor in
653669
if !updatedItems.isEmpty {
654670
observer.didUpdate(updatedItems)
655671
}
656672

657-
logger.info("Processed \(updatedItems.count) new or updated metadatas. \(allDeletedMetadatas.count) deleted metadatas.")
658-
659673
observer.finishEnumeratingChanges(upTo: anchor, moreComing: false)
660674
}
661675
} catch let error as NSError { // This error can only mean a missing parent item identifier
662676
guard handleInvalidParent else {
663-
logger.info("Not handling invalid parent in change enumeration.")
677+
logger.error("Not handling invalid parent in change enumeration!")
664678
observer.finishEnumeratingWithError(error)
665679
return
666680
}
@@ -674,8 +688,10 @@ public final class Enumerator: NSObject, NSFileProviderEnumerator, Sendable {
674688
remoteInterface: remoteInterface,
675689
dbManager: dbManager
676690
)
691+
677692
var modifiedNewMetadatas = newMetadatas
678-
modifiedNewMetadatas?.append(metadata)
693+
modifiedNewMetadatas.append(metadata)
694+
679695
completeChangesObserver(
680696
observer,
681697
anchor: anchor,
@@ -692,6 +708,8 @@ public final class Enumerator: NSObject, NSFileProviderEnumerator, Sendable {
692708
observer.finishEnumeratingWithError(error)
693709
}
694710
}
711+
712+
logger.info("Completed change observation.")
695713
}
696714
}
697715

0 commit comments

Comments
 (0)