Compare commits

...

26 Commits

Author SHA1 Message Date
mahee96
bff192be4e ALTSign cleanup 2026-02-25 08:16:42 +05:30
mahee96
a863b2f39a ALTSign cleanup 2026-02-25 08:15:43 +05:30
mahee96
bf72a0edfc CI: add what xcode is suggesting (xcode noise from auto create schemes) 2026-02-25 08:15:31 +05:30
mahee96
06ad6488cc CI: changelog in md was incorrect in release notes 2026-02-25 08:08:46 +05:30
mahee96
12f84b2365 CI: fixes for author 2026-02-25 07:46:54 +05:30
mahee96
118f64de8a CI: multiple fixes 2026-02-25 07:33:55 +05:30
mahee96
555bb3d985 CI: remove harcoded repo name and use incoming 2026-02-25 03:30:57 +05:30
mahee96
25925aceef CI: create tag if required 2026-02-25 03:18:31 +05:30
mahee96
5444fdd9bb CI: handle zipping irrespective of encryption is possible or not 2026-02-25 03:14:50 +05:30
mahee96
f91e0a6295 fix compilation issue after recent merge 2026-02-25 03:00:34 +05:30
mahee96
4e4f0f6a3f Merge branch 'cell-staging' into develop 2026-02-25 02:50:13 +05:30
mahee96
9706a43bc1 ci - decouple source_metadata.json generation from deploy 2026-02-25 02:41:58 +05:30
mahee96
d748a89b47 ci - do not encrypt build logs if password unavailable (forks CI friendly) 2026-02-25 01:45:23 +05:30
mahee96
f412f6df23 Merge branch 'cell-shortcut' into cell-staging
# Conflicts:
#	AltStore/Operations/SendAppOperation.swift
2026-02-25 01:20:56 +05:30
mahee96
b8354d3d0e cleanup - xcode brought these new entries for schemes 2026-02-25 01:18:09 +05:30
spidy123222
625389ab96 Add Exit Shortcut 2025-04-08 15:19:33 -07:00
spidy123222
f7e34cbbe9 Rewrite SendAppOperation execution to allow to wait for shortcut execution. 2025-04-08 15:19:33 -07:00
spidy123222
0fe8d7fed9 Move to SendAppOperation 2025-04-08 15:19:33 -07:00
spidy123222
1a1aa42e02 move it behind pendiungunitcount 60 2025-04-08 15:19:33 -07:00
spidy123222
7ff4b48223 Move attempt to a higher Stage. 2025-04-08 15:19:33 -07:00
spidy123222
4801f6e8f2 Attempt a million 2025-04-08 15:19:33 -07:00
Spidy123222
ff28f6fa8f Add files via upload
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
2d141afbaf remove from install apps
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
06e38aae00 Hopefully fix problem
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
d8783230a7 fix error for open link
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
6c479bfede test open URL
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
13 changed files with 744 additions and 138 deletions

View File

