mirror of
https://github.com/SideStore/SideStore.git
synced 2026-03-28 13:25:39 +01:00
Compare commits
6 Commits
0.5.9
...
Sidekit-ji
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0424fe0a5 | ||
|
|
a29cdf0323 | ||
|
|
68db11d8bf | ||
|
|
7cf4101130 | ||
|
|
13a7991481 | ||
|
|
efcf557e44 |
8
.github/workflows/nightly.yml
vendored
8
.github/workflows/nightly.yml
vendored
@@ -27,9 +27,6 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: brew install ldid
|
run: brew install ldid
|
||||||
|
|
||||||
- name: Install xcbeautify
|
|
||||||
run: brew install xcbeautify
|
|
||||||
|
|
||||||
- name: Cache .nightly-build-num
|
- name: Cache .nightly-build-num
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
@@ -56,12 +53,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
key: xcode-cache-deriveddata-${{ github.sha }}
|
key: xcode-cache-deriveddata-${{ github.sha }}
|
||||||
restore-keys: xcode-cache-deriveddata-
|
restore-keys: xcode-cache-deriveddata-
|
||||||
swiftpm-cache-key: xcode-cache-sourcedata-${{ github.sha }}
|
|
||||||
swiftpm-cache-restore-keys: |
|
|
||||||
xcode-cache-sourcedata-
|
|
||||||
|
|
||||||
- name: Build SideStore
|
- name: Build SideStore
|
||||||
run: NSUnbufferedIO=YES make build 2>&1 | xcbeautify --renderer github-actions && exit ${PIPESTATUS[0]}
|
run: make build | xcpretty && exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
- name: Fakesign app
|
- name: Fakesign app
|
||||||
run: make fakesign
|
run: make fakesign
|
||||||
|
|||||||
2
.github/workflows/pr.yml
vendored
2
.github/workflows/pr.yml
vendored
@@ -46,7 +46,7 @@ jobs:
|
|||||||
restore-keys: xcode-cache-deriveddata-
|
restore-keys: xcode-cache-deriveddata-
|
||||||
|
|
||||||
- name: Build SideStore
|
- name: Build SideStore
|
||||||
run: NSUnbufferedIO=YES make build | xcbeautify --renderer github-actions && exit ${PIPESTATUS[0]}
|
run: make build | xcpretty && exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
- name: Fakesign app
|
- name: Fakesign app
|
||||||
run: make fakesign
|
run: make fakesign
|
||||||
|
|||||||
6
.github/workflows/stable.yml
vendored
6
.github/workflows/stable.yml
vendored
@@ -3,7 +3,6 @@ on:
|
|||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- '[0-9]+.[0-9]+.[0-9]+' # example: 1.0.0
|
- '[0-9]+.[0-9]+.[0-9]+' # example: 1.0.0
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -45,12 +44,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
key: xcode-cache-deriveddata-${{ github.sha }}
|
key: xcode-cache-deriveddata-${{ github.sha }}
|
||||||
restore-keys: xcode-cache-deriveddata-
|
restore-keys: xcode-cache-deriveddata-
|
||||||
swiftpm-cache-key: xcode-cache-sourcedata-${{ github.sha }}
|
|
||||||
swiftpm-cache-restore-keys: |
|
|
||||||
xcode-cache-sourcedata-
|
|
||||||
|
|
||||||
- name: Build SideStore
|
- name: Build SideStore
|
||||||
run: NSUnbufferedIO=YES make build | xcbeautify --renderer github-actions && exit ${PIPESTATUS[0]}
|
run: make build | xcpretty && exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
- name: Fakesign app
|
- name: Fakesign app
|
||||||
run: make fakesign
|
run: make fakesign
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"location" : "https://github.com/SideStore/AltSign",
|
"location" : "https://github.com/SideStore/AltSign",
|
||||||
"state" : {
|
"state" : {
|
||||||
"branch" : "master",
|
"branch" : "master",
|
||||||
"revision" : "4323ff794e600ce1759cb6ea57275e13b7ea72f2"
|
"revision" : "cc6189f0f7cd8e5bd24943af9322e0ff9420e9f4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1141,7 +1141,7 @@ private extension AppManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func _install(_ app: AppProtocol, operation appOperation: AppOperation, group: RefreshGroup, context: InstallAppOperationContext? = nil, additionalEntitlements: [ALTEntitlement: Any] = [.increasedDebuggingMemoryLimit: ALTEntitlement.increasedDebuggingMemoryLimit, .increasedMemoryLimit: ALTEntitlement.increasedMemoryLimit, .extendedVirtualAddressing: ALTEntitlement.extendedVirtualAddressing], cacheApp: Bool = true, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void) -> Progress
|
private func _install(_ app: AppProtocol, operation appOperation: AppOperation, group: RefreshGroup, context: InstallAppOperationContext? = nil, additionalEntitlements: [ALTEntitlement: Any]? = nil, cacheApp: Bool = true, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void) -> Progress
|
||||||
{
|
{
|
||||||
let progress = Progress.discreteProgress(totalUnitCount: 100)
|
let progress = Progress.discreteProgress(totalUnitCount: 100)
|
||||||
|
|
||||||
|
|||||||
@@ -299,19 +299,6 @@ extension FetchProvisioningProfilesOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch ALTAppleAPIError.bundleIdentifierUnavailable {
|
|
||||||
ALTAppleAPI.shared.fetchAppIDs(for: team, session: session) {res, err in
|
|
||||||
if let err = err {
|
|
||||||
return completionHandler(.failure(err))
|
|
||||||
}
|
|
||||||
guard let res = res else {return completionHandler(.failure(ALTError(.unknown)))}
|
|
||||||
for appid in res {
|
|
||||||
if appid.bundleIdentifier == bundleIdentifier {
|
|
||||||
completionHandler(.success(appid))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
completionHandler(.failure(error))
|
completionHandler(.failure(error))
|
||||||
@@ -376,9 +363,7 @@ extension FetchProvisioningProfilesOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
appID.entitlements = entitlements
|
if updateFeatures
|
||||||
|
|
||||||
if updateFeatures || true
|
|
||||||
{
|
{
|
||||||
let appID = appID.copy() as! ALTAppID
|
let appID = appID.copy() as! ALTAppID
|
||||||
appID.features = features
|
appID.features = features
|
||||||
|
|||||||
@@ -238,7 +238,15 @@ struct OperationError: ALTLocalizedError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return OperationError.profileInstall
|
||||||
|
case 19:
|
||||||
|
return OperationError.profileInstall
|
||||||
|
case 20:
|
||||||
|
return OperationError.noConnection
|
||||||
|
case 21:
|
||||||
|
return OperationError.attach
|
||||||
|
default:
|
||||||
|
return OperationError.unknown
|
||||||
extension MinimuxerError: LocalizedError {
|
extension MinimuxerError: LocalizedError {
|
||||||
public var failureReason: String? {
|
public var failureReason: String? {
|
||||||
switch self {
|
switch self {
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
import EmotionalDamage
|
import EmotionalDamage
|
||||||
|
import minimuxer
|
||||||
|
|
||||||
|
|
||||||
@available(iOS 13, *)
|
@available(iOS 13, *)
|
||||||
final class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
final class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
||||||
@@ -140,6 +142,45 @@ private extension SceneDelegate
|
|||||||
NotificationCenter.default.post(name: AppDelegate.addSourceDeepLinkNotification, object: nil, userInfo: [AppDelegate.addSourceDeepLinkURLKey: sourceURL])
|
NotificationCenter.default.post(name: AppDelegate.addSourceDeepLinkNotification, object: nil, userInfo: [AppDelegate.addSourceDeepLinkURLKey: sourceURL])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "sidejit-enable":
|
||||||
|
let queryItems = components.queryItems?.reduce(into: [String: String]()) { $0[$1.name.lowercased()] = $1.value } ?? [:]
|
||||||
|
if let jitdebugURLString = queryItems["bid"] {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
let v = minimuxer_to_operation(code: 1)
|
||||||
|
|
||||||
|
do {
|
||||||
|
var x = try debug_app(app_id: jitdebugURLString)
|
||||||
|
switch x {
|
||||||
|
case .Good: print(jitdebugURLString)
|
||||||
|
case .Bad(let code): minimuxer_to_operation(code: code)
|
||||||
|
}
|
||||||
|
} catch Uhoh.Bad(let code) {
|
||||||
|
minimuxer_to_operation(code: code)
|
||||||
|
} catch {
|
||||||
|
print(OperationError.unknown)
|
||||||
|
}
|
||||||
|
} }
|
||||||
|
|
||||||
|
else if let jitdebugURLString = queryItems["pid"] {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
let v = minimuxer_to_operation(code: 1)
|
||||||
|
|
||||||
|
do {
|
||||||
|
var x = try debug_app(app_id: jitdebugURLString)
|
||||||
|
switch x {
|
||||||
|
case .Good: print(jitdebugURLString)
|
||||||
|
case .Bad(let code): minimuxer_to_operation(code: code)
|
||||||
|
}
|
||||||
|
} catch Uhoh.Bad(let code) {
|
||||||
|
minimuxer_to_operation(code: code)
|
||||||
|
} catch {
|
||||||
|
print(OperationError.unknown)
|
||||||
|
}
|
||||||
|
} }
|
||||||
|
|
||||||
|
else { return }
|
||||||
|
|
||||||
|
|
||||||
default: break
|
default: break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -272,34 +272,6 @@
|
|||||||
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="amC-sE-8O0" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="0.0" y="546" width="375" height="51"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="amC-sE-8O0" id="GEO-2e-E4k">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<subviews>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Allow Siri To Refresh Apps…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c6K-fI-CVr">
|
|
||||||
<rect key="frame" x="30" y="15.5" width="228.5" height="20.5"/>
|
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="c6K-fI-CVr" firstAttribute="centerY" secondItem="GEO-2e-E4k" secondAttribute="centerY" id="IGB-ox-RAM"/>
|
|
||||||
<constraint firstItem="c6K-fI-CVr" firstAttribute="leading" secondItem="GEO-2e-E4k" secondAttribute="leadingMargin" id="xoI-eB-1TH"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
|
||||||
<userDefinedRuntimeAttributes>
|
|
||||||
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
|
||||||
<integer key="value" value="2"/>
|
|
||||||
</userDefinedRuntimeAttribute>
|
|
||||||
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
|
||||||
</userDefinedRuntimeAttributes>
|
|
||||||
</tableViewCell>
|
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7PQ-AW-GcV" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7PQ-AW-GcV" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="495" width="375" height="51"/>
|
<rect key="frame" x="0.0" y="495" width="375" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
@@ -329,6 +301,34 @@
|
|||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
|
<integer key="value" value="2"/>
|
||||||
|
</userDefinedRuntimeAttribute>
|
||||||
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="amC-sE-8O0" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="546" width="375" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="amC-sE-8O0" id="GEO-2e-E4k">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Allow Siri To Refresh Apps…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c6K-fI-CVr">
|
||||||
|
<rect key="frame" x="30" y="15.5" width="228.5" height="20.5"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="c6K-fI-CVr" firstAttribute="centerY" secondItem="GEO-2e-E4k" secondAttribute="centerY" id="IGB-ox-RAM"/>
|
||||||
|
<constraint firstItem="c6K-fI-CVr" firstAttribute="leading" secondItem="GEO-2e-E4k" secondAttribute="leadingMargin" id="xoI-eB-1TH"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
<userDefinedRuntimeAttributes>
|
<userDefinedRuntimeAttributes>
|
||||||
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
<integer key="value" value="3"/>
|
<integer key="value" value="3"/>
|
||||||
|
|||||||
@@ -32,17 +32,16 @@ extension SettingsViewController
|
|||||||
{
|
{
|
||||||
case backgroundRefresh
|
case backgroundRefresh
|
||||||
case noIdleTimeout
|
case noIdleTimeout
|
||||||
|
case disableAppLimit
|
||||||
|
|
||||||
@available(iOS 14, *)
|
@available(iOS 14, *)
|
||||||
case addToSiri
|
case addToSiri
|
||||||
case disableAppLimit
|
|
||||||
|
|
||||||
static var allCases: [AppRefreshRow] {
|
static var allCases: [AppRefreshRow] {
|
||||||
var c: [AppRefreshRow] = [.backgroundRefresh, .noIdleTimeout]
|
var c: [AppRefreshRow] = [.backgroundRefresh, .noIdleTimeout]
|
||||||
guard #available(iOS 14, *) else { return c }
|
guard #available(iOS 14, *) else { return c }
|
||||||
c.append(.addToSiri)
|
|
||||||
|
|
||||||
// conditional entries go at the last to preserve ordering
|
|
||||||
if !ProcessInfo().sparseRestorePatched { c.append(.disableAppLimit) }
|
if !ProcessInfo().sparseRestorePatched { c.append(.disableAppLimit) }
|
||||||
|
c.append(.addToSiri)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -496,13 +495,6 @@ extension SettingsViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let cell = cell as? InsetGroupTableViewCell,
|
|
||||||
indexPath.section == Section.appRefresh.rawValue,
|
|
||||||
indexPath.row == AppRefreshRow.allCases.count-1 // last row
|
|
||||||
{
|
|
||||||
cell.setValue(3, forKey: "style")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return cell
|
return cell
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
|||||||
self.iconURL = try container.decode(URL.self, forKey: .iconURL)
|
self.iconURL = try container.decode(URL.self, forKey: .iconURL)
|
||||||
self.screenshotURLs = try container.decodeIfPresent([URL].self, forKey: .screenshotURLs) ?? []
|
self.screenshotURLs = try container.decodeIfPresent([URL].self, forKey: .screenshotURLs) ?? []
|
||||||
|
|
||||||
var downloadURL = try container.decodeIfPresent(URL.self, forKey: .downloadURL)
|
let downloadURL = try container.decodeIfPresent(URL.self, forKey: .downloadURL)
|
||||||
let platformURLs = try container.decodeIfPresent(PlatformURLs.self.self, forKey: .platformURLs)
|
let platformURLs = try container.decodeIfPresent(PlatformURLs.self.self, forKey: .platformURLs)
|
||||||
if let platformURLs = platformURLs {
|
if let platformURLs = platformURLs {
|
||||||
self.platformURLs = platformURLs
|
self.platformURLs = platformURLs
|
||||||
@@ -255,22 +255,7 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
|||||||
} else if let downloadURL = downloadURL {
|
} else if let downloadURL = downloadURL {
|
||||||
self._downloadURL = downloadURL
|
self._downloadURL = downloadURL
|
||||||
} else {
|
} else {
|
||||||
let version = try container.decode(String.self, forKey: .version)
|
|
||||||
if let versions = try container.decodeIfPresent([AppVersion].self, forKey: .versions){
|
|
||||||
for ver in versions {
|
|
||||||
if ver.version == version {
|
|
||||||
self._downloadURL = ver.downloadURL
|
|
||||||
downloadURL = ver.downloadURL // not sure if this is needed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw DecodingError.dataCorruptedError(forKey: .downloadURL, in: container, debugDescription: "E downloadURL:String or downloadURLs:[[Platform:URL]] key required.")
|
throw DecodingError.dataCorruptedError(forKey: .downloadURL, in: container, debugDescription: "E downloadURL:String or downloadURLs:[[Platform:URL]] key required.")
|
||||||
} else {
|
|
||||||
throw DecodingError.dataCorruptedError(forKey: .downloadURL, in: container, debugDescription: "E downloadURL:String or downloadURLs:[[Platform:URL]] key required.")
|
|
||||||
}
|
|
||||||
|
|
||||||
// else {
|
|
||||||
// throw DecodingError.dataCorruptedError(forKey: .downloadURL, in: container, debugDescription: "E downloadURL:String or downloadURLs:[[Platform:URL]] key required.")
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let tintColorHex = try container.decodeIfPresent(String.self, forKey: .tintColor)
|
if let tintColorHex = try container.decodeIfPresent(String.self, forKey: .tintColor)
|
||||||
@@ -290,9 +275,6 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
|||||||
if let versions = try container.decodeIfPresent([AppVersion].self, forKey: .versions)
|
if let versions = try container.decodeIfPresent([AppVersion].self, forKey: .versions)
|
||||||
{
|
{
|
||||||
//TODO: Throw error if there isn't at least one version.
|
//TODO: Throw error if there isn't at least one version.
|
||||||
if (versions.count == 0){
|
|
||||||
throw DecodingError.dataCorruptedError(forKey: .versions, in: container, debugDescription: "At least one version is required in key: versions")
|
|
||||||
}
|
|
||||||
|
|
||||||
for version in versions
|
for version in versions
|
||||||
{
|
{
|
||||||
|
|||||||
26
Dependencies/fetch-prebuilt.sh
vendored
26
Dependencies/fetch-prebuilt.sh
vendored
@@ -44,36 +44,16 @@ check_for_update() {
|
|||||||
LAST_FETCH=`cat .last-prebuilt-fetch-$1 | perl -n -e '/([0-9]*),([^ ]*)$/ && print $1'`
|
LAST_FETCH=`cat .last-prebuilt-fetch-$1 | perl -n -e '/([0-9]*),([^ ]*)$/ && print $1'`
|
||||||
LAST_COMMIT=`cat .last-prebuilt-fetch-$1 | perl -n -e '/([0-9]*),([^ ]*)$/ && print $2'`
|
LAST_COMMIT=`cat .last-prebuilt-fetch-$1 | perl -n -e '/([0-9]*),([^ ]*)$/ && print $2'`
|
||||||
|
|
||||||
# Check if required library files exist
|
# fetch if last fetch was over 1 hour ago
|
||||||
FORCE_DOWNLOAD=false
|
if [[ $LAST_FETCH -lt $(expr $(date +%s) - 3600) ]] || [[ "$2" == "force" ]]; then
|
||||||
if [ ! -f "$1/lib$1-sim.a" ] || [ ! -f "$1/lib$1-ios.a" ]; then
|
|
||||||
echo "Required libraries missing for $1, forcing download..."
|
|
||||||
FORCE_DOWNLOAD=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Download if:
|
|
||||||
# 1. Libraries are missing (FORCE_DOWNLOAD), or
|
|
||||||
# 2. Last fetch was over 1 hour ago, or
|
|
||||||
# 3. Force flag was passed
|
|
||||||
if [ "$FORCE_DOWNLOAD" = true ] || [[ $LAST_FETCH -lt $(expr $(date +%s) - 3600) ]] || [[ "$2" == "force" ]]; then
|
|
||||||
echo "Checking $1 for update"
|
echo "Checking $1 for update"
|
||||||
echo
|
echo
|
||||||
LATEST_COMMIT=`curl https://api.github.com/repos/SideStore/$1/releases/latest | perl -n -e '/Commit: https:\\/\\/github\\.com\\/[^\\/]*\\/[^\\/]*\\/commit\\/([^"]*)/ && print $1'`
|
LATEST_COMMIT=`curl https://api.github.com/repos/SideStore/$1/releases/latest | perl -n -e '/Commit: https:\\/\\/github\\.com\\/[^\\/]*\\/[^\\/]*\\/commit\\/([^"]*)/ && print $1'`
|
||||||
echo
|
echo
|
||||||
echo "Last commit: $LAST_COMMIT"
|
echo "Last commit: $LAST_COMMIT"
|
||||||
echo "Latest commit: $LATEST_COMMIT"
|
echo "Latest commit: $LATEST_COMMIT"
|
||||||
|
|
||||||
NOT_UPTODATE=false
|
|
||||||
if [[ "$LAST_COMMIT" != "$LATEST_COMMIT" ]]; then
|
if [[ "$LAST_COMMIT" != "$LATEST_COMMIT" ]]; then
|
||||||
echo "Found update on the remote: https://api.github.com/repos/SideStore/$1/releases/latest"
|
echo "Found update, downloading binaries"
|
||||||
NOT_UPTODATE=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Download if:
|
|
||||||
# 1. Libraries are missing (FORCE_DOWNLOAD), or
|
|
||||||
# 2. New commit is available
|
|
||||||
if [ "$FORCE_DOWNLOAD" = true ] || [ "$NOT_UPTODATE" = true ] ;then
|
|
||||||
echo "downloading binaries"
|
|
||||||
echo
|
echo
|
||||||
wget -O "$1/lib$1-sim.a" "https://github.com/SideStore/$1/releases/latest/download/lib$1-sim.a"
|
wget -O "$1/lib$1-sim.a" "https://github.com/SideStore/$1/releases/latest/download/lib$1-sim.a"
|
||||||
if [[ "$1" != "minimuxer" ]]; then
|
if [[ "$1" != "minimuxer" ]]; then
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
[](https://makeapullrequest.com)
|
[](https://makeapullrequest.com)
|
||||||
[](https://github.com/SideStore/SideStore/actions/workflows/nightly.yml)
|
[](https://github.com/SideStore/SideStore/actions/workflows/nightly.yml)
|
||||||
[](https://github.com/SideStore/SideStore/actions/workflows/beta.yml)
|
[](https://github.com/SideStore/SideStore/actions/workflows/beta.yml)
|
||||||
[](https://discord.gg/sidestore)
|
[](https://discord.gg/sidestore-949183273383395328)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user