When the user deletes the file locally with the enabled icloud happens this:
1. the file is moved to the local .Trash dir
2. the LocalDirectoryMonitor send event to delete the file from the iCloud
3. the SynchronizationFileWriter trash the remote file using the system API `try fileManager.trashItem`
4. the file is moved to the devices trash
5. the icloud sends the update to the metadataQery's `queryDidUpdate` with the updated state. This update is tricky - it calls the method twice: on the first call the deleted file appears in the updated list (`userInfo[NSMetadataQueryUpdateChangedItemsKey]`) and on the second call the deleted file appears in the deleted list (`userInfo[NSMetadataQueryUpdateRemovedItemsKey]`). There is no way to disable this behaviour.
At that point the bug can happens: the 1st `update` (that contains the file in the deleted list) call can triggers the file recreation because the synchroisztion starts to process the event and make an attempt to recreate the file but it is already deleted.
The fix is: skip missed file during the `Update` event. The case when the missed file is in the updated in undefined and should be skipped by checking the file existence.
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
1. remove the iCLoud's .Trash dir scanning because on ios this feature is blocked. This is why the `isRemoved` property was removed from the `MitadataItem`
2. runtime monitors sends only the added/updated/deleted items lists on didUpdate and the whole content on didFinishGathering
3. because of 1, when icloud is running - it is source of truth.
During the initial phase (1st enabling of enabling after disabling) all the data from the cloud and local dir will be preserved.
4. simplified the state manager's logic
5. improved logs
6. fixed test
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
When the file doesn't exist in the icloud dir and the manager attemps to move this file into the trash the exception is thrown and the sync is stopped. This issue was fixed by the additional file existence check.
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
- throws an exeption when the metadata cannot be initialized from the url or nsmetadataitem
- add 2 new sync errors cases to clarify errors reasons
- stop sync on the all errors except ubiquity errors (uploading/downloading)
- subscribe the settings screen on the sync state notification to update the relates cell properly from the cloud manager
- show the alert with an error if cloud sync fails with proposal to the user to send a bugreport
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>