@@ -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
@@ -143,24 +143,24 @@ jobs:
# -------------------------------------------------- # --------------------------------------------------
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip path: build-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: > if: >
vars.ENABLE_TESTS == '1' && vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_BUILD == '1' vars.ENABLE_TESTS_BUILD == '1'
with: with:
name: encrypted-tests-build-logs-${{ env.SHORT_COMMIT }}.zip name: tests-build-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-build-logs.zip path: tests-build-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: > if: >
vars.ENABLE_TESTS == '1' && vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_RUN == '1' vars.ENABLE_TESTS_RUN == '1'
with: with:
name: encrypted-tests-run-logs-${{ env.SHORT_COMMIT }}.zip name: tests-run-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-run-logs.zip path: tests-run-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
@@ -179,21 +179,14 @@ jobs:
token: ${{ secrets.CROSS_REPO_PUSH_KEY }} token: ${{ secrets.CROSS_REPO_PUSH_KEY }}
path: "SideStore/apps-v2.json" path: "SideStore/apps-v2.json"
# -------------------------------------------------- - name: Generate Metadata
# deploy
# --------------------------------------------------
- name: Deploy
if: env.DEPLOY_KEY != ''
run: | run: |
python3 scripts/ci/workflow.py dump-project-settings python3 scripts/ci/workflow.py dump-project-settings
PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name) PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name)
BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id) BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id)
SOURCE_JSON="_includes/source.json"
IPA_NAME="$PRODUCT_NAME.ipa" IPA_NAME="$PRODUCT_NAME.ipa"
python3 scripts/ci/workflow.py deploy \ python3 scripts/ci/workflow.py generate-metadata \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
"$CHANNEL" \ "$CHANNEL" \
"$SHORT_COMMIT" \ "$SHORT_COMMIT" \
"$MARKETING_VERSION" \ "$MARKETING_VERSION" \
@@ -202,8 +195,20 @@ jobs:
"$IPA_NAME" \ "$IPA_NAME" \
"$LAST_SUCCESSFUL_COMMIT" "$LAST_SUCCESSFUL_COMMIT"
- name: Deploy
if: env.DEPLOY_KEY != ''
run: |
SOURCE_JSON="_includes/source.json"
python3 scripts/ci/workflow.py deploy \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
"$CHANNEL" \
"$MARKETING_VERSION"
# -------------------------------------------------- # --------------------------------------------------
# upload release # upload release to GH
# -------------------------------------------------- # --------------------------------------------------
- name: Upload Release - name: Upload Release
run: | run: |

View File

@@ -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)
@@ -177,8 +177,8 @@ jobs:
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: steps.build_gate.outputs.should_skip != 'true' if: steps.build_gate.outputs.should_skip != 'true'
with: with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip path: build-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: > if: >
@@ -186,8 +186,8 @@ jobs:
vars.ENABLE_TESTS == '1' && vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_BUILD == '1' vars.ENABLE_TESTS_BUILD == '1'
with: with:
name: encrypted-tests-build-logs-${{ env.SHORT_COMMIT }}.zip name: tests-build-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-build-logs.zip path: tests-build-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: > if: >
@@ -195,8 +195,8 @@ jobs:
vars.ENABLE_TESTS == '1' && vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_RUN == '1' vars.ENABLE_TESTS_RUN == '1'
with: with:
name: encrypted-tests-run-logs-${{ env.SHORT_COMMIT }}.zip name: tests-run-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-run-logs.zip path: tests-run-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: steps.build_gate.outputs.should_skip != 'true' if: steps.build_gate.outputs.should_skip != 'true'
@@ -217,21 +217,15 @@ jobs:
token: ${{ secrets.CROSS_REPO_PUSH_KEY }} token: ${{ secrets.CROSS_REPO_PUSH_KEY }}
path: "SideStore/apps-v2.json" path: "SideStore/apps-v2.json"
# -------------------------------------------------- - name: Generate Metadata
# deploy if: steps.build_gate.outputs.should_skip != 'true'
# --------------------------------------------------
- name: Deploy
if: steps.build_gate.outputs.should_skip != 'true' && env.DEPLOY_KEY != ''
run: | run: |
python3 scripts/ci/workflow.py dump-project-settings python3 scripts/ci/workflow.py dump-project-settings
PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name) PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name)
BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id) BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id)
SOURCE_JSON="_includes/source.json"
IPA_NAME="$PRODUCT_NAME.ipa" IPA_NAME="$PRODUCT_NAME.ipa"
python3 scripts/ci/workflow.py deploy \ python3 scripts/ci/workflow.py generate-metadata \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
"$CHANNEL" \ "$CHANNEL" \
"$SHORT_COMMIT" \ "$SHORT_COMMIT" \
"$MARKETING_VERSION" \ "$MARKETING_VERSION" \
@@ -240,8 +234,20 @@ jobs:
"$IPA_NAME" \ "$IPA_NAME" \
"$LAST_SUCCESSFUL_COMMIT" "$LAST_SUCCESSFUL_COMMIT"
- name: Deploy
if: steps.build_gate.outputs.should_skip != 'true' && env.DEPLOY_KEY != ''
run: |
SOURCE_JSON="_includes/source.json"
python3 scripts/ci/workflow.py deploy \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
"$CHANNEL" \
"$MARKETING_VERSION"
# -------------------------------------------------- # --------------------------------------------------
# upload release # upload release to GH
# -------------------------------------------------- # --------------------------------------------------
- name: Upload Release - name: Upload Release
if: steps.build_gate.outputs.should_skip != 'true' if: steps.build_gate.outputs.should_skip != 'true'

