mirror of
https://github.com/SideStore/SideStore.git
synced 2026-03-30 15:25:39 +02:00
Compare commits
23 Commits
9706a43bc1
...
bff192be4e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bff192be4e | ||
|
|
a863b2f39a | ||
|
|
bf72a0edfc | ||
|
|
06ad6488cc | ||
|
|
12f84b2365 | ||
|
|
118f64de8a | ||
|
|
555bb3d985 | ||
|
|
25925aceef | ||
|
|
5444fdd9bb | ||
|
|
f91e0a6295 | ||
|
|
4e4f0f6a3f | ||
|
|
f412f6df23 | ||
|
|
625389ab96 | ||
|
|
f7e34cbbe9 | ||
|
|
0fe8d7fed9 | ||
|
|
1a1aa42e02 | ||
|
|
7ff4b48223 | ||
|
|
4801f6e8f2 | ||
|
|
ff28f6fa8f | ||
|
|
2d141afbaf | ||
|
|
06e38aae00 | ||
|
|
d8783230a7 | ||
|
|
6c479bfede |
2
.github/workflows/alpha.yml
vendored
2
.github/workflows/alpha.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
- name: Find Last Successful commit
|
- name: Find Last Successful commit
|
||||||
run: |
|
run: |
|
||||||
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
|
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
|
||||||
"${{ github.workflow }}" "${{ env.CHANNEL }}" || echo "")
|
"false" "${{ env.CHANNEL }}" || echo "")
|
||||||
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
|
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
|
||||||
|
|
||||||
- run: brew install ldid xcbeautify
|
- run: brew install ldid xcbeautify
|
||||||
|
|||||||
2
.github/workflows/nightly.yml
vendored
2
.github/workflows/nightly.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
|||||||
- name: Find Last Successful commit
|
- name: Find Last Successful commit
|
||||||
run: |
|
run: |
|
||||||
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
|
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
|
||||||
"${{ github.workflow }}" "${{ env.CHANNEL }}" || echo "")
|
"false" "${{ env.CHANNEL }}" || echo "")
|
||||||
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
|
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
|
||||||
|
|
||||||
- name: Check for new changes (on schedule)
|
- name: Check for new changes (on schedule)
|
||||||
|
|||||||
14
.github/workflows/stable.yml
vendored
14
.github/workflows/stable.yml
vendored
@@ -17,7 +17,6 @@ jobs:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
RELEASE_NAME: Stable
|
|
||||||
CHANNEL: stable
|
CHANNEL: stable
|
||||||
UPSTREAM_CHANNEL: ""
|
UPSTREAM_CHANNEL: ""
|
||||||
|
|
||||||
@@ -27,6 +26,12 @@ jobs:
|
|||||||
submodules: recursive
|
submodules: recursive
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Find Last Successful commit
|
||||||
|
run: |
|
||||||
|
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
|
||||||
|
"true" || echo "")
|
||||||
|
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
|
||||||
|
|
||||||
- run: brew install ldid xcbeautify
|
- run: brew install ldid xcbeautify
|
||||||
|
|
||||||
- name: Setup Env
|
- name: Setup Env
|
||||||
@@ -68,9 +73,6 @@ jobs:
|
|||||||
~/Library/Caches/org.swift.swiftpm
|
~/Library/Caches/org.swift.swiftpm
|
||||||
key: xcode-build-cache-stable-
|
key: xcode-build-cache-stable-
|
||||||
|
|
||||||
- name: Clean
|
|
||||||
run: python3 scripts/ci/workflow.py clean
|
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
id: build
|
id: build
|
||||||
env:
|
env:
|
||||||
@@ -112,7 +114,7 @@ jobs:
|
|||||||
IPA_NAME="$PRODUCT_NAME.ipa"
|
IPA_NAME="$PRODUCT_NAME.ipa"
|
||||||
|
|
||||||
python3 scripts/ci/workflow.py generate-metadata \
|
python3 scripts/ci/workflow.py generate-metadata \
|
||||||
"$CHANNEL" \
|
"${{ github.ref_name }}" \
|
||||||
"$SHORT_COMMIT" \
|
"$SHORT_COMMIT" \
|
||||||
"$MARKETING_VERSION" \
|
"$MARKETING_VERSION" \
|
||||||
"$CHANNEL" \
|
"$CHANNEL" \
|
||||||
@@ -125,7 +127,7 @@ jobs:
|
|||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
python3 scripts/ci/workflow.py upload-release \
|
python3 scripts/ci/workflow.py upload-release \
|
||||||
"$RELEASE_NAME" \
|
"${{ github.ref_name }}" \
|
||||||
"${{ github.ref_name }}" \
|
"${{ github.ref_name }}" \
|
||||||
"$GITHUB_SHA" \
|
"$GITHUB_SHA" \
|
||||||
"$GITHUB_REPOSITORY" \
|
"$GITHUB_REPOSITORY" \
|
||||||
|
|||||||
@@ -1903,6 +1903,90 @@
|
|||||||
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
|
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
|
||||||
remoteInfo = SwiftSampleApp;
|
remoteInfo = SwiftSampleApp;
|
||||||
};
|
};
|
||||||
|
A8F3FC062F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 87B8C3401E0E9C37002F817D;
|
||||||
|
remoteInfo = "fragmentzip-cli-macOS";
|
||||||
|
};
|
||||||
|
A8F3FC082F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = B315FDB02866CCF8002E243C;
|
||||||
|
remoteInfo = "fragmentzip-cli-iOS";
|
||||||
|
};
|
||||||
|
A8F3FC0A2F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = B315FDB52866CD91002E243C;
|
||||||
|
remoteInfo = "fragmentzip-macOS";
|
||||||
|
};
|
||||||
|
A8F3FC0C2F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = B315FDCE2866CDD3002E243C;
|
||||||
|
remoteInfo = "fragmentzip-iOS";
|
||||||
|
};
|
||||||
|
A8F3FC0F2F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3F7C02F4E96D7006BC252 /* libgeneral.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 87977F6F227C4B71004F31DA;
|
||||||
|
remoteInfo = libgeneral;
|
||||||
|
};
|
||||||
|
A8F3FC142F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = BFADAFF819AE7BB70050CF31;
|
||||||
|
remoteInfo = Roxas;
|
||||||
|
};
|
||||||
|
A8F3FC162F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = BF8624801BB742E700C12EEE;
|
||||||
|
remoteInfo = RoxasTV;
|
||||||
|
};
|
||||||
|
A8F3FC182F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = BFADB00319AE7BB80050CF31;
|
||||||
|
remoteInfo = RoxasTests;
|
||||||
|
};
|
||||||
|
A8F3FC1B2F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3FAD92F4E96D7006BC252 /* SampleApp.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 44E8FA8923D90632009E1D13;
|
||||||
|
remoteInfo = SampleApp;
|
||||||
|
};
|
||||||
|
A8F3FC1F2F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 44B1EE7C23DB90D5004E2E29;
|
||||||
|
remoteInfo = SampleApp;
|
||||||
|
};
|
||||||
|
A8F3FC212F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 445A906A2400612800B487B4;
|
||||||
|
remoteInfo = "NSAttributedString+MarkdownTests";
|
||||||
|
};
|
||||||
|
A8F3FC242F4E998F006BC252 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A8F3FAE52F4E96D7006BC252 /* SwiftSampleApp.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
|
||||||
|
remoteInfo = SwiftSampleApp;
|
||||||
|
};
|
||||||
A8FAC1CE2F4B51980061A851 /* PBXContainerItemProxy */ = {
|
A8FAC1CE2F4B51980061A851 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = A8FAC0562F4B50D10061A851 /* em_proxy.xcodeproj */;
|
containerPortal = A8FAC0562F4B50D10061A851 /* em_proxy.xcodeproj */;
|
||||||
@@ -2465,6 +2549,12 @@
|
|||||||
A8F3C00A2F4E3794006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
|
A8F3C00A2F4E3794006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
|
||||||
A8F3C0162F4E3794006BC252 /* SwiftSampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SwiftSampleApp.xcodeproj; sourceTree = "<group>"; };
|
A8F3C0162F4E3794006BC252 /* SwiftSampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SwiftSampleApp.xcodeproj; sourceTree = "<group>"; };
|
||||||
A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
|
A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
A8F3F7C02F4E96D7006BC252 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libfragmentzip.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
A8F3FAD92F4E96D7006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
A8F3FAE52F4E96D7006BC252 /* SwiftSampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SwiftSampleApp.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
|
||||||
A8FABA492F4B50D00061A851 /* libimobiledevice.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libimobiledevice.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
A8FABA492F4B50D00061A851 /* libimobiledevice.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libimobiledevice.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
A8FABA4A2F4B50D00061A851 /* libem_proxy_swift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libem_proxy_swift.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
A8FABA4A2F4B50D00061A851 /* libem_proxy_swift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libem_proxy_swift.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
A8FABCC32F4B50D10061A851 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
|
A8FABCC32F4B50D10061A851 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
|
||||||
@@ -4223,6 +4313,60 @@
|
|||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
A8F3F7EB2F4E96D7006BC252 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A8F3FC072F4E998F006BC252 /* libfragmentzip */,
|
||||||
|
A8F3FC092F4E998F006BC252 /* libfragmentzip */,
|
||||||
|
A8F3FC0B2F4E998F006BC252 /* libfragmentzip.a */,
|
||||||
|
A8F3FC0D2F4E998F006BC252 /* libfragmentzip.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A8F3F7ED2F4E96D7006BC252 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A8F3FC102F4E998F006BC252 /* libgeneral */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A8F3FAED2F4E96D7006BC252 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A8F3FC1C2F4E998F006BC252 /* SampleApp.app */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A8F3FAEF2F4E96D7006BC252 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A8F3FC252F4E998F006BC252 /* SwiftSampleApp.app */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A8F3FAF12F4E96D7006BC252 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A8F3FC202F4E998F006BC252 /* SampleApp.app */,
|
||||||
|
A8F3FC222F4E998F006BC252 /* NSAttributedString+MarkdownTests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A8F3FB652F4E96D7006BC252 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A8F3FC152F4E998F006BC252 /* Roxas.framework */,
|
||||||
|
A8F3FC172F4E998F006BC252 /* Roxas.framework */,
|
||||||
|
A8F3FC192F4E998F006BC252 /* RoxasTests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
A8FAC0592F4B50D10061A851 /* Products */ = {
|
A8FAC0592F4B50D10061A851 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -4812,6 +4956,10 @@
|
|||||||
ProductGroup = A85AEC6B2F4B22F6002E2E11 /* Products */;
|
ProductGroup = A85AEC6B2F4B22F6002E2E11 /* Products */;
|
||||||
ProjectRef = A85AE43E2F4B22F6002E2E11 /* libfragmentzip.xcodeproj */;
|
ProjectRef = A85AE43E2F4B22F6002E2E11 /* libfragmentzip.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = A8F3F7EB2F4E96D7006BC252 /* Products */;
|
||||||
|
ProjectRef = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = A8A5B3BA2F4C4C8600572B4A /* Products */;
|
ProductGroup = A8A5B3BA2F4C4C8600572B4A /* Products */;
|
||||||
ProjectRef = A8A5B3B32F4C4C8600572B4A /* libfragmentzip.xcodeproj */;
|
ProjectRef = A8A5B3B32F4C4C8600572B4A /* libfragmentzip.xcodeproj */;
|
||||||
@@ -4908,6 +5056,10 @@
|
|||||||
ProductGroup = A8FAD7302F4B61310061A851 /* Products */;
|
ProductGroup = A8FAD7302F4B61310061A851 /* Products */;
|
||||||
ProjectRef = A8FAD38F2F4B61310061A851 /* libgeneral.xcodeproj */;
|
ProjectRef = A8FAD38F2F4B61310061A851 /* libgeneral.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = A8F3F7ED2F4E96D7006BC252 /* Products */;
|
||||||
|
ProjectRef = A8F3F7C02F4E96D7006BC252 /* libgeneral.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = A8EEDA212F4B19B000F2436D /* Products */;
|
ProductGroup = A8EEDA212F4B19B000F2436D /* Products */;
|
||||||
ProjectRef = A8EED1D72F4B19B000F2436D /* libgeneral.xcodeproj */;
|
ProjectRef = A8EED1D72F4B19B000F2436D /* libgeneral.xcodeproj */;
|
||||||
@@ -5040,6 +5192,10 @@
|
|||||||
ProductGroup = A8A5BE7E2F4C4D6800572B4A /* Products */;
|
ProductGroup = A8A5BE7E2F4C4D6800572B4A /* Products */;
|
||||||
ProjectRef = A8A5BE7D2F4C4D6800572B4A /* Roxas.xcodeproj */;
|
ProjectRef = A8A5BE7D2F4C4D6800572B4A /* Roxas.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = A8F3FB652F4E96D7006BC252 /* Products */;
|
||||||
|
ProjectRef = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = A85AEC732F4B22F6002E2E11 /* Products */;
|
ProductGroup = A85AEC732F4B22F6002E2E11 /* Products */;
|
||||||
ProjectRef = A85AEC612F4B22F6002E2E11 /* Roxas.xcodeproj */;
|
ProjectRef = A85AEC612F4B22F6002E2E11 /* Roxas.xcodeproj */;
|
||||||
@@ -5232,6 +5388,10 @@
|
|||||||
ProductGroup = A8FAC0632F4B50D10061A851 /* Products */;
|
ProductGroup = A8FAC0632F4B50D10061A851 /* Products */;
|
||||||
ProjectRef = A8FABF722F4B50D10061A851 /* SampleApp.xcodeproj */;
|
ProjectRef = A8FABF722F4B50D10061A851 /* SampleApp.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = A8F3FAED2F4E96D7006BC252 /* Products */;
|
||||||
|
ProjectRef = A8F3FAD92F4E96D7006BC252 /* SampleApp.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = A8FACFA52F4B5CD40061A851 /* Products */;
|
ProductGroup = A8FACFA52F4B5CD40061A851 /* Products */;
|
||||||
ProjectRef = A8FACE982F4B5CD40061A851 /* SampleApp.xcodeproj */;
|
ProjectRef = A8FACE982F4B5CD40061A851 /* SampleApp.xcodeproj */;
|
||||||
@@ -5252,6 +5412,10 @@
|
|||||||
ProductGroup = A85A11E02F4B34EF002E2E11 /* Products */;
|
ProductGroup = A85A11E02F4B34EF002E2E11 /* Products */;
|
||||||
ProjectRef = A85A10DD2F4B34EF002E2E11 /* SampleApp.xcodeproj */;
|
ProjectRef = A85A10DD2F4B34EF002E2E11 /* SampleApp.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = A8F3FAF12F4E96D7006BC252 /* Products */;
|
||||||
|
ProjectRef = A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = A8CCC24E2F4B654400B0089A /* Products */;
|
ProductGroup = A8CCC24E2F4B654400B0089A /* Products */;
|
||||||
ProjectRef = A8CCC1792F4B654400B0089A /* SampleApp.xcodeproj */;
|
ProjectRef = A8CCC1792F4B654400B0089A /* SampleApp.xcodeproj */;
|
||||||
@@ -5336,6 +5500,10 @@
|
|||||||
ProductGroup = A85AEC752F4B22F6002E2E11 /* Products */;
|
ProductGroup = A85AEC752F4B22F6002E2E11 /* Products */;
|
||||||
ProjectRef = A85AE6D52F4B22F6002E2E11 /* SwiftSampleApp.xcodeproj */;
|
ProjectRef = A85AE6D52F4B22F6002E2E11 /* SwiftSampleApp.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = A8F3FAEF2F4E96D7006BC252 /* Products */;
|
||||||
|
ProjectRef = A8F3FAE52F4E96D7006BC252 /* SwiftSampleApp.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = A8FACF9B2F4B5CD40061A851 /* Products */;
|
ProductGroup = A8FACF9B2F4B5CD40061A851 /* Products */;
|
||||||
ProjectRef = A8FACEBD2F4B5CD40061A851 /* SwiftSampleApp.xcodeproj */;
|
ProjectRef = A8FACEBD2F4B5CD40061A851 /* SwiftSampleApp.xcodeproj */;
|
||||||
@@ -7211,6 +7379,90 @@
|
|||||||
remoteRef = A8F3C14F2F4E37A5006BC252 /* PBXContainerItemProxy */;
|
remoteRef = A8F3C14F2F4E37A5006BC252 /* PBXContainerItemProxy */;
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
};
|
};
|
||||||
|
A8F3FC072F4E998F006BC252 /* libfragmentzip */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = "compiled.mach-o.executable";
|
||||||
|
path = libfragmentzip;
|
||||||
|
remoteRef = A8F3FC062F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC092F4E998F006BC252 /* libfragmentzip */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = "compiled.mach-o.executable";
|
||||||
|
path = libfragmentzip;
|
||||||
|
remoteRef = A8F3FC082F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC0B2F4E998F006BC252 /* libfragmentzip.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libfragmentzip.a;
|
||||||
|
remoteRef = A8F3FC0A2F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC0D2F4E998F006BC252 /* libfragmentzip.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libfragmentzip.a;
|
||||||
|
remoteRef = A8F3FC0C2F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC102F4E998F006BC252 /* libgeneral */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = "compiled.mach-o.executable";
|
||||||
|
path = libgeneral;
|
||||||
|
remoteRef = A8F3FC0F2F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC152F4E998F006BC252 /* Roxas.framework */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.framework;
|
||||||
|
path = Roxas.framework;
|
||||||
|
remoteRef = A8F3FC142F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC172F4E998F006BC252 /* Roxas.framework */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.framework;
|
||||||
|
path = Roxas.framework;
|
||||||
|
remoteRef = A8F3FC162F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC192F4E998F006BC252 /* RoxasTests.xctest */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.cfbundle;
|
||||||
|
path = RoxasTests.xctest;
|
||||||
|
remoteRef = A8F3FC182F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC1C2F4E998F006BC252 /* SampleApp.app */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.application;
|
||||||
|
path = SampleApp.app;
|
||||||
|
remoteRef = A8F3FC1B2F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC202F4E998F006BC252 /* SampleApp.app */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.application;
|
||||||
|
path = SampleApp.app;
|
||||||
|
remoteRef = A8F3FC1F2F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC222F4E998F006BC252 /* NSAttributedString+MarkdownTests.xctest */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.cfbundle;
|
||||||
|
path = "NSAttributedString+MarkdownTests.xctest";
|
||||||
|
remoteRef = A8F3FC212F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A8F3FC252F4E998F006BC252 /* SwiftSampleApp.app */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.application;
|
||||||
|
path = SwiftSampleApp.app;
|
||||||
|
remoteRef = A8F3FC242F4E998F006BC252 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
A8FAC1CF2F4B51980061A851 /* libem_proxy_static.a */ = {
|
A8FAC1CF2F4B51980061A851 /* libem_proxy_static.a */ = {
|
||||||
isa = PBXReferenceProxy;
|
isa = PBXReferenceProxy;
|
||||||
fileType = archive.ar;
|
fileType = archive.ar;
|
||||||
|
|||||||
@@ -997,6 +997,7 @@ extension AppManager
|
|||||||
case .failure(let error): completionHandler(.failure(error))
|
case .failure(let error): completionHandler(.failure(error))
|
||||||
case .success(let installedApp): completionHandler(.success(installedApp))
|
case .success(let installedApp): completionHandler(.success(installedApp))
|
||||||
}
|
}
|
||||||
|
//UIApplication.shared.open(shortcutURLon, options: [:], completionHandler: nil)
|
||||||
}
|
}
|
||||||
installOperation.addDependency(sendAppOperation)
|
installOperation.addDependency(sendAppOperation)
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import AltStoreCore
|
|||||||
import AltSign
|
import AltSign
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
|
let shortcutURLonDelay = URL(string: "shortcuts://run-shortcut?name=TurnOnDataDelay")!
|
||||||
|
|
||||||
@objc(InstallAppOperation)
|
@objc(InstallAppOperation)
|
||||||
final class InstallAppOperation: ResultOperation<InstalledApp>
|
final class InstallAppOperation: ResultOperation<InstalledApp>
|
||||||
{
|
{
|
||||||
@@ -211,6 +213,10 @@ final class InstallAppOperation: ResultOperation<InstalledApp>
|
|||||||
let alert = UIAlertController(title: "Finish Refresh", message: "Please reopen SideStore after the process is finished.To finish refreshing, SideStore must be moved to the background. To do this, you can either go to the Home Screen manually or by hitting Continue. Please reopen SideStore after doing this.", preferredStyle: .alert)
|
let alert = UIAlertController(title: "Finish Refresh", message: "Please reopen SideStore after the process is finished.To finish refreshing, SideStore must be moved to the background. To do this, you can either go to the Home Screen manually or by hitting Continue. Please reopen SideStore after doing this.", preferredStyle: .alert)
|
||||||
alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { _ in
|
alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { _ in
|
||||||
print("Going home")
|
print("Going home")
|
||||||
|
// Cell Shortcut
|
||||||
|
UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in
|
||||||
|
print("Cell OFF Shortcut finished execution.")}
|
||||||
|
|
||||||
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@@ -227,6 +233,8 @@ final class InstallAppOperation: ResultOperation<InstalledApp>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Cell Shortcut
|
||||||
|
UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in print("Cell OFF Shortcut finished execution.")}
|
||||||
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -211,7 +211,6 @@ private extension PatchAppOperation
|
|||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
throw PatchAppError.unsupportedOperatingSystemVersion(ProcessInfo.processInfo.operatingSystemVersion)
|
throw PatchAppError.unsupportedOperatingSystemVersion(ProcessInfo.processInfo.operatingSystemVersion)
|
||||||
#else
|
#else
|
||||||
|
|
||||||
let spotlightPath = "Applications/Spotlight.app/Spotlight"
|
let spotlightPath = "Applications/Spotlight.app/Spotlight"
|
||||||
let spotlightFileURL = self.patchDirectory.appendingPathComponent(spotlightPath)
|
let spotlightFileURL = self.patchDirectory.appendingPathComponent(spotlightPath)
|
||||||
|
|
||||||
|
|||||||
@@ -25,39 +25,48 @@ final class SendAppOperation: ResultOperation<()>
|
|||||||
self.progress.totalUnitCount = 1
|
self.progress.totalUnitCount = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
override func main()
|
override func main() {
|
||||||
{
|
|
||||||
super.main()
|
super.main()
|
||||||
|
|
||||||
if let error = self.context.error
|
if let error = self.context.error {
|
||||||
{
|
|
||||||
return self.finish(.failure(error))
|
return self.finish(.failure(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
guard let resignedApp = self.context.resignedApp else {
|
guard let resignedApp = self.context.resignedApp else {
|
||||||
return self.finish(.failure(OperationError.invalidParameters("SendAppOperation.main: self.resignedApp is nil")))
|
return self.finish(.failure(OperationError.invalidParameters("SendAppOperation.main: self.resignedApp is nil")))
|
||||||
}
|
}
|
||||||
|
|
||||||
// self.context.resignedApp.fileURL points to the app bundle, but we want the .ipa.
|
let shortcutURLoff = URL(string: "shortcuts://run-shortcut?name=TurnOffData")!
|
||||||
|
|
||||||
let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.fileURL, storeApp: nil)
|
let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.fileURL, storeApp: nil)
|
||||||
let fileURL = InstalledApp.refreshedIPAURL(for: app)
|
let fileURL = InstalledApp.refreshedIPAURL(for: app)
|
||||||
|
|
||||||
print("AFC App `fileURL`: \(fileURL.absoluteString)")
|
print("AFC App `fileURL`: \(fileURL.absoluteString)")
|
||||||
|
|
||||||
if let data = NSData(contentsOf: fileURL) {
|
// Wait for Shortcut to Finish Before Proceeding
|
||||||
do {
|
UIApplication.shared.open(shortcutURLoff, options: [:]) { _ in
|
||||||
let bytes = Data(data)
|
print("Shortcut finished execution. Proceeding with file transfer.")
|
||||||
try yeetAppAFC(app.bundleIdentifier, bytes)
|
|
||||||
self.progress.completedUnitCount += 1
|
DispatchQueue.global().async {
|
||||||
self.finish(.success(()))
|
self.processFile(at: fileURL, for: app.bundleIdentifier)
|
||||||
} catch {
|
|
||||||
self.finish(.failure(MinimuxerError.RwAfc))
|
|
||||||
self.progress.completedUnitCount += 1
|
|
||||||
self.finish(.success(()))
|
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func processFile(at fileURL: URL, for bundleIdentifier: String) {
|
||||||
|
guard let data = NSData(contentsOf: fileURL) else {
|
||||||
print("IPA doesn't exist????")
|
print("IPA doesn't exist????")
|
||||||
self.finish(.failure(OperationError(.appNotFound(name: resignedApp.name))))
|
return self.finish(.failure(OperationError(.appNotFound(name: bundleIdentifier))))
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
let bytes = Data(data)
|
||||||
|
try yeetAppAFC(bundleIdentifier, bytes)
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
self.finish(.success(()))
|
||||||
|
} catch {
|
||||||
|
self.finish(.failure(MinimuxerError.RwAfc))
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
self.finish(.success(()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
Dependencies/AltSign
vendored
2
Dependencies/AltSign
vendored
Submodule Dependencies/AltSign updated: 4819a7984f...7efe511440
@@ -95,6 +95,7 @@ def resolve_start_commit(last_successful: str):
|
|||||||
except Exception:
|
except Exception:
|
||||||
return first_commit()
|
return first_commit()
|
||||||
|
|
||||||
|
|
||||||
def generate_release_notes(last_successful, tag, branch):
|
def generate_release_notes(last_successful, tag, branch):
|
||||||
current = head_commit()
|
current = head_commit()
|
||||||
|
|
||||||
@@ -124,7 +125,12 @@ def generate_release_notes(last_successful, tag, branch):
|
|||||||
for m in messages:
|
for m in messages:
|
||||||
section += f"{fmt_msg(m)}\n"
|
section += f"{fmt_msg(m)}\n"
|
||||||
|
|
||||||
prev_authors = authors(branch)
|
if commit_exists(branch):
|
||||||
|
previous_range = branch
|
||||||
|
else:
|
||||||
|
previous_range = last_successful
|
||||||
|
|
||||||
|
prev_authors = authors(previous_range)
|
||||||
recent_authors = authors(f"{last_successful}..{current}")
|
recent_authors = authors(f"{last_successful}..{current}")
|
||||||
new_authors = recent_authors - prev_authors
|
new_authors = recent_authors - prev_authors
|
||||||
|
|
||||||
@@ -137,13 +143,26 @@ def generate_release_notes(last_successful, tag, branch):
|
|||||||
url = repo_url()
|
url = repo_url()
|
||||||
section += (
|
section += (
|
||||||
f"\n{HEADER_MARKER} Full Changelog: "
|
f"\n{HEADER_MARKER} Full Changelog: "
|
||||||
f"[{last_successful[:8]}...{current[:8]}]"
|
f"[{ref_display(last_successful)}...{ref_display(current)}]"
|
||||||
f"({url}/compare/{last_successful}...{current})\n"
|
f"({url}/compare/{last_successful}...{current})\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
return section
|
return section
|
||||||
|
|
||||||
|
|
||||||
|
def ref_display(ref):
|
||||||
|
try:
|
||||||
|
tag = run(f'git describe --tags --exact-match "{ref}" 2>/dev/null || true').strip()
|
||||||
|
|
||||||
|
# allow only semantic version tags: X.Y.Z
|
||||||
|
if re.fullmatch(r'\d+\.\d+\.\d+', tag):
|
||||||
|
return tag
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return ref[:8]
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
# markdown update
|
# markdown update
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
@@ -216,7 +235,7 @@ def retrieve_tag(tag, file_path: Path):
|
|||||||
fr"^{TAG_MARKER} {re.escape(tag)}$",
|
fr"^{TAG_MARKER} {re.escape(tag)}$",
|
||||||
content,
|
content,
|
||||||
re.MULTILINE | re.IGNORECASE,
|
re.MULTILINE | re.IGNORECASE,
|
||||||
)
|
)
|
||||||
|
|
||||||
if not match:
|
if not match:
|
||||||
return ""
|
return ""
|
||||||
@@ -276,4 +295,4 @@ def main():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -107,13 +107,13 @@ def main():
|
|||||||
gen_cmd = (
|
gen_cmd = (
|
||||||
f"python3 {script} "
|
f"python3 {script} "
|
||||||
f"{args.last_successful_commit} {args.release_tag} "
|
f"{args.last_successful_commit} {args.release_tag} "
|
||||||
f"--output-dir \"{notes_dir}\""
|
f'--output-dir "{notes_dir}"'
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
gen_cmd = (
|
gen_cmd = (
|
||||||
f"python3 {script} "
|
f"python3 {script} "
|
||||||
f"{args.short_commit} {args.release_tag} "
|
f"{args.short_commit} {args.release_tag} "
|
||||||
f"--output-dir \"{notes_dir}\""
|
f'--output-dir "{notes_dir}"'
|
||||||
)
|
)
|
||||||
|
|
||||||
sh(gen_cmd, cwd=repo_root)
|
sh(gen_cmd, cwd=repo_root)
|
||||||
|
|||||||
@@ -216,12 +216,11 @@ def tests_run(model):
|
|||||||
|
|
||||||
def encrypt_logs(name):
|
def encrypt_logs(name):
|
||||||
pwd = getenv("BUILD_LOG_ZIP_PASSWORD")
|
pwd = getenv("BUILD_LOG_ZIP_PASSWORD")
|
||||||
|
|
||||||
# skip encryption entirely if no password provided
|
|
||||||
if not pwd or not pwd.strip():
|
|
||||||
print("BUILD_LOG_ZIP_PASSWORD not set — skipping encryption", file=sys.stderr)
|
|
||||||
return
|
|
||||||
cwd = getcwd()
|
cwd = getcwd()
|
||||||
|
if not pwd or not pwd.strip():
|
||||||
|
print("BUILD_LOG_ZIP_PASSWORD not set — logs will be uploaded UNENCRYPTED", file=sys.stderr)
|
||||||
|
run(f'cd {cwd}/build/logs && zip -r {cwd}/{name}.zip *')
|
||||||
|
return
|
||||||
run(f'cd {cwd}/build/logs && zip -e -P "{pwd}" {cwd}/{name}.zip *')
|
run(f'cd {cwd}/build/logs && zip -e -P "{pwd}" {cwd}/{name}.zip *')
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
@@ -319,21 +318,32 @@ def deploy(repo, source_json, release_tag, marketing_version):
|
|||||||
raise SystemExit("Deploy push failed after retries")
|
raise SystemExit("Deploy push failed after retries")
|
||||||
|
|
||||||
|
|
||||||
def last_successful_commit(workflow, branch):
|
def last_successful_commit(is_stable, tag=None):
|
||||||
import json
|
is_stable = str(is_stable).lower() in ("1", "true", "yes")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out = runAndGet(
|
if is_stable:
|
||||||
f'gh run list '
|
prev_tag = runAndGet(
|
||||||
f'--workflow "{workflow}" '
|
r'git tag --sort=-v:refname '
|
||||||
f'--json headSha,conclusion,headBranch'
|
r'| grep -E "^[0-9]+\.[0-9]+\.[0-9]+$" '
|
||||||
)
|
r'| sed -n "2p" || true'
|
||||||
|
).strip()
|
||||||
|
|
||||||
runs = json.loads(out)
|
if prev_tag:
|
||||||
|
return runAndGet(f'git rev-parse "{prev_tag}^{{commit}}"')
|
||||||
|
|
||||||
for r in runs:
|
return None # ← changed
|
||||||
if r.get("conclusion") == "success" and r.get("headBranch") == branch:
|
|
||||||
return r["headSha"]
|
if tag:
|
||||||
|
exists = subprocess.call(
|
||||||
|
f'git rev-parse -q --verify "refs/tags/{tag}"',
|
||||||
|
shell=True,
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL,
|
||||||
|
) == 0
|
||||||
|
|
||||||
|
if exists:
|
||||||
|
return runAndGet(f'git rev-parse "{tag}^{{commit}}"')
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
@@ -342,15 +352,13 @@ def last_successful_commit(workflow, branch):
|
|||||||
|
|
||||||
def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_recommended, is_stable=False):
|
def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_recommended, is_stable=False):
|
||||||
is_stable = str(is_stable).lower() in ("1", "true", "yes")
|
is_stable = str(is_stable).lower() in ("1", "true", "yes")
|
||||||
|
draft = False
|
||||||
|
prerelease = True
|
||||||
|
latest = False
|
||||||
|
|
||||||
if is_stable:
|
if is_stable:
|
||||||
draft = True # always create a draft for stable and let user publish release
|
|
||||||
update_tag = False
|
|
||||||
prerelease = False
|
prerelease = False
|
||||||
else:
|
latest = True
|
||||||
draft = False
|
|
||||||
update_tag = True # update existing
|
|
||||||
prerelease = True
|
|
||||||
|
|
||||||
token = getenv("GH_TOKEN")
|
token = getenv("GH_TOKEN")
|
||||||
if token:
|
if token:
|
||||||
@@ -378,19 +386,20 @@ def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_rec
|
|||||||
f"--output-dir {ROOT}"
|
f"--output-dir {ROOT}"
|
||||||
)
|
)
|
||||||
|
|
||||||
release_notes = re.sub(
|
if is_stable:
|
||||||
r'^\s*#{1,6}\s*what(?:\'?s|\s+is)?\s+(?:new|changed).*',
|
release_notes = re.sub(
|
||||||
"## What's Changed",
|
r'(?im)^[ \t]*#{1,6}[ \t]*what[’\']?s[ \t]+changed[ \t]*$',
|
||||||
release_notes,
|
"## What's Changed",
|
||||||
flags=re.IGNORECASE | re.MULTILINE,
|
release_notes,
|
||||||
)
|
flags=re.IGNORECASE | re.MULTILINE,
|
||||||
|
)
|
||||||
|
|
||||||
upstream_block = ""
|
upstream_block = ""
|
||||||
if upstream_tag_recommended and upstream_tag_recommended.strip():
|
if upstream_tag_recommended and upstream_tag_recommended.strip():
|
||||||
tag = upstream_tag_recommended.strip()
|
tag = upstream_tag_recommended.strip()
|
||||||
upstream_block = (
|
upstream_block = (
|
||||||
f"If you want to try out new features early but want a lower chance of bugs, "
|
f"If you want to try out new features early but want a lower chance of bugs, "
|
||||||
f"you can look at [SideStore {tag}]"
|
f"you can look at [{repo} {tag}]"
|
||||||
f"(https://github.com/{repo}/releases?q={tag}).\n\n"
|
f"(https://github.com/{repo}/releases?q={tag}).\n\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -406,14 +415,31 @@ def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_rec
|
|||||||
|
|
||||||
draft_flag = "--draft" if draft else ""
|
draft_flag = "--draft" if draft else ""
|
||||||
prerelease_flag = "--prerelease" if prerelease else ""
|
prerelease_flag = "--prerelease" if prerelease else ""
|
||||||
latest_flag = "" if update_tag else "--latest=false"
|
latest_flag = "--latest=true" if latest else ""
|
||||||
|
|
||||||
run(
|
# create release if it doesn't exist
|
||||||
f'gh release edit "{release_tag}" '
|
exists = subprocess.call(
|
||||||
f'--title "{release_name}" '
|
f'gh release view "{release_tag}"',
|
||||||
f'--notes-file "{body_file}" '
|
shell=True,
|
||||||
f'{draft_flag} {prerelease_flag} {latest_flag}'
|
cwd=ROOT,
|
||||||
)
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL,
|
||||||
|
) == 0
|
||||||
|
|
||||||
|
if exists:
|
||||||
|
run(
|
||||||
|
f'gh release edit "{release_tag}" '
|
||||||
|
f'--title "{release_name}" '
|
||||||
|
f'--notes-file "{body_file}" '
|
||||||
|
f'{draft_flag} {prerelease_flag} {latest_flag}'
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
run(
|
||||||
|
f'gh release create "{release_tag}" '
|
||||||
|
f'--title "{release_name}" '
|
||||||
|
f'--notes-file "{body_file}" '
|
||||||
|
f'{draft_flag} {prerelease_flag} {latest_flag}'
|
||||||
|
)
|
||||||
|
|
||||||
run(
|
run(
|
||||||
f'gh release upload "{release_tag}" '
|
f'gh release upload "{release_tag}" '
|
||||||
@@ -498,7 +524,7 @@ COMMANDS = {
|
|||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
# RELEASE / DEPLOY
|
# RELEASE / DEPLOY
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
"last-successful-commit" : (last_successful_commit, 2, "<workflow_name> <branch>"),
|
"last-successful-commit" : (last_successful_commit, 1, "<is_stable> [tag]"),
|
||||||
"release-notes" : (release_notes, 1, "<tag>"),
|
"release-notes" : (release_notes, 1, "<tag>"),
|
||||||
"retrieve-release-notes" : (retrieve_release_notes, 1, "<tag>"),
|
"retrieve-release-notes" : (retrieve_release_notes, 1, "<tag>"),
|
||||||
"generate-metadata" : (generate_metadata, 7,
|
"generate-metadata" : (generate_metadata, 7,
|
||||||
@@ -532,9 +558,9 @@ def main():
|
|||||||
suffix = f" {arg_usage}" if arg_usage else ""
|
suffix = f" {arg_usage}" if arg_usage else ""
|
||||||
raise SystemExit(f"Usage: workflow.py {cmd}{suffix}")
|
raise SystemExit(f"Usage: workflow.py {cmd}{suffix}")
|
||||||
|
|
||||||
args = sys.argv[2:2 + argc]
|
args = sys.argv[2:]
|
||||||
|
|
||||||
result = func(*args) if argc else func()
|
result = func(*args) if args else func()
|
||||||
|
|
||||||
# ONLY real outputs go to stdout
|
# ONLY real outputs go to stdout
|
||||||
if result is not None:
|
if result is not None:
|
||||||
|
|||||||
Reference in New Issue
Block a user