From 9b6ac3e85655a2d4df388131534ea1059dc9931e Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Thu, 9 May 2024 11:33:55 +0200 Subject: [PATCH] fix(Unidirectional): Scanner should use mappings if possible Signed-off-by: Marcel Klehr --- src/lib/strategies/Default.ts | 2 +- src/lib/strategies/Unidirectional.ts | 37 +++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/lib/strategies/Default.ts b/src/lib/strategies/Default.ts index 268515b1..276637de 100644 --- a/src/lib/strategies/Default.ts +++ b/src/lib/strategies/Default.ts @@ -370,7 +370,7 @@ export default class SyncProcess { this.serverTreeRoot, // We also allow canMergeWith here, because e.g. for NextcloudFolders the id of moved bookmarks changes (because their id is ";") (oldItem, newItem) => { - if ((oldItem.type === newItem.type && String(mappingsSnapshot.LocalToServer[oldItem.type][oldItem.id]) === String(newItem.id)) || (oldItem.type === 'bookmark' && oldItem.canMergeWith(newItem))) { + if ((oldItem.type === newItem.type && Mappings.mappable(mappingsSnapshot, oldItem, newItem)) || (oldItem.type === 'bookmark' && oldItem.canMergeWith(newItem))) { newMappings.push([oldItem, newItem]) return true } diff --git a/src/lib/strategies/Unidirectional.ts b/src/lib/strategies/Unidirectional.ts index fbb39e84..c8adca8a 100644 --- a/src/lib/strategies/Unidirectional.ts +++ b/src/lib/strategies/Unidirectional.ts @@ -7,6 +7,7 @@ import Logger from '../Logger' import { CancelledSyncError } from '../../errors/Error' import MergeSyncProcess from './Merge' import TResource, { IResource, OrderFolderResource } from '../interfaces/Resource' +import Scanner from '../Scanner' export default class UnidirectionalSyncProcess extends DefaultStrategy { protected direction: TItemLocation @@ -20,7 +21,41 @@ export default class UnidirectionalSyncProcess extends DefaultStrategy { } async getDiffs():Promise<{localDiff:Diff, serverDiff:Diff}> { - return MergeSyncProcess.prototype.getDiffs.apply(this) // cheeky! + const mappingsSnapshot = this.mappings.getSnapshot() + + const newMappings = [] + const localScanner = new Scanner( + this.serverTreeRoot, + this.localTreeRoot, + (serverItem, localItem) => { + if (localItem.type === serverItem.type && (serverItem.canMergeWith(localItem) || Mappings.mappable(mappingsSnapshot, serverItem, localItem))) { + newMappings.push([localItem, serverItem]) + return true + } + return false + }, + this.preserveOrder, + false + ) + const serverScanner = new Scanner( + this.localTreeRoot, + this.serverTreeRoot, + (localItem, serverItem) => { + if (serverItem.type === localItem.type && (serverItem.canMergeWith(localItem) || Mappings.mappable(mappingsSnapshot, serverItem, localItem))) { + newMappings.push([localItem, serverItem]) + return true + } + return false + }, + this.preserveOrder, + false + ) + const [localDiff, serverDiff] = await Promise.all([localScanner.run(), serverScanner.run()]) + await Promise.all(newMappings.map(([localItem, serverItem]) => { + this.addMapping(this.server, localItem, serverItem.id) + })) + + return {localDiff, serverDiff} } async loadChildren() :Promise {