View File

@@ -76,8 +76,8 @@ jobs:
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip path: build-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:

View File

@@ -16,7 +16,7 @@ jobs:
runs-on: macos-26 runs-on: macos-26
env: env:
RELEASE_NAME: Stable GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CHANNEL: stable CHANNEL: stable
UPSTREAM_CHANNEL: "" UPSTREAM_CHANNEL: ""
@@ -26,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
@@ -67,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:
@@ -90,8 +93,8 @@ jobs:
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip path: build-logs.zip
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
@@ -103,12 +106,28 @@ jobs:
name: SideStore-${{ env.MARKETING_VERSION }}-dSYMs.zip name: SideStore-${{ env.MARKETING_VERSION }}-dSYMs.zip
path: SideStore.dSYMs.zip path: SideStore.dSYMs.zip
- name: Generate Metadata
run: |
python3 scripts/ci/workflow.py dump-project-settings
PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name)
BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id)
IPA_NAME="$PRODUCT_NAME.ipa"
python3 scripts/ci/workflow.py generate-metadata \
"${{ github.ref_name }}" \
"$SHORT_COMMIT" \
"$MARKETING_VERSION" \
"$CHANNEL" \
"$BUNDLE_ID" \
"$IPA_NAME" \
"$LAST_SUCCESSFUL_COMMIT"
- name: Upload to releases - name: Upload to releases
env: env:
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" \

View File

