[Delta Sync] Fixes incorrectly marking some GameSaves as conflicted during initial sync
Fixes an edge case where updating from Delta 1.4.x to Delta 1.5 could result in false-conflicts if user had previously updated to Delta 1.5 in the past (including betas). This is because GameSaves updated on 1.5 have a new `sha1` field, which changes the hash for the whole record.
This commit is contained in:
parent
1d37a1dae8
commit
ec336c39db
@ -11,6 +11,7 @@ import Foundation
|
||||
import GBCDeltaCore
|
||||
|
||||
import Harmony
|
||||
import Roxas
|
||||
|
||||
@objc(GameSave)
|
||||
public class GameSave: _GameSave
|
||||
@ -113,4 +114,33 @@ extension GameSave: Syncable
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func resolveConflict(_ record: AnyRecord) -> ConflictResolution
|
||||
{
|
||||
// Only attempt to resolve conflicts for older GameSaves without SHA1 hash (i.e. pre-Delta 1.5)
|
||||
guard let game = self.game, self.sha1 == nil else { return .conflict }
|
||||
|
||||
do
|
||||
{
|
||||
let sha1Hash = try RSTHasher.sha1HashOfFile(at: game.gameSaveURL)
|
||||
|
||||
// resolveConflict() is called from self.managedObjectContext, so we can update `self` directly
|
||||
// and it will be automatically saved once finished conflicting records.
|
||||
self.sha1 = sha1Hash
|
||||
|
||||
// Don't update localRecord's hash here or else GameSave won't be repaired during initial sync.
|
||||
// try localRecord.updateSHA1Hash()
|
||||
}
|
||||
catch CocoaError.fileNoSuchFile
|
||||
{
|
||||
// Ignore
|
||||
}
|
||||
catch
|
||||
{
|
||||
Logger.sync.error("Failed to update GameSave SHA1 hash when resolving conflict. \(error.localizedDescription, privacy: .public)")
|
||||
}
|
||||
|
||||
// Conflict for now, but we'll "repair" this record to hopefully resolve conflict.
|
||||
return .conflict
|
||||
}
|
||||
}
|
||||
|
||||
2
External/Harmony
vendored
2
External/Harmony
vendored
@ -1 +1 @@
|
||||
Subproject commit 1f6c00ea96b6449cc3fee9900f5f397674d79171
|
||||
Subproject commit e1901297408ad220aa3c05e4c4fd9660c3420679
|
||||
Loading…
Reference in New Issue
Block a user