2019-07-24 12:23:54 -07:00
|
|
|
//
|
|
|
|
|
// MergePolicy.swift
|
|
|
|
|
// AltStore
|
|
|
|
|
//
|
|
|
|
|
// Created by Riley Testut on 7/23/19.
|
|
|
|
|
// Copyright © 2019 Riley Testut. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import CoreData
|
|
|
|
|
|
|
|
|
|
import Roxas
|
|
|
|
|
|
|
|
|
|
open class MergePolicy: RSTRelationshipPreservingMergePolicy
|
|
|
|
|
{
|
|
|
|
|
open override func resolve(constraintConflicts conflicts: [NSConstraintConflict]) throws
|
|
|
|
|
{
|
|
|
|
|
guard conflicts.allSatisfy({ $0.databaseObject != nil }) else {
|
|
|
|
|
assertionFailure("MergePolicy is only intended to work with database-level conflicts.")
|
|
|
|
|
return try super.resolve(constraintConflicts: conflicts)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for conflict in conflicts
|
|
|
|
|
{
|
|
|
|
|
switch conflict.databaseObject
|
|
|
|
|
{
|
2019-07-31 14:07:00 -07:00
|
|
|
case let databaseObject as StoreApp:
|
2019-07-24 12:23:54 -07:00
|
|
|
// Delete previous permissions
|
|
|
|
|
for permission in databaseObject.permissions
|
|
|
|
|
{
|
|
|
|
|
permission.managedObjectContext?.delete(permission)
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-30 17:00:04 -07:00
|
|
|
case let databaseObject as Source:
|
|
|
|
|
guard let conflictedObject = conflict.conflictingObjects.first as? Source else { break }
|
|
|
|
|
|
|
|
|
|
let bundleIdentifiers = Set(conflictedObject.apps.map { $0.bundleIdentifier })
|
|
|
|
|
|
|
|
|
|
for app in databaseObject.apps
|
|
|
|
|
{
|
|
|
|
|
if !bundleIdentifiers.contains(app.bundleIdentifier)
|
|
|
|
|
{
|
|
|
|
|
// No longer listed in Source, so remove it from database.
|
|
|
|
|
app.managedObjectContext?.delete(app)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-24 12:23:54 -07:00
|
|
|
default: break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try super.resolve(constraintConflicts: conflicts)
|
|
|
|
|
}
|
|
|
|
|
}
|