@@ -1819,6 +1819,174 @@
remoteGlobalIDString = 44962FDA23E7A54A00E2A598; remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
remoteInfo = SwiftSampleApp; remoteInfo = SwiftSampleApp;
}; };
A8F3C1312F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87B8C3401E0E9C37002F817D;
remoteInfo = "fragmentzip-cli-macOS";
};
A8F3C1332F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB02866CCF8002E243C;
remoteInfo = "fragmentzip-cli-iOS";
};
A8F3C1352F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB52866CD91002E243C;
remoteInfo = "fragmentzip-macOS";
};
A8F3C1372F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDCE2866CDD3002E243C;
remoteInfo = "fragmentzip-iOS";
};
A8F3C13A2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BCF12F4E3794006BC252 /* libgeneral.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87977F6F227C4B71004F31DA;
remoteInfo = libgeneral;
};
A8F3C13F2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADAFF819AE7BB70050CF31;
remoteInfo = Roxas;
};
A8F3C1412F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BF8624801BB742E700C12EEE;
remoteInfo = RoxasTV;
};
A8F3C1432F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADB00319AE7BB80050CF31;
remoteInfo = RoxasTests;
};
A8F3C1472F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BFF12F4E3794006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44B1EE7C23DB90D5004E2E29;
remoteInfo = SampleApp;
};
A8F3C1492F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BFF12F4E3794006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 445A906A2400612800B487B4;
remoteInfo = "NSAttributedString+MarkdownTests";
};
A8F3C14C2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C00A2F4E3794006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44E8FA8923D90632009E1D13;
remoteInfo = SampleApp;
};
A8F3C14F2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0162F4E3794006BC252 /* SwiftSampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
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 */;
@@ -2375,6 +2543,18 @@
A8EEDA1E2F4B19B000F2436D /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; }; A8EEDA1E2F4B19B000F2436D /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
A8EEDA9B2F4B19B000F2436D /* em_proxy.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = em_proxy.xcodeproj; sourceTree = "<group>"; }; A8EEDA9B2F4B19B000F2436D /* em_proxy.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = em_proxy.xcodeproj; sourceTree = "<group>"; };
A8EEDA9D2F4B19B000F2436D /* minimuxer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = minimuxer.xcodeproj; sourceTree = "<group>"; }; A8EEDA9D2F4B19B000F2436D /* minimuxer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = minimuxer.xcodeproj; sourceTree = "<group>"; };
A8F3BCF12F4E3794006BC252 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libfragmentzip.xcodeproj; sourceTree = "<group>"; };
A8F3BFF12F4E3794006BC252 /* 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>"; };
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>"; };
@@ -4079,6 +4259,114 @@
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
A8F3BD1C2F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1322F4E37A5006BC252 /* libfragmentzip */,
A8F3C1342F4E37A5006BC252 /* libfragmentzip */,
A8F3C1362F4E37A5006BC252 /* libfragmentzip.a */,
A8F3C1382F4E37A5006BC252 /* libfragmentzip.a */,
);
name = Products;
sourceTree = "<group>";
};
A8F3BD1E2F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C13B2F4E37A5006BC252 /* libgeneral */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C01E2F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1482F4E37A5006BC252 /* SampleApp.app */,
A8F3C14A2F4E37A5006BC252 /* NSAttributedString+MarkdownTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C0202F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1502F4E37A5006BC252 /* SwiftSampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C0222F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C14D2F4E37A5006BC252 /* SampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C0962F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1402F4E37A5006BC252 /* Roxas.framework */,
A8F3C1422F4E37A5006BC252 /* Roxas.framework */,
A8F3C1442F4E37A5006BC252 /* RoxasTests.xctest */,
);
name = Products;
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 = (
@@ -4648,6 +4936,10 @@
ProductGroup = A8A5B06A2F4C347700572B4A /* Products */; ProductGroup = A8A5B06A2F4C347700572B4A /* Products */;
ProjectRef = A8A5B0622F4C347700572B4A /* libfragmentzip.xcodeproj */; ProjectRef = A8A5B0622F4C347700572B4A /* libfragmentzip.xcodeproj */;
}, },
{
ProductGroup = A8F3BD1C2F4E3794006BC252 /* Products */;
ProjectRef = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
},
{ {
ProductGroup = A8636E9B2F4CF74D00E66784 /* Products */; ProductGroup = A8636E9B2F4CF74D00E66784 /* Products */;
ProjectRef = A8636E922F4CF74D00E66784 /* libfragmentzip.xcodeproj */; ProjectRef = A8636E922F4CF74D00E66784 /* libfragmentzip.xcodeproj */;
@@ -4664,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 */;
@@ -4760,10 +5056,18 @@
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 */;
}, },
{
ProductGroup = A8F3BD1E2F4E3794006BC252 /* Products */;
ProjectRef = A8F3BCF12F4E3794006BC252 /* libgeneral.xcodeproj */;
},
{ {
ProductGroup = A8636E992F4CF74D00E66784 /* Products */; ProductGroup = A8636E992F4CF74D00E66784 /* Products */;
ProjectRef = A8636E6E2F4CF74D00E66784 /* libgeneral.xcodeproj */; ProjectRef = A8636E6E2F4CF74D00E66784 /* libgeneral.xcodeproj */;
@@ -4888,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 */;
@@ -4936,6 +5244,10 @@
ProductGroup = A86372122F4CF74D00E66784 /* Products */; ProductGroup = A86372122F4CF74D00E66784 /* Products */;
ProjectRef = A86372112F4CF74D00E66784 /* Roxas.xcodeproj */; ProjectRef = A86372112F4CF74D00E66784 /* Roxas.xcodeproj */;
}, },
{
ProductGroup = A8F3C0962F4E3794006BC252 /* Products */;
ProjectRef = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
},
{ {
ProductGroup = A8EEDA272F4B19B000F2436D /* Products */; ProductGroup = A8EEDA272F4B19B000F2436D /* Products */;
ProjectRef = A8EEDA1E2F4B19B000F2436D /* Roxas.xcodeproj */; ProjectRef = A8EEDA1E2F4B19B000F2436D /* Roxas.xcodeproj */;
@@ -4956,6 +5268,10 @@
ProductGroup = A8CCE16B2F4B76CF00B0089A /* Products */; ProductGroup = A8CCE16B2F4B76CF00B0089A /* Products */;
ProjectRef = A8CCE15B2F4B76CF00B0089A /* Roxas.xcodeproj */; ProjectRef = A8CCE15B2F4B76CF00B0089A /* Roxas.xcodeproj */;
}, },
{
ProductGroup = A8F3C01E2F4E3794006BC252 /* Products */;
ProjectRef = A8F3BFF12F4E3794006BC252 /* SampleApp.xcodeproj */;
},
{ {
ProductGroup = A811973D2F4C1C710013ABD0 /* Products */; ProductGroup = A811973D2F4C1C710013ABD0 /* Products */;
ProjectRef = A81196782F4C1C710013ABD0 /* SampleApp.xcodeproj */; ProjectRef = A81196782F4C1C710013ABD0 /* SampleApp.xcodeproj */;
@@ -5024,6 +5340,10 @@
ProductGroup = A8A5C5EE2F4C4FEC00572B4A /* Products */; ProductGroup = A8A5C5EE2F4C4FEC00572B4A /* Products */;
ProjectRef = A8A5C5C12F4C4FEC00572B4A /* SampleApp.xcodeproj */; ProjectRef = A8A5C5C12F4C4FEC00572B4A /* SampleApp.xcodeproj */;
}, },
{
ProductGroup = A8F3C0222F4E3794006BC252 /* Products */;
ProjectRef = A8F3C00A2F4E3794006BC252 /* SampleApp.xcodeproj */;
},
{ {
ProductGroup = A8118FCC2F4C1C250013ABD0 /* Products */; ProductGroup = A8118FCC2F4C1C250013ABD0 /* Products */;
ProjectRef = A8118F012F4C1C250013ABD0 /* SampleApp.xcodeproj */; ProjectRef = A8118F012F4C1C250013ABD0 /* SampleApp.xcodeproj */;
@@ -5068,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 */;
@@ -5088,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 */;
@@ -5144,6 +5472,10 @@
ProductGroup = A81197392F4C1C710013ABD0 /* Products */; ProductGroup = A81197392F4C1C710013ABD0 /* Products */;
ProjectRef = A811969D2F4C1C710013ABD0 /* SwiftSampleApp.xcodeproj */; ProjectRef = A811969D2F4C1C710013ABD0 /* SwiftSampleApp.xcodeproj */;
}, },
{
ProductGroup = A8F3C0202F4E3794006BC252 /* Products */;
ProjectRef = A8F3C0162F4E3794006BC252 /* SwiftSampleApp.xcodeproj */;
},
{ {
ProductGroup = A863719D2F4CF74D00E66784 /* Products */; ProductGroup = A863719D2F4CF74D00E66784 /* Products */;
ProjectRef = A86371932F4CF74D00E66784 /* SwiftSampleApp.xcodeproj */; ProjectRef = A86371932F4CF74D00E66784 /* SwiftSampleApp.xcodeproj */;
@@ -5168,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 */;
@@ -6959,6 +7295,174 @@
remoteRef = A8EEDAF12F4B1A0700F2436D /* PBXContainerItemProxy */; remoteRef = A8EEDAF12F4B1A0700F2436D /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR; sourceTree = BUILT_PRODUCTS_DIR;
}; };
A8F3C1322F4E37A5006BC252 /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A8F3C1312F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1342F4E37A5006BC252 /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A8F3C1332F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1362F4E37A5006BC252 /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A8F3C1352F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1382F4E37A5006BC252 /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A8F3C1372F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C13B2F4E37A5006BC252 /* libgeneral */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libgeneral;
remoteRef = A8F3C13A2F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1402F4E37A5006BC252 /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A8F3C13F2F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1422F4E37A5006BC252 /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A8F3C1412F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1442F4E37A5006BC252 /* RoxasTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = RoxasTests.xctest;
remoteRef = A8F3C1432F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1482F4E37A5006BC252 /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A8F3C1472F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C14A2F4E37A5006BC252 /* NSAttributedString+MarkdownTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "NSAttributedString+MarkdownTests.xctest";
remoteRef = A8F3C1492F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C14D2F4E37A5006BC252 /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A8F3C14C2F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1502F4E37A5006BC252 /* SwiftSampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SwiftSampleApp.app;
remoteRef = A8F3C14F2F4E37A5006BC252 /* PBXContainerItemProxy */;
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;

