mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-20 20:23:25 +01:00
[AltStoreCore] Fixes incorrect Source.featuredApps relationship post-merging
This commit is contained in:
@@ -171,6 +171,7 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
|
|||||||
}
|
}
|
||||||
|
|
||||||
var sortedVersionsByAppBundleID = [String: NSOrderedSet]()
|
var sortedVersionsByAppBundleID = [String: NSOrderedSet]()
|
||||||
|
var featuredAppIDsBySourceID = [String: [String]]()
|
||||||
|
|
||||||
for conflict in conflicts
|
for conflict in conflicts
|
||||||
{
|
{
|
||||||
@@ -200,10 +201,10 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
|
|||||||
|
|
||||||
case let databaseObject as Source:
|
case let databaseObject as Source:
|
||||||
guard let conflictedObject = conflict.conflictingObjects.first as? Source else { break }
|
guard let conflictedObject = conflict.conflictingObjects.first as? Source else { break }
|
||||||
|
|
||||||
let bundleIdentifiers = Set(conflictedObject.apps.map { $0.bundleIdentifier })
|
let bundleIdentifiers = Set(conflictedObject.apps.map { $0.bundleIdentifier })
|
||||||
let newsItemIdentifiers = Set(conflictedObject.newsItems.map { $0.identifier })
|
let newsItemIdentifiers = Set(conflictedObject.newsItems.map { $0.identifier })
|
||||||
|
|
||||||
for app in databaseObject.apps
|
for app in databaseObject.apps
|
||||||
{
|
{
|
||||||
if !bundleIdentifiers.contains(app.bundleIdentifier)
|
if !bundleIdentifiers.contains(app.bundleIdentifier)
|
||||||
@@ -222,6 +223,11 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let contextSource = conflict.conflictingObjects.first as? Source
|
||||||
|
{
|
||||||
|
featuredAppIDsBySourceID[databaseObject.identifier] = contextSource.featuredApps?.map { $0.bundleIdentifier }
|
||||||
|
}
|
||||||
|
|
||||||
default: break
|
default: break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -272,6 +278,34 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
|
|||||||
throw nsError
|
throw nsError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case let databaseObject as Source:
|
||||||
|
guard let featuredAppIDs = featuredAppIDsBySourceID[databaseObject.identifier] else {
|
||||||
|
databaseObject.setFeaturedApps(nil)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
let featuredApps: [StoreApp]?
|
||||||
|
|
||||||
|
let databaseFeaturedAppIDs = databaseObject.featuredApps?.map { $0.bundleIdentifier }
|
||||||
|
if databaseFeaturedAppIDs != featuredAppIDs
|
||||||
|
{
|
||||||
|
let fixedFeaturedApps = databaseObject.apps.lazy.filter { featuredAppIDs.contains($0.bundleIdentifier) }.sorted { (appA, appB) in
|
||||||
|
let indexA = featuredAppIDs.firstIndex(of: appA.bundleIdentifier)!
|
||||||
|
let indexB = featuredAppIDs.firstIndex(of: appB.bundleIdentifier)!
|
||||||
|
return indexA < indexB
|
||||||
|
}
|
||||||
|
|
||||||
|
featuredApps = fixedFeaturedApps
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
featuredApps = databaseObject.featuredApps
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update featuredApps post-merging to make sure relationships are correct,
|
||||||
|
// even if the ordering is correct.
|
||||||
|
databaseObject.setFeaturedApps(featuredApps)
|
||||||
|
|
||||||
default: break
|
default: break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user