Skip to content

Commit 4726c76

Browse files
committed
fix(file-provider): Refactored change enumeration completion (affects #9553)
Signed-off-by: Iva Horn <iva.horn@nextcloud.com>
1 parent c0e5d1d commit 4726c76

File tree

1 file changed

+39
-21
lines changed
  • shell_integration/MacOSX/NextcloudFileProviderKit/Sources/NextcloudFileProviderKit/Enumeration

1 file changed

+39
-21
lines changed

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

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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)