View File

@@ -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)

View File

@@ -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))
} }
} }

View File

@@ -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)

View File

@@ -25,12 +25,10 @@ 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))
} }
@@ -38,26 +36,37 @@ final class SendAppOperation: ResultOperation<()>
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(()))
} }
} }
} }

View File

@@ -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 ""

View File

@@ -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)

View File

@@ -7,6 +7,7 @@ from pathlib import Path
import time import time
import json import json
import re import re
from posix import getcwd
# REPO ROOT relative to script dir # REPO ROOT relative to script dir
ROOT = Path(__file__).resolve().parents[2] ROOT = Path(__file__).resolve().parents[2]
@@ -214,13 +215,13 @@ def tests_run(model):
# ---------------------------------------------------------- # ----------------------------------------------------------
def encrypt_logs(name): def encrypt_logs(name):
default_pwd = "12345" pwd = getenv("BUILD_LOG_ZIP_PASSWORD")
pwd = getenv("BUILD_LOG_ZIP_PASSWORD", default_pwd) cwd = getcwd()
if not pwd or not pwd.strip():
if pwd == default_pwd: print("BUILD_LOG_ZIP_PASSWORD not set — logs will be uploaded UNENCRYPTED", file=sys.stderr)
print("Warning: BUILD_LOG_ZIP_PASSWORD not set, using fallback password", file=sys.stderr) run(f'cd {cwd}/build/logs && zip -r {cwd}/{name}.zip *')
return
run(f'cd build/logs && zip -e -P "{pwd}" ../../{name}.zip *') run(f'cd {cwd}/build/logs && zip -e -P "{pwd}" {cwd}/{name}.zip *')
# ---------------------------------------------------------- # ----------------------------------------------------------
# RELEASE NOTES # RELEASE NOTES
@@ -244,22 +245,13 @@ def retrieve_release_notes(tag):
# ---------------------------------------------------------- # ----------------------------------------------------------
# DEPLOY SOURCE.JSON # DEPLOY SOURCE.JSON
# ---------------------------------------------------------- # ----------------------------------------------------------
def generate_metadata(release_tag, short_commit, marketing_version, channel, bundle_id, ipa_name, last_successful_commit=None):
def deploy(repo, source_json, release_tag, short_commit, marketing_version, channel, bundle_id, ipa_name, last_successful_commit=None):
repo = (ROOT / repo).resolve()
ipa_path = ROOT / ipa_name ipa_path = ROOT / ipa_name
source_json_path = repo / source_json
metadata = 'source-metadata.json' metadata = 'source-metadata.json'
if not repo.exists():
raise SystemExit(f"{repo} repo missing")
if not ipa_path.exists(): if not ipa_path.exists():
raise SystemExit(f"{ipa_path} missing") raise SystemExit(f"{ipa_path} missing")
if not source_json_path.exists():
raise SystemExit(f"{source_json} missing inside repo")
cmd = ( cmd = (
f"python3 {SCRIPTS}/generate_source_metadata.py " f"python3 {SCRIPTS}/generate_source_metadata.py "
f"--repo-root {ROOT} " f"--repo-root {ROOT} "
@@ -274,12 +266,26 @@ def deploy(repo, source_json, release_tag, short_commit, marketing_version, chan
f"--bundle-id {bundle_id}" f"--bundle-id {bundle_id}"
) )
# pass only if provided
if last_successful_commit: if last_successful_commit:
cmd += f" --last-successful-commit {last_successful_commit}" cmd += f" --last-successful-commit {last_successful_commit}"
run(cmd) run(cmd)
def deploy(repo, source_json, release_tag, marketing_version):
repo = (ROOT / repo).resolve()
source_json_path = repo / source_json
metadata = 'source-metadata.json'
if not repo.exists():
raise SystemExit(f"{repo} repo missing")
if not (repo / ".git").exists():
print("Repo is not a git repository, skipping deploy", file=sys.stderr)
return
if not source_json_path.exists():
raise SystemExit(f"{source_json} missing inside repo")
run("git config user.name 'GitHub Actions'", check=False) run("git config user.name 'GitHub Actions'", check=False)
run("git config user.email 'github-actions@github.com'", check=False) run("git config user.email 'github-actions@github.com'", check=False)
@@ -311,21 +317,33 @@ def deploy(repo, source_json, release_tag, short_commit, marketing_version, chan
else: else:
raise SystemExit("Deploy push failed after retries") raise SystemExit("Deploy push failed after retries")
def last_successful_commit(workflow, branch):
import json def last_successful_commit(is_stable, tag=None):
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
@@ -334,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:
@@ -370,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"
) )
@@ -398,18 +415,35 @@ 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}" '
f'SideStore.ipa SideStore.dSYMs.zip encrypted-build-logs.zip ' f'SideStore.ipa SideStore.dSYMs.zip build-logs.zip '
f'--clobber' f'--clobber'
) )
@@ -483,20 +517,22 @@ COMMANDS = {
# ---------------------------------------------------------- # ----------------------------------------------------------
# LOG ENCRYPTION # LOG ENCRYPTION
# ---------------------------------------------------------- # ----------------------------------------------------------
"encrypt-build" : (lambda: encrypt_logs("encrypted-build-logs"), 0, ""), "encrypt-build" : (lambda: encrypt_logs("build-logs"), 0, ""),
"encrypt-tests-build" : (lambda: encrypt_logs("encrypted-tests-build-logs"), 0, ""), "encrypt-tests-build" : (lambda: encrypt_logs("tests-build-logs"), 0, ""),
"encrypt-tests-run" : (lambda: encrypt_logs("encrypted-tests-run-logs"), 0, ""), "encrypt-tests-run" : (lambda: encrypt_logs("tests-run-logs"), 0, ""),
# ---------------------------------------------------------- # ----------------------------------------------------------
# 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>"),
"deploy" : (deploy, 9, "generate-metadata" : (generate_metadata, 7,
"<repo> <source_json> <release_tag> <short_commit> <marketing_version> <channel> <bundle_id> <ipa_name> [last_successful_commit]"), "<release_tag> <short_commit> <marketing_version> <channel> <bundle_id> <ipa_name> [last_successful_commit]"),
"upload-release" : (upload_release, 5, "<release_name> <release_tag> <commit_sha> <repo> <upstream_tag_recommended> [is_stable]"), "deploy" : (deploy, 4,
} "<repo> <source_json> <release_tag> <marketing_version>"),
"upload-release" : (upload_release, 5,
"<release_name> <release_tag> <commit_sha> <repo> <upstream_tag_recommended> [is_stable]"),}
def main(): def main():
def usage(): def usage():
@@ -522,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: