diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 8dac03b3..9c46e39c 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -3242,7 +3242,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.4; + MARKETING_VERSION = 1.4.5b; PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltStore; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -3270,7 +3270,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.4; + MARKETING_VERSION = 1.4.5b; PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltStore; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/AltStore/Managing Apps/AppManager.swift b/AltStore/Managing Apps/AppManager.swift index 7785f37d..d27e5ceb 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -1403,9 +1403,9 @@ private extension AppManager func run(_ operations: [Foundation.Operation], context: OperationContext?, requiresSerialQueue: Bool = false) { - // Reference to previous serial operation in context used to enforce FIFO, - // even if the operations become ready in a different order than submitted. - var previousSerialOperation: Foundation.Operation? = context?.operations.allObjects.filter { self.serialOperationQueue.operations.contains($0) }.last + // Find "Install AltStore" operation if it already exists in `context` + // so we can ensure it runs after any additional serial operations in `operations`. + let installAltStoreOperation = context?.operations.allObjects.lazy.compactMap { $0 as? InstallAppOperation }.first { $0.context.bundleIdentifier == StoreApp.altstoreAppID } for operation in operations { @@ -1413,16 +1413,20 @@ private extension AppManager { case _ where requiresSerialQueue: fallthrough case is InstallAppOperation, is RefreshAppOperation, is BackupAppOperation: - if let previousOperation = previousSerialOperation + if let installAltStoreOperation = operation as? InstallAppOperation, installAltStoreOperation.context.bundleIdentifier == StoreApp.altstoreAppID { - // Add dependency on previous serial operation to enforce FIFO. - operation.addDependency(previousOperation) + // Add dependencies on previous serial operations in `context` to ensure re-installing AltStore goes last. + let previousSerialOperations = context?.operations.allObjects.filter { self.serialOperationQueue.operations.contains($0) } + previousSerialOperations?.forEach { installAltStoreOperation.addDependency($0) } + } + else if let installAltStoreOperation = installAltStoreOperation + { + // Re-installing AltStore should _always_ be the last serial operation in `context`. + installAltStoreOperation.addDependency(operation) } self.serialOperationQueue.addOperation(operation) - previousSerialOperation = operation - default: self.operationQueue.addOperation(operation) } diff --git a/Dependencies/Roxas b/Dependencies/Roxas index 84645e43..5fdf9ef9 160000 --- a/Dependencies/Roxas +++ b/Dependencies/Roxas @@ -1 +1 @@ -Subproject commit 84645e43182eb2c8fd5904d9e7e379ad2a1b94cb +Subproject commit 5fdf9ef9deaf31e1f6f670a5a463a4a9df31f283