diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml index 6661ba30c9..3f9e6b7638 100644 --- a/.github/workflows/add_identifiers.yml +++ b/.github/workflows/add_identifiers.yml @@ -12,11 +12,11 @@ jobs: identifiers: name: Add Identifiers needs: validate - runs-on: macos-15 + runs-on: macos-26 steps: # Checks-out the repo - name: Checkout Repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Patch Fastlane Match to not print tables - name: Patch Match Tables diff --git a/.github/workflows/build_loop.yml b/.github/workflows/build_loop.yml index db33b8991b..fab987e7b3 100644 --- a/.github/workflows/build_loop.yml +++ b/.github/workflows/build_loop.yml @@ -90,7 +90,7 @@ jobs: if: | steps.workflow-permission.outputs.has_permission == 'true' && (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false') - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: token: ${{ secrets.GH_PAT }} @@ -100,7 +100,7 @@ jobs: steps.workflow-permission.outputs.has_permission == 'true' && vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'LoopKit' id: sync - uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1 + uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.2 with: target_sync_branch: ${{ env.TARGET_BRANCH }} shallow_since: 6 months ago @@ -165,7 +165,7 @@ jobs: build: name: Build needs: [check_certs, check_status] - runs-on: macos-15 + runs-on: macos-26 permissions: contents: write if: @@ -175,10 +175,10 @@ jobs: (vars.SCHEDULED_SYNC != 'false' && needs.check_status.outputs.NEW_COMMITS == 'true' ) steps: - name: Select Xcode version - run: "sudo xcode-select --switch /Applications/Xcode_16.4.app/Contents/Developer" + run: "sudo xcode-select --switch /Applications/Xcode_26.2.app/Contents/Developer" - name: Checkout Repo for building - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: token: ${{ secrets.GH_PAT }} submodules: recursive @@ -255,7 +255,7 @@ jobs: # Upload Build artifacts - name: Upload build log, IPA and Symbol artifacts if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: build-artifacts path: | diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml index d20001b2ca..a3cc89e077 100644 --- a/.github/workflows/create_certs.yml +++ b/.github/workflows/create_certs.yml @@ -22,14 +22,14 @@ jobs: create_certs: name: Certificates needs: validate - runs-on: macos-15 + runs-on: macos-26 outputs: new_certificate_needed: ${{ steps.set_output.outputs.new_certificate_needed }} steps: # Checks-out the repo - name: Checkout Repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Patch Fastlane Match to not print tables - name: Patch Match Tables @@ -63,7 +63,8 @@ jobs: id: set_output run: | CERT_STATUS_FILE="${{ github.workspace }}/fastlane/new_certificate_needed.txt" - ENABLE_NUKE_CERTS=${{ vars.ENABLE_NUKE_CERTS }} + ENABLE_NUKE_CERTS=$(echo "${{ vars.ENABLE_NUKE_CERTS }}" | tr '[:upper:]' '[:lower:]') + FORCE_NUKE_CERTS=$(echo "${{ vars.FORCE_NUKE_CERTS }}" | tr '[:upper:]' '[:lower:]') if [ -f "$CERT_STATUS_FILE" ]; then CERT_STATUS=$(cat "$CERT_STATUS_FILE" | tr -d '\n' | tr -d '\r') # Read file content and strip newlines @@ -82,22 +83,22 @@ jobs: echo "::error::❌ No valid distribution certificate found. Automated renewal of certificates was skipped because the repository variable ENABLE_NUKE_CERTS is not set to 'true'." exit 1 fi - # Check if vars.FORCE_NUKE_CERTS is not set to true - if [ vars.FORCE_NUKE_CERTS = "true" ]; then + # Check if FORCE_NUKE_CERTS is set to true + if [ "$FORCE_NUKE_CERTS" = "true" ]; then echo "::warning::‼️ Nuking of certificates was forced because the repository variable FORCE_NUKE_CERTS is set to 'true'." fi # Nuke Certs if needed, and if the repository variable ENABLE_NUKE_CERTS is set to 'true', or if FORCE_NUKE_CERTS is set to 'true', which will always force certs to be nuked nuke_certs: name: Nuke certificates needs: [validate, create_certs] - runs-on: macos-15 + runs-on: macos-26 if: ${{ (needs.create_certs.outputs.new_certificate_needed == 'true' && vars.ENABLE_NUKE_CERTS == 'true') || vars.FORCE_NUKE_CERTS == 'true' }} steps: - name: Output from step id 'check_certs' run: echo "new_certificate_needed=${{ needs.create_certs.outputs.new_certificate_needed }}" - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install dependencies run: bundle install diff --git a/.github/workflows/validate_secrets.yml b/.github/workflows/validate_secrets.yml index f8d97c4f48..ea150c0c53 100644 --- a/.github/workflows/validate_secrets.yml +++ b/.github/workflows/validate_secrets.yml @@ -105,7 +105,7 @@ jobs: validate-fastlane-secrets: name: Fastlane needs: [validate-access-token] - runs-on: macos-15 + runs-on: macos-26 env: GH_PAT: ${{ secrets.GH_PAT }} GH_TOKEN: ${{ secrets.GH_PAT }} @@ -116,7 +116,7 @@ jobs: TEAMID: ${{ secrets.TEAMID }} steps: - name: Checkout Repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Project Dependencies run: bundle install diff --git a/.gitmodules b/.gitmodules index 1308e60c03..c1fb407a91 100644 --- a/.gitmodules +++ b/.gitmodules @@ -58,3 +58,12 @@ [submodule "LibreTransmitter"] path = LibreTransmitter url = https://github.com/LoopKit/LibreTransmitter.git +[submodule "EversenseKit"] + path = EversenseKit + url = https://github.com/loopandlearn/EversenseKit +[submodule "MedtrumKit"] + path = MedtrumKit + url = https://github.com/loopandlearn/MedtrumKit.git +[submodule "DanaKit"] + path = DanaKit + url = https://github.com/loopandlearn/DanaKit diff --git a/DanaKit b/DanaKit new file mode 160000 index 0000000000..5c676ada44 --- /dev/null +++ b/DanaKit @@ -0,0 +1 @@ +Subproject commit 5c676ada44a9c7a0bff54706d3242ceaa3986a10 diff --git a/EversenseKit b/EversenseKit new file mode 160000 index 0000000000..cc4cc8f145 --- /dev/null +++ b/EversenseKit @@ -0,0 +1 @@ +Subproject commit cc4cc8f145c98805db797a308a5a39508d095ea0 diff --git a/LoopWorkspace.xcworkspace/contents.xcworkspacedata b/LoopWorkspace.xcworkspace/contents.xcworkspacedata index a870f8b7c9..b042792973 100644 --- a/LoopWorkspace.xcworkspace/contents.xcworkspacedata +++ b/LoopWorkspace.xcworkspace/contents.xcworkspacedata @@ -108,12 +108,18 @@ + + + + @@ -132,4 +138,7 @@ + + diff --git a/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved index 85b387d04a..c9b09d9601 100644 --- a/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "7645108625333b4ec60e0e439db0c0dc8a91ad0942d36797c6b66208a9082ea2", + "originHash" : "23b19e660bb8e19ecae2e1186b6d2d4c2b64d16171c7a1658e596c8af3b90873", "pins" : [ { "identity" : "amplitude-ios", diff --git a/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme b/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme index e09bc55654..eb4fbe86ba 100644 --- a/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme +++ b/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme @@ -146,6 +146,20 @@ ReferencedContainer = "container:MinimedKit/MinimedKit.xcodeproj"> + + + + + + + + + + + + + + + + As of 18 Feb 2026, the translations for these repositories are added to lokalise +> * DanaKit +> * EversenseKit +> * MedtrumKit + +> In order to manage those localization strings, the translation work will be done in the feat/eversense branch, which includes those 3 repositories. + +> The Scripts needed to handle these new repositories are found on in this branch (for now). + Translations for Loop are performed by volunteers at [lokalise](https://app.lokalise.com/projects). Several scripts were added to assist in bringing those translations into the repositories and updating keys when strings are added or modified. diff --git a/Scripts/define_common.sh b/Scripts/define_common.sh index 0c75a998e0..acd5ac9e00 100755 --- a/Scripts/define_common.sh +++ b/Scripts/define_common.sh @@ -61,6 +61,9 @@ LANGUAGES=(en \ ) # define the PROJECTS used by the translation scripts +# Note that although loopandlearn is the address used for .gitmodules for +# DanaKit, EversenseKit, and MedtrumKit, +# the upstream repositories are used here so that the appropriate pr can be generated PROJECTS=( \ LoopKit:AmplitudeService:dev \ LoopKit:CGMBLEKit:dev \ @@ -79,6 +82,9 @@ PROJECTS=( \ LoopKit:OmniKit:main \ LoopKit:RileyLinkKit:dev \ LoopKit:TidepoolService:dev \ + bastiaanv:DanaKit:dev \ + bastiaanv:EversenseKit:dev \ + jbr7rr:MedtrumKit:dev \ ) function section_divider() { diff --git a/Scripts/open_selected_url.sh b/Scripts/open_selected_url.sh new file mode 100755 index 0000000000..7a94c8cccb --- /dev/null +++ b/Scripts/open_selected_url.sh @@ -0,0 +1,46 @@ +#!/bin/zsh + +# The purpose of this script is to open forks on GitHub in browser that require manual evaluation. + +source Scripts/define_common.sh + +section_divider +echo "You are running ${0}" +echo +echo " This automatically opens forks that need to be manually managed in your browser so you" +echo " can handle the process at GitHub." + +# There are repositories that use loopandlearn in .gitmodules but the upstream forks come +# from the original authors. They are handled maually for both Loop and Trio. +# These URL are the same for Loop and Trio. +# At the moment, LoopKit/LoopKit has commits used by Trio that require manual sync +# so it is added to the SPECIAL_PROJECT_FORKS list. (This is here for convenience.) +DOWNSTREAM_GITHUB_NAME="loopandlearn" + +SPECIAL_PROJECT_FORKS=( \ + loopandlearn:LoopKit:dev:trio \ + bastiaanv:DanaKit:dev:dev \ + bastiaanv:EversenseKit:dev:dev \ + jbr7rr:MedtrumKit:dev:dev \ +) + +section_divider +echo " ////////////// Use Browser for next step ////////////" +echo +echo " Manually update these downstream repositories at ${DOWNSTREAM_GITHUB_NAME}" +echo " Each URL will automatically open" +echo +for project in ${SPECIAL_PROJECT_FORKS}; do + IFS=":" read user dir branch downstream_branch <<< "$project" + echo " Manually sync ${DOWNSTREAM_GITHUB_NAME}/$dir:$downstream_branch with $user/$dir:$branch" + open https://github.com/${DOWNSTREAM_GITHUB_NAME}/$dir/tree/$downstream_branch +done + +section_divider +echo " ////////////// WARNING ////////////" +echo +echo " If any updates were made by manual sync at GitHub," +echo " follow up by running:" +echo " ./Scripts/update_submodule_refs.sh" +echo " This ensures the submodules used in your local clone are up to date" +section_divider diff --git a/Scripts/update_loopandlearn_forks.sh b/Scripts/update_loopandlearn_forks.sh new file mode 100755 index 0000000000..627fee076a --- /dev/null +++ b/Scripts/update_loopandlearn_forks.sh @@ -0,0 +1,69 @@ +#!/bin/zsh + +# The purpose of this script is to update the loopandlearn forks to match the upstream repositories +# The script can only be run by someone with push privileges to the loopandlearn forks. + +source Scripts/define_common.sh + +section_divider +echo "You are running ${0}" +echo +echo " This automatically updates the downstream loopandlearn forks at GitHub" +echo " to match their upstream LoopKit counterparts." +echo " Next, the forks that need to be manually managed will be opened so you" +echo " can handle the process at GitHub." +echo +echo " The automated process only works with push privileges to loopandlearn." +echo " Running the script without privileges yields error messages; no harm occurs." + +continue_or_quit ${0} + + +# define the TRIO_PROJECT_FORKS to be updated +# these branches in loopandlearn should match the branches in the upstream repositories + +# note that the OmniBLE pod-keep-alive branch is a temporary addition and must come +# before the nominal OmniBLE dev branch in the list below +TRIO_PROJECT_FORKS=( \ + LoopKit:OmniBLE:pod-keep-alive \ + LoopKit:CGMBLEKit:dev \ + LoopKit:dexcom-share-client-swift:dev \ + LoopKit:G7SensorKit:main \ + LoopKit:LibreTransmitter:main \ + LoopKit:MinimedKit:main \ + LoopKit:OmniBLE:dev \ + LoopKit:OmniKit:main \ + LoopKit:RileyLinkKit:dev \ + LoopKit:TidepoolService:dev \ +) + +# This script uses remotes with the indicated nickname for the downstream repository +# If the proper remotes are not yet configured, they will be added later +DOWNSTREAM_GITHUB_NAME="loopandlearn" +DOWNSTREAM_NICKNAME="lal" + +section_divider +echo " ////////////// Automatically push updates from LoopKit to loopandlearn ////////////" +echo +for project in ${TRIO_PROJECT_FORKS}; do + IFS=":" read user dir branch <<< "$project" + echo " Make sure $branch for $dir is up to date" + cd $dir + git switch $branch + git pull + # Ensure remote is configured + if ! git remote get-url ${DOWNSTREAM_NICKNAME} &>/dev/null; then + echo " Adding remote ${DOWNSTREAM_NICKNAME} for $dir" + git remote add ${DOWNSTREAM_NICKNAME} https://github.com/${DOWNSTREAM_GITHUB_NAME}/$dir + fi + + echo " Push this update downstream to ${DOWNSTREAM_GITHUB_NAME}/$dir:$branch" + git push ${DOWNSTREAM_NICKNAME} $branch + echo "" + cd - +done + +# The next script is called automatically to enable manual evaluation for +# additional pump and cgm manager repositories. + +source Scripts/open_selected_url.sh \ No newline at end of file diff --git a/Scripts/update_submodule_refs.sh b/Scripts/update_submodule_refs.sh index b9edba347a..3fb71658a0 100755 --- a/Scripts/update_submodule_refs.sh +++ b/Scripts/update_submodule_refs.sh @@ -2,13 +2,24 @@ source Scripts/define_common.sh +section_divider +echo "You are running ${0}" +echo +echo " This modifies your local clone, in whatever branch is currently selected," +echo " so that every submodule is at the tip of the appropriate branch." +echo +current_branch=$(git branch --show-current 2>/dev/null) +echo " The current LoopWorkspace branch is $current_branch" + +continue_or_quit ${0} + for project in ${PROJECTS}; do + echo echo "Updating to $project" IFS=":" read user dir branch <<< "$project" echo "Updating to $branch on $user/$project" cd $dir git checkout $branch - #git branch -D tidepool-sync git pull cd - done diff --git a/VersionOverride.xcconfig b/VersionOverride.xcconfig index 6089e279b2..b17045813b 100644 --- a/VersionOverride.xcconfig +++ b/VersionOverride.xcconfig @@ -8,5 +8,5 @@ // Version [for DIY Loop] // configure the version number in LoopWorkspace -LOOP_MARKETING_VERSION = 3.12.0 +LOOP_MARKETING_VERSION = 3.13.1 CURRENT_PROJECT_VERSION = 57