@@ -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