diff --git a/.circleci/config.yml b/.circleci/config.yml
index 0ea0edd9a..1281b7eee 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,7 +1,7 @@
jobs:
build_and_test:
macos:
- xcode: 15.4.0
+ xcode: 16.0
steps:
- checkout
- run:
@@ -9,10 +9,10 @@ jobs:
command: git submodule update --init --recursive --depth 1
- run:
name: Build Loop
- command: set -o pipefail && time xcodebuild -workspace LoopWorkspace.xcworkspace -scheme 'LoopWorkspace' -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.5' build | xcpretty
+ command: set -o pipefail && time xcodebuild -workspace LoopWorkspace.xcworkspace -scheme 'LoopWorkspace' -destination 'name=iPhone 16' build | xcpretty
- run:
name: Run Tests
- command: set -o pipefail && time xcodebuild -workspace LoopWorkspace.xcworkspace -scheme 'LoopWorkspace' -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.5' test | xcpretty
+ command: set -o pipefail && time xcodebuild -workspace LoopWorkspace.xcworkspace -scheme 'LoopWorkspace' -destination 'name=iPhone 16' test | xcpretty
workflows:
version: 2
build_and_test:
diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml
index aab334ab6..8ff87a55f 100644
--- a/.github/workflows/add_identifiers.yml
+++ b/.github/workflows/add_identifiers.yml
@@ -24,8 +24,15 @@ jobs:
# Patch Fastlane Match to not print tables
- name: Patch Match Tables
- run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d"
-
+ run: |
+ TABLE_PRINTER_PATH=$(ruby -e 'puts Gem::Specification.find_by_name("fastlane").gem_dir')/match/lib/match/table_printer.rb
+ if [ -f "$TABLE_PRINTER_PATH" ]; then
+ sed -i "" "/puts(Terminal::Table.new(params))/d" "$TABLE_PRINTER_PATH"
+ else
+ echo "table_printer.rb not found"
+ exit 1
+ fi
+
# Install project dependencies
- name: Install Project Dependencies
run: bundle install
diff --git a/.github/workflows/build_loop.yml b/.github/workflows/build_loop.yml
index dc84dbee8..f704f38ee 100644
--- a/.github/workflows/build_loop.yml
+++ b/.github/workflows/build_loop.yml
@@ -2,26 +2,27 @@ name: 4. Build Loop
run-name: Build Loop (${{ github.ref_name }})
on:
workflow_dispatch:
-
+
## Remove the "#" sign from the beginning of the line below to get automated builds on push (code changes in your repository)
#push:
-
+
schedule:
- - cron: '0 8 * * 3' # Checks for updates at 08:00 UTC every Wednesday
- - cron: '0 6 1 * *' # Builds the app on the 1st of every month at 06:00 UTC
+ - cron: "0 8 * * 3" # Checks for updates at 08:00 UTC every Wednesday
+ - cron: "0 6 1 * *" # Builds the app on the 1st of every month at 06:00 UTC
env:
UPSTREAM_REPO: LoopKit/LoopWorkspace
UPSTREAM_BRANCH: ${{ github.ref_name }} # branch on upstream repository to sync from (replace with specific branch name if needed)
TARGET_BRANCH: ${{ github.ref_name }} # target branch on fork to be kept in sync, and target branch on upstream to be kept alive (replace with specific branch name if needed)
- ALIVE_BRANCH: alive
+ ALIVE_BRANCH_MAIN: alive-main
+ ALIVE_BRANCH_DEV: alive-dev
jobs:
validate:
name: Validate
uses: ./.github/workflows/validate_secrets.yml
secrets: inherit
-
+
# Checks if GH_PAT holds workflow permissions
# Checks for existence of alive branch; if non-existent creates it
check_alive_and_permissions:
@@ -32,126 +33,155 @@ jobs:
contents: write
outputs:
WORKFLOW_PERMISSION: ${{ steps.workflow-permission.outputs.has_permission }}
-
+
steps:
- - name: Check for workflow permissions
- id: workflow-permission
- env:
- TOKEN_TO_CHECK: ${{ secrets.GH_PAT }}
- run: |
- PERMISSIONS=$(curl -sS -f -I -H "Authorization: token ${{ env.TOKEN_TO_CHECK }}" https://api.github.com | grep ^x-oauth-scopes: | cut -d' ' -f2-);
-
- if [[ $PERMISSIONS =~ "workflow" || $PERMISSIONS == "" ]]; then
- echo "GH_PAT holds workflow permissions or is fine-grained PAT."
- echo "has_permission=true" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false.
- else
- echo "GH_PAT lacks workflow permissions."
- echo "Automated build features will be skipped!"
- echo "has_permission=false" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false.
- fi
-
- - name: Check for alive branch
- if: steps.workflow-permission.outputs.has_permission == 'true'
- env:
- GITHUB_TOKEN: ${{ secrets.GH_PAT }}
- run: |
- if [[ "$(gh api -H "Accept: application/vnd.github+json" /repos/${{ github.repository_owner }}/LoopWorkspace/branches | jq --raw-output 'any(.name=="alive")')" == "true" ]]; then
- echo "Branch 'alive' exists."
- echo "ALIVE_BRANCH_EXISTS=true" >> $GITHUB_ENV # Set ALIVE_BRANCH_EXISTS to true
- else
- echo "Branch 'alive' does not exist."
- echo "ALIVE_BRANCH_EXISTS=false" >> $GITHUB_ENV # Set ALIVE_BRANCH_EXISTS to false
- fi
-
- - name: Create alive branch
- if: env.ALIVE_BRANCH_EXISTS == 'false'
- env:
- GITHUB_TOKEN: ${{ secrets.GH_PAT }}
- run: |
- # Get ref for LoopKit/LoopWorkspace:dev
- SHA=$(curl -sS https://api.github.com/repos/${{ env.UPSTREAM_REPO }}/git/refs \
- | jq '.[] | select(.ref == "refs/heads/dev" ) | .object.sha' \
- | tr -d '"'
- );
-
- # Create alive branch based on LoopKit/LoopWorkspace:dev
- gh api \
- --method POST \
- -H "Authorization: token $GITHUB_TOKEN" \
- -H "Accept: application/vnd.github.v3+json" \
- /repos/${{ github.repository_owner }}/LoopWorkspace/git/refs \
- -f ref='refs/heads/alive' \
- -f sha=$SHA
-
+ - name: Check for workflow permissions
+ id: workflow-permission
+ env:
+ TOKEN_TO_CHECK: ${{ secrets.GH_PAT }}
+ run: |
+ PERMISSIONS=$(curl -sS -f -I -H "Authorization: token ${{ env.TOKEN_TO_CHECK }}" https://api.github.com | grep ^x-oauth-scopes: | cut -d' ' -f2-);
+
+ if [[ $PERMISSIONS =~ "workflow" || $PERMISSIONS == "" ]]; then
+ echo "GH_PAT holds workflow permissions or is fine-grained PAT."
+ echo "has_permission=true" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false.
+ else
+ echo "GH_PAT lacks workflow permissions."
+ echo "Automated build features will be skipped!"
+ echo "has_permission=false" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false.
+ fi
+
+ - name: Check for alive branches
+ if: steps.workflow-permission.outputs.has_permission == 'true'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GH_PAT }}
+ run: |
+ if [[ $(gh api -H "Accept: application/vnd.github+json" /repos/${{ github.repository_owner }}/LoopWorkspace/branches | jq --raw-output '[.[] | select(.name == "alive-main" or .name == "alive-dev")] | length > 0') == "true" ]]; then
+ echo "Branches 'alive-main' or 'alive-dev' exist."
+ echo "ALIVE_BRANCH_EXISTS=true" >> $GITHUB_ENV
+ else
+ echo "Branches 'alive-main' and 'alive-dev' do not exist."
+ echo "ALIVE_BRANCH_EXISTS=false" >> $GITHUB_ENV
+ fi
+
+ - name: Create alive branches
+ if: env.ALIVE_BRANCH_EXISTS == 'false'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GH_PAT }}
+ run: |
+ # Get ref for LoopKit/LoopWorkspace:main
+ SHA_MAIN=$(curl -sS -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/${{ env.UPSTREAM_REPO }}/git/refs/heads/main | jq -r '.object.sha')
+
+ # Get ref for LoopKit/LoopWorkspace:dev
+ SHA_DEV=$(curl -sS -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/${{ env.UPSTREAM_REPO }}/git/refs/heads/dev | jq -r '.object.sha')
+
+ # Create alive-main branch based on LoopKit/LoopWorkspace:main
+ gh api \
+ --method POST \
+ -H "Authorization: token $GITHUB_TOKEN" \
+ -H "Accept: application/vnd.github.v3+json" \
+ /repos/${{ github.repository_owner }}/LoopWorkspace/git/refs \
+ -f ref='refs/heads/alive-main' \
+ -f sha=$SHA_MAIN
+
+ # Create alive-dev branch based on LoopKit/LoopWorkspace:dev
+ gh api \
+ --method POST \
+ -H "Authorization: token $GITHUB_TOKEN" \
+ -H "Accept: application/vnd.github.v3+json" \
+ /repos/${{ github.repository_owner }}/LoopWorkspace/git/refs \
+ -f ref='refs/heads/alive-dev' \
+ -f sha=$SHA_DEV
+
# Checks for changes in upstream repository; if changes exist prompts sync for build
# Performs keepalive to avoid stale fork
check_latest_from_upstream:
needs: [validate, check_alive_and_permissions]
runs-on: ubuntu-latest
name: Check upstream and keep alive
- outputs:
+ outputs:
NEW_COMMITS: ${{ steps.sync.outputs.has_new_commits }}
-
+ ABORT_SYNC: ${{ steps.check_branch.outputs.ABORT_SYNC }}
+
steps:
- - name: Checkout target repo
- if: |
- needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
- uses: actions/checkout@v4
- with:
- token: ${{ secrets.GH_PAT }}
- ref: alive
-
- - name: Sync upstream changes
- if: | # do not run the upstream sync action on the upstream repository
- needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'LoopKit'
- id: sync
- uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
- with:
- target_sync_branch: ${{ env.ALIVE_BRANCH }}
- shallow_since: 6 months ago
- target_repo_token: ${{ secrets.GH_PAT }}
- upstream_sync_branch: ${{ env.UPSTREAM_BRANCH }}
- upstream_sync_repo: ${{ env.UPSTREAM_REPO }}
-
- # Display a sample message based on the sync output var 'has_new_commits'
- - name: New commits found
- if: |
- needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'true'
- run: echo "New commits were found to sync."
-
- - name: No new commits
- if: |
- needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'false'
- run: echo "There were no new commits."
-
- - name: Show value of 'has_new_commits'
- if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && vars.SCHEDULED_SYNC != 'false'
- run: |
- echo ${{ steps.sync.outputs.has_new_commits }}
- echo "NEW_COMMITS=${{ steps.sync.outputs.has_new_commits }}" >> $GITHUB_OUTPUT
-
- # Keep repository "alive": add empty commits to ALIVE_BRANCH after "time_elapsed" days of inactivity to avoid inactivation of scheduled workflows
- - name: Keep alive
- if: |
- needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
- uses: gautamkrishnar/keepalive-workflow@v1 # using the workflow with default settings
- with:
- time_elapsed: 20 # Time elapsed from the previous commit to trigger a new automated commit (in days)
-
- - name: Show scheduled build configuration message
- if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION != 'true'
- run: |
- echo "### :calendar: Scheduled Sync and Build Disabled :mobile_phone_off:" >> $GITHUB_STEP_SUMMARY
- echo "You have not yet configured the scheduled sync and build for Loop's browser build." >> $GITHUB_STEP_SUMMARY
- echo "Synchronizing your fork of LoopWorkspace
with the upstream repository LoopKit/LoopWorkspace
will be skipped." >> $GITHUB_STEP_SUMMARY
- echo "If you want to enable automatic builds and updates for your Loop, please follow the instructions \
- under the following path LoopWorkspace/fastlane/testflight.md
." >> $GITHUB_STEP_SUMMARY
-
+ - name: Check if running on main or dev branch
+ if: |
+ needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+ (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
+ id: check_branch
+ run: |
+ if [ "${GITHUB_REF##*/}" = "main" ]; then
+ echo "Running on main branch"
+ echo "ALIVE_BRANCH=${ALIVE_BRANCH_MAIN}" >> $GITHUB_OUTPUT
+ echo "ABORT_SYNC=false" >> $GITHUB_OUTPUT
+ elif [ "${GITHUB_REF##*/}" = "dev" ]; then
+ echo "Running on dev branch"
+ echo "ALIVE_BRANCH=${ALIVE_BRANCH_DEV}" >> $GITHUB_OUTPUT
+ echo "ABORT_SYNC=false" >> $GITHUB_OUTPUT
+ else
+ echo "Not running on main or dev branch"
+ echo "ABORT_SYNC=true" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Checkout target repo
+ if: |
+ needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+ (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.GH_PAT }}
+ ref: ${{ steps.check_branch.outputs.ALIVE_BRANCH }}
+
+ - name: Sync upstream changes
+ if: | # do not run the upstream sync action on the upstream repository
+ needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+ vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'LoopKit' && steps.check_branch.outputs.ABORT_SYNC == 'false'
+ id: sync
+ uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
+ with:
+ target_sync_branch: ${{ steps.check_branch.outputs.ALIVE_BRANCH }}
+ shallow_since: 6 months ago
+ target_repo_token: ${{ secrets.GH_PAT }}
+ upstream_sync_branch: ${{ env.UPSTREAM_BRANCH }}
+ upstream_sync_repo: ${{ env.UPSTREAM_REPO }}
+
+ # Display a sample message based on the sync output var 'has_new_commits'
+ - name: New commits found
+ if: |
+ needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+ vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'true'
+ run: echo "New commits were found to sync."
+
+ - name: No new commits
+ if: |
+ needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+ vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'false'
+ run: echo "There were no new commits."
+
+ - name: Show value of 'has_new_commits'
+ if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && vars.SCHEDULED_SYNC != 'false' && steps.check_branch.outputs.ABORT_SYNC == 'false'
+ run: |
+ echo ${{ steps.sync.outputs.has_new_commits }}
+ echo "NEW_COMMITS=${{ steps.sync.outputs.has_new_commits }}" >> $GITHUB_OUTPUT
+
+ # Keep repository "alive": add empty commits to ALIVE_BRANCH after "time_elapsed" days of inactivity to avoid inactivation of scheduled workflows
+ - name: Keep alive
+ if: |
+ needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+ (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
+ uses: gautamkrishnar/keepalive-workflow@v1 # using the workflow with default settings
+ with:
+ time_elapsed: 20 # Time elapsed from the previous commit to trigger a new automated commit (in days)
+
+ - name: Show scheduled build configuration message
+ if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION != 'true'
+ run: |
+ echo "### :calendar: Scheduled Sync and Build Disabled :mobile_phone_off:" >> $GITHUB_STEP_SUMMARY
+ echo "You have not yet configured the scheduled sync and build for Loop's browser build." >> $GITHUB_STEP_SUMMARY
+ echo "Synchronizing your fork of LoopWorkspace
with the upstream repository LoopKit/LoopWorkspace
will be skipped." >> $GITHUB_STEP_SUMMARY
+ echo "If you want to enable automatic builds and updates for your Loop, please follow the instructions \
+ under the following path LoopWorkspace/fastlane/testflight.md
." >> $GITHUB_STEP_SUMMARY
+
# Builds Loop
build:
name: Build
@@ -159,16 +189,17 @@ jobs:
runs-on: macos-14
permissions:
contents: write
- if: | # runs if started manually, or if sync schedule is set and enabled and scheduled on the first Saturday each month, or if sync schedule is set and enabled and new commits were found
- github.event_name == 'workflow_dispatch' ||
- (needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- (vars.SCHEDULED_BUILD != 'false' && github.event.schedule == '0 6 1 * *') ||
- (vars.SCHEDULED_SYNC != 'false' && needs.check_latest_from_upstream.outputs.NEW_COMMITS == 'true' )
- )
+ if:
+ | # runs if started manually, or if sync schedule is set and enabled and scheduled on the first Saturday each month, or if sync schedule is set and enabled and new commits were found
+ github.event_name == 'workflow_dispatch' ||
+ (needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+ (vars.SCHEDULED_BUILD != 'false' && github.event.schedule == '0 6 1 * *') ||
+ (vars.SCHEDULED_SYNC != 'false' && needs.check_latest_from_upstream.outputs.NEW_COMMITS == 'true' )
+ )
steps:
- name: Select Xcode version
- run: "sudo xcode-select --switch /Applications/Xcode_15.4.app/Contents/Developer"
-
+ run: "sudo xcode-select --switch /Applications/Xcode_16.1.app/Contents/Developer"
+
- name: Checkout Repo for syncing
if: |
needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
@@ -176,12 +207,12 @@ jobs:
uses: actions/checkout@v4
with:
token: ${{ secrets.GH_PAT }}
- ref: ${{ env.TARGET_BRANCH }}
-
+ ref: ${{ env.TARGET_BRANCH }}
+
- name: Sync upstream changes
if: | # do not run the upstream sync action on the upstream repository
needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'LoopKit'
+ vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'LoopKit' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
id: sync
uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
with:
@@ -190,24 +221,24 @@ jobs:
target_repo_token: ${{ secrets.GH_PAT }}
upstream_sync_branch: ${{ env.UPSTREAM_BRANCH }}
upstream_sync_repo: ${{ env.UPSTREAM_REPO }}
-
+
# Display a sample message based on the sync output var 'has_new_commits'
- name: New commits found
if: |
needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'true'
+ vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'true' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
run: echo "New commits were found to sync."
-
+
- name: No new commits
if: |
needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
- vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'false'
+ vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'false' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
run: echo "There were no new commits."
-
+
- name: Show value of 'has_new_commits'
if: |
needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true'
- && vars.SCHEDULED_SYNC != 'false'
+ && vars.SCHEDULED_SYNC != 'false' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
run: |
echo ${{ steps.sync.outputs.has_new_commits }}
echo "NEW_COMMITS=${{ steps.sync.outputs.has_new_commits }}" >> $GITHUB_OUTPUT
@@ -218,7 +249,7 @@ jobs:
token: ${{ secrets.GH_PAT }}
submodules: recursive
ref: ${{ env.TARGET_BRANCH }}
-
+
# Customize Loop: Download and apply patches
- name: Customize Loop
run: |
@@ -233,24 +264,30 @@ jobs:
# Template for customizing submodule Loop (changes Loop app name to "CustomLoop")
# Remove the "#" sign from the beginning of the line below to activate:
#curl https://github.com/loopnlearn/Loop/commit/d206432b024279ef710df462b20bd464cd9682d4.patch | git apply --directory=Loop -v --whitespace=fix
-
+
# Submodule LoopKit patches:
# General template for customizing submodule LoopKit
# Copy url from a GitHub commit or pull request and insert below, and remove the "#" sign from the beginning of the line to activate:
#curl url_to_github_commit.patch | git apply --directory=LoopKit -v --whitespace=fix
-
+
# Submodule xxxxx patches:
# Add patches for customization of additional submodules by following the templates above,
# and make sure to specify the submodule by setting "--directory=(submodule_name)".
# Several patches may be added per submodule.
# Adding comments (#) may be useful to easily tell the individual patches apart.
-
-
+
# Patch Fastlane Match to not print tables
- name: Patch Match Tables
- run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d"
-
+ run: |
+ TABLE_PRINTER_PATH=$(ruby -e 'puts Gem::Specification.find_by_name("fastlane").gem_dir')/match/lib/match/table_printer.rb
+ if [ -f "$TABLE_PRINTER_PATH" ]; then
+ sed -i "" "/puts(Terminal::Table.new(params))/d" "$TABLE_PRINTER_PATH"
+ else
+ echo "table_printer.rb not found"
+ exit 1
+ fi
+
# Install project dependencies
- name: Install Project Dependencies
run: bundle install
@@ -258,10 +295,10 @@ jobs:
# Sync the GitHub runner clock with the Windows time server (workaround as suggested in https://github.com/actions/runner/issues/2996)
- name: Sync clock
run: sudo sntp -sS time.windows.com
-
+
# Build signed Loop IPA file
- name: Fastlane Build & Archive
- run: bundle exec fastlane build_loop
+ run: bundle exec fastlane build_loop
env:
TEAMID: ${{ secrets.TEAMID }}
GH_PAT: ${{ secrets.GH_PAT }}
@@ -269,7 +306,7 @@ jobs:
FASTLANE_ISSUER_ID: ${{ secrets.FASTLANE_ISSUER_ID }}
FASTLANE_KEY: ${{ secrets.FASTLANE_KEY }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
-
+
# Upload to TestFlight
- name: Fastlane upload to TestFlight
run: bundle exec fastlane release
@@ -289,4 +326,4 @@ jobs:
name: build-artifacts
path: |
artifacts
- buildlog
+ buildlog
\ No newline at end of file
diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml
index 90bb4f75b..9c4b51722 100644
--- a/.github/workflows/create_certs.yml
+++ b/.github/workflows/create_certs.yml
@@ -24,8 +24,15 @@ jobs:
# Patch Fastlane Match to not print tables
- name: Patch Match Tables
- run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d"
-
+ run: |
+ TABLE_PRINTER_PATH=$(ruby -e 'puts Gem::Specification.find_by_name("fastlane").gem_dir')/match/lib/match/table_printer.rb
+ if [ -f "$TABLE_PRINTER_PATH" ]; then
+ sed -i "" "/puts(Terminal::Table.new(params))/d" "$TABLE_PRINTER_PATH"
+ else
+ echo "table_printer.rb not found"
+ exit 1
+ fi
+
# Install project dependencies
- name: Install Project Dependencies
run: bundle install
diff --git a/.github/workflows/validate_secrets.yml b/.github/workflows/validate_secrets.yml
index 5ad976a01..15562a740 100644
--- a/.github/workflows/validate_secrets.yml
+++ b/.github/workflows/validate_secrets.yml
@@ -16,14 +16,14 @@ jobs:
id: access-token
run: |
# Validate Access Token
-
+
# Ensure that gh exit codes are handled when output is piped.
set -o pipefail
-
+
# Define patterns to validate the access token (GH_PAT) and distinguish between classic and fine-grained tokens.
GH_PAT_CLASSIC_PATTERN='^ghp_[a-zA-Z0-9]{36}$'
GH_PAT_FINE_GRAINED_PATTERN='^github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}$'
-
+
# Validate Access Token (GH_PAT)
if [ -z "$GH_PAT" ]; then
failed=true
@@ -65,12 +65,12 @@ jobs:
echo "has_workflow_permission=true" >> $GITHUB_OUTPUT
fi
fi
-
+
# Exit unsuccessfully if secret validation failed.
if [ $failed ]; then
exit 2
fi
-
+
validate-match-secrets:
name: Match-Secrets
needs: validate-access-token
@@ -81,10 +81,10 @@ jobs:
- name: Validate Match-Secrets
run: |
# Validate Match-Secrets
-
+
# Ensure that gh exit codes are handled when output is piped.
set -o pipefail
-
+
# If a Match-Secrets repository does not exist, attempt to create one.
if ! visibility=$(gh repo view ${{ github.repository_owner }}/Match-Secrets --json visibility | jq --raw-output '.visibility | ascii_downcase'); then
echo "A '${{ github.repository_owner }}/Match-Secrets' repository could not be found using the GH_PAT secret. Attempting to create one..."
@@ -103,12 +103,12 @@ jobs:
else
echo "Found a private '${{ github.repository_owner }}/Match-Secrets' repository to use."
fi
-
+
# Exit unsuccessfully if secret validation failed.
if [ $failed ]; then
exit 2
fi
-
+
validate-fastlane-secrets:
name: Fastlane
needs: [validate-access-token, validate-match-secrets]
@@ -124,18 +124,18 @@ jobs:
steps:
- name: Checkout Repo
uses: actions/checkout@v4
-
+
- name: Install Project Dependencies
run: bundle install
# Sync the GitHub runner clock with the Windows time server (workaround as suggested in https://github.com/actions/runner/issues/2996)
- name: Sync clock
run: sudo sntp -sS time.windows.com
-
+
- name: Validate Fastlane Secrets
run: |
# Validate Fastlane Secrets
-
+
# Validate TEAMID
if [ -z "$TEAMID" ]; then
failed=true
@@ -147,20 +147,20 @@ jobs:
failed=true
echo "::error::The TEAMID secret is set but invalid. Verify that it is set correctly (only uppercase letters and numbers) and try again."
fi
-
+
# Validate MATCH_PASSWORD
if [ -z "$MATCH_PASSWORD" ]; then
failed=true
echo "::error::The MATCH_PASSWORD secret is unset or empty. Set it and try again."
fi
-
+
# Ensure that fastlane exit codes are handled when output is piped.
set -o pipefail
-
+
# Validate FASTLANE_ISSUER_ID, FASTLANE_KEY_ID, and FASTLANE_KEY
FASTLANE_KEY_ID_PATTERN='^[A-Z0-9]+$'
FASTLANE_ISSUER_ID_PATTERN='^\{?[A-F0-9a-f]{8}-[A-F0-9a-f]{4}-[A-F0-9a-f]{4}-[A-F0-9a-f]{4}-[A-F0-9a-f]{12}\}?$'
-
+
if [ -z "$FASTLANE_ISSUER_ID" ] || [ -z "$FASTLANE_KEY_ID" ] || [ -z "$FASTLANE_KEY" ]; then
failed=true
[ -z "$FASTLANE_ISSUER_ID" ] && echo "::error::The FASTLANE_ISSUER_ID secret is unset or empty. Set it and try again."
@@ -168,13 +168,13 @@ jobs:
[ -z "$FASTLANE_KEY" ] && echo "::error::The FASTLANE_KEY secret is unset or empty. Set it and try again."
elif [ ${#FASTLANE_KEY_ID} -ne 10 ]; then
failed=true
- echo "::error::The FASTLANE_KEY_ID secret is set but has wrong length. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/api and try again."
+ echo "::error::The FASTLANE_KEY_ID secret is set but has wrong length. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/integrations/api and try again."
elif ! [[ $FASTLANE_KEY_ID =~ $FASTLANE_KEY_ID_PATTERN ]]; then
failed=true
- echo "::error::The FASTLANE_KEY_ID secret is set but invalid. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/api and try again."
+ echo "::error::The FASTLANE_KEY_ID secret is set but invalid. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/integrations/api and try again."
elif ! [[ $FASTLANE_ISSUER_ID =~ $FASTLANE_ISSUER_ID_PATTERN ]]; then
failed=true
- echo "::error::The FASTLANE_ISSUER_ID secret is set but invalid. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/api and try again."
+ echo "::error::The FASTLANE_ISSUER_ID secret is set but invalid. Verify that you copied it correctly from the 'Keys' tab at https://appstoreconnect.apple.com/access/integrations/api and try again."
elif ! echo "$FASTLANE_KEY" | openssl pkcs8 -nocrypt >/dev/null; then
failed=true
echo "::error::The FASTLANE_KEY secret is set but invalid. Verify that you copied it correctly from the API Key file (*.p8) you downloaded and try again."
@@ -190,7 +190,7 @@ jobs:
echo "::error::Unable to create a valid authorization token for the App Store Connect API. Verify that the FASTLANE_ISSUER_ID, FASTLANE_KEY_ID, and FASTLANE_KEY secrets are set correctly and try again."
fi
fi
-
+
# Exit unsuccessfully if secret validation failed.
if [ $failed ]; then
exit 2
diff --git a/AmplitudeService b/AmplitudeService
index 98f9759b1..a8b67c879 160000
--- a/AmplitudeService
+++ b/AmplitudeService
@@ -1 +1 @@
-Subproject commit 98f9759b17e8716c65257c24a652564ead3c5183
+Subproject commit a8b67c8797d8249051b88023dd7a7040a5e93aab
diff --git a/CGMBLEKit b/CGMBLEKit
index 4adef2662..5f1991f26 160000
--- a/CGMBLEKit
+++ b/CGMBLEKit
@@ -1 +1 @@
-Subproject commit 4adef2662060f7d11d1abd8d099c3e022bf00cef
+Subproject commit 5f1991f260808e87dd180d0af38f67c54a0d1dfc
diff --git a/G7SensorKit b/G7SensorKit
index 2be3eb29b..8458d602d 160000
--- a/G7SensorKit
+++ b/G7SensorKit
@@ -1 +1 @@
-Subproject commit 2be3eb29b0a18aa89f8b60281341e46e07d024e5
+Subproject commit 8458d602d555c0996d67c440b056573992859ad9
diff --git a/Gemfile.lock b/Gemfile.lock
index 1ff12d548..8caeede21 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -10,20 +10,20 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.949.0)
- aws-sdk-core (3.200.0)
+ aws-partitions (1.981.0)
+ aws-sdk-core (3.209.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
- aws-sigv4 (~> 1.8)
+ aws-sigv4 (~> 1.9)
jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.87.0)
- aws-sdk-core (~> 3, >= 3.199.0)
- aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.155.0)
- aws-sdk-core (~> 3, >= 3.199.0)
+ aws-sdk-kms (1.94.0)
+ aws-sdk-core (~> 3, >= 3.207.0)
+ aws-sigv4 (~> 1.5)
+ aws-sdk-s3 (1.166.0)
+ aws-sdk-core (~> 3, >= 3.207.0)
aws-sdk-kms (~> 1)
- aws-sigv4 (~> 1.8)
- aws-sigv4 (1.8.0)
+ aws-sigv4 (~> 1.5)
+ aws-sigv4 (1.10.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
@@ -40,7 +40,7 @@ GEM
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.109.0)
- faraday (1.10.3)
+ faraday (1.10.4)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
@@ -61,15 +61,15 @@ GEM
faraday-httpclient (1.0.1)
faraday-multipart (1.0.4)
multipart-post (~> 2)
- faraday-net_http (1.0.1)
+ faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
- faraday_middleware (1.2.0)
+ faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.3.1)
- fastlane (2.221.1)
+ fastlane (2.223.1)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -148,14 +148,14 @@ GEM
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
- http-cookie (1.0.6)
+ http-cookie (1.0.7)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.2)
json (2.7.2)
- jwt (2.8.2)
+ jwt (2.9.1)
base64
- mini_magick (4.13.1)
+ mini_magick (4.13.2)
mini_mime (1.1.5)
multi_json (1.15.0)
multipart-post (2.4.1)
@@ -172,8 +172,7 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
- rexml (3.2.9)
- strscan
+ rexml (3.3.7)
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
@@ -186,7 +185,6 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
- strscan (3.1.0)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -196,18 +194,16 @@ GEM
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
- unf (0.1.4)
- unf_ext
- unf_ext (0.0.9.1)
- unicode-display_width (2.5.0)
+ unf (0.2.0)
+ unicode-display_width (2.6.0)
word_wrap (1.0.0)
- xcodeproj (1.24.0)
+ xcodeproj (1.25.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.3.0)
- rexml (~> 3.2.4)
+ rexml (>= 3.3.2, < 4.0)
xcpretty (0.3.0)
rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.1)
@@ -218,6 +214,7 @@ PLATFORMS
arm64-darwin-22
arm64-darwin-23
x86_64-darwin-19
+ x86_64-darwin-24
x86_64-linux
DEPENDENCIES
diff --git a/LibreTransmitter b/LibreTransmitter
index c01eba63e..e14a1b18c 160000
--- a/LibreTransmitter
+++ b/LibreTransmitter
@@ -1 +1 @@
-Subproject commit c01eba63e94e9f6f2841a8835680c4e39c61b18d
+Subproject commit e14a1b18c3b73df934208b8d554586e690fcdeda
diff --git a/LogglyService b/LogglyService
index 1bb822374..a655c1cdf 160000
--- a/LogglyService
+++ b/LogglyService
@@ -1 +1 @@
-Subproject commit 1bb8223748003e51770875200489cce83f74c570
+Subproject commit a655c1cdfc747097b9b1106f1f83d25cc65a9e77
diff --git a/Loop b/Loop
index 1aaee2db4..438096a81 160000
--- a/Loop
+++ b/Loop
@@ -1 +1 @@
-Subproject commit 1aaee2db4953dbcdbe71a15cad967dbb190dc238
+Subproject commit 438096a8184fd26fd11c60c96e15aeb8ad6c25d3
diff --git a/LoopKit b/LoopKit
index 3ce43ded2..5af8e7e5b 160000
--- a/LoopKit
+++ b/LoopKit
@@ -1 +1 @@
-Subproject commit 3ce43ded238a776f7c8a8a9bea339db47adc0c20
+Subproject commit 5af8e7e5b939ef739ea9018cd74bd8754b9f3578
diff --git a/LoopOnboarding b/LoopOnboarding
index 4c5c19279..6abfc4c7c 160000
--- a/LoopOnboarding
+++ b/LoopOnboarding
@@ -1 +1 @@
-Subproject commit 4c5c1927999ae5dd3861e67ca9f10c14a59d1cc6
+Subproject commit 6abfc4c7c911d2575aaf74bc3c2ec4394b5e1d06
diff --git a/LoopSupport b/LoopSupport
index 4728c6783..7bfdeda78 160000
--- a/LoopSupport
+++ b/LoopSupport
@@ -1 +1 @@
-Subproject commit 4728c67836e6a60118fcf6cc262010e9b3d14e68
+Subproject commit 7bfdeda786adc5c985dbc3ae061ebd8b245916be
diff --git a/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 20f167d45..08c84be7c 100644
--- a/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -1,5 +1,5 @@
{
- "originHash" : "f8d1e9c237647ab612da7f2bd3ae26946f39410508314c00cf54509a673f147e",
+ "originHash" : "fd72e13865455a2feb38fe4cd881140a6934ac07e655a5d873c322bc9fac19f7",
"pins" : [
{
"identity" : "amplitude-ios",
@@ -37,6 +37,15 @@
"version" : "1.7.1"
}
},
+ {
+ "identity" : "loopalgorithm",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/LoopKit/LoopAlgorithm",
+ "state" : {
+ "branch" : "main",
+ "revision" : "9d2405464d16a3bd2953e114f046b20bf2cabb48"
+ }
+ },
{
"identity" : "mixpanel-swift",
"kind" : "remoteSourceControl",
@@ -96,7 +105,7 @@
"location" : "https://github.com/tidepool-org/TidepoolKit",
"state" : {
"branch" : "dev",
- "revision" : "54045c2e7d720dcd8a0909037772dcd6f54f0158"
+ "revision" : "b21a7906a202525c4e303dbee9b92182927ef0b5"
}
},
{
@@ -104,7 +113,6 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/LoopKit/ZIPFoundation.git",
"state" : {
- "branch" : "stream-entry",
"revision" : "c67b7509ec82ee2b4b0ab3f97742b94ed9692494"
}
}
diff --git a/MinimedKit b/MinimedKit
index a079b5311..1c0b30187 160000
--- a/MinimedKit
+++ b/MinimedKit
@@ -1 +1 @@
-Subproject commit a079b53119594b37436043859f0fe0a0754724e2
+Subproject commit 1c0b30187a067b2c53629084ec8d5215d802570b
diff --git a/MixpanelService b/MixpanelService
index b33debdac..23cae11cc 160000
--- a/MixpanelService
+++ b/MixpanelService
@@ -1 +1 @@
-Subproject commit b33debdac37d6ef3be955eebb0c42495a1f19232
+Subproject commit 23cae11cc542625148abda93c6e37d250fe7191e
diff --git a/NightscoutRemoteCGM b/NightscoutRemoteCGM
index 3b220185d..6e014e173 160000
--- a/NightscoutRemoteCGM
+++ b/NightscoutRemoteCGM
@@ -1 +1 @@
-Subproject commit 3b220185d0bea9f5f49c2d8d99db95cfe4c636c0
+Subproject commit 6e014e1737ba6ff48d468d9a07f33526a91b3399
diff --git a/NightscoutService b/NightscoutService
index d839b6605..4ec123b86 160000
--- a/NightscoutService
+++ b/NightscoutService
@@ -1 +1 @@
-Subproject commit d839b66054623c213ba79c57540f00e08fad81c3
+Subproject commit 4ec123b865ac785b8bc451631fc52728b57f699c
diff --git a/OmniBLE b/OmniBLE
index b82d2e1ff..56808fb0d 160000
--- a/OmniBLE
+++ b/OmniBLE
@@ -1 +1 @@
-Subproject commit b82d2e1fff5f0fccc42145fcbbe4731b80898fff
+Subproject commit 56808fb0dafffe6838c349f7d6277ac00da9a574
diff --git a/OmniKit b/OmniKit
index 3a75484ba..403bce381 160000
--- a/OmniKit
+++ b/OmniKit
@@ -1 +1 @@
-Subproject commit 3a75484ba062f647e9c5ff0291948859c77ba9b2
+Subproject commit 403bce381943eb64bbbc632ee076356d97812dc6
diff --git a/RileyLinkKit b/RileyLinkKit
index a0e419da3..9dbf381ac 160000
--- a/RileyLinkKit
+++ b/RileyLinkKit
@@ -1 +1 @@
-Subproject commit a0e419da314d0ad42b41ccb04af73cd1fbf41257
+Subproject commit 9dbf381ace7d563daf93a6f378151ce350d4f031
diff --git a/Scripts/sync.swift b/Scripts/sync.swift
index 2553551e0..f71ca4504 100755
--- a/Scripts/sync.swift
+++ b/Scripts/sync.swift
@@ -112,6 +112,7 @@ for project in projects {
try await repository.checkout(revspec: syncBranch)
// Merge changes from tidepool to diy
+ print("Starting merge for \(project.project)")
try await repository.merge(revisionSpecification: "\(incomingRemote)/\(project.branch)", signature: signature)
let originTree = try repository.lookupTree(for: "origin/\(project.branch)")
diff --git a/TidepoolService b/TidepoolService
index 6e007cbde..2cd32ca19 160000
--- a/TidepoolService
+++ b/TidepoolService
@@ -1 +1 @@
-Subproject commit 6e007cbde9920a9d8f25ae855deb36f989a2ce0f
+Subproject commit 2cd32ca193eedd4fb4ed769679f36f1a01126669
diff --git a/dexcom-share-client-swift b/dexcom-share-client-swift
index 21d8657d7..e012b3403 160000
--- a/dexcom-share-client-swift
+++ b/dexcom-share-client-swift
@@ -1 +1 @@
-Subproject commit 21d8657d727f26df76342188e580022bf4884714
+Subproject commit e012b3403cfd8a8f8b7bbb2ff063e9f870c9c8bc