diff --git a/.clusterfuzzlite/build.sh b/.clusterfuzzlite/build.sh
index 10a2db0bd..86ab775f9 100644
--- a/.clusterfuzzlite/build.sh
+++ b/.clusterfuzzlite/build.sh
@@ -51,7 +51,7 @@ for f in .clusterfuzzlite/*_fuzzer.cpp; do
fuzzer=$(basename "$f" .cpp)
cp -f "$f" src/fuzzer.cpp
pio run -vvv --environment "$PIO_ENV"
- program="$PLATFORMIO_WORKSPACE_DIR/build/$PIO_ENV/program"
+ program="$PLATFORMIO_WORKSPACE_DIR/build/$PIO_ENV/meshtasticd"
cp "$program" "$OUT/$fuzzer"
# Copy shared libraries used by the fuzzer.
diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml
index f7bf95f83..f79e4fdb5 100644
--- a/.github/actionlint.yaml
+++ b/.github/actionlint.yaml
@@ -2,4 +2,5 @@
self-hosted-runner:
# Labels of self-hosted runner in array of strings.
labels:
+ - arctastic
- test-runner
diff --git a/.github/actions/build-variant/action.yml b/.github/actions/build-variant/action.yml
index a71ddfc4d..c048b7ac2 100644
--- a/.github/actions/build-variant/action.yml
+++ b/.github/actions/build-variant/action.yml
@@ -76,7 +76,7 @@ runs:
done
- name: PlatformIO ${{ inputs.arch }} download cache
- uses: actions/cache@v4
+ uses: actions/cache@v5
with:
path: ~/.platformio/.cache
key: pio-cache-${{ inputs.arch }}-${{ hashFiles('.github/actions/**', '**.ini') }}
@@ -100,9 +100,9 @@ runs:
id: version
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
- name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }}
overwrite: true
path: |
${{ inputs.artifact-paths }}
diff --git a/.github/workflows/build_debian_src.yml b/.github/workflows/build_debian_src.yml
index d7d26f0e8..de114be1c 100644
--- a/.github/workflows/build_debian_src.yml
+++ b/.github/workflows/build_debian_src.yml
@@ -64,7 +64,7 @@ jobs:
PKG_VERSION: ${{ steps.version.outputs.deb }}
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
overwrite: true
diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml
index 9ac84c23e..19381e211 100644
--- a/.github/workflows/build_firmware.yml
+++ b/.github/workflows/build_firmware.yml
@@ -18,9 +18,10 @@ permissions: read-all
jobs:
pio-build:
name: build-${{ inputs.platform }}
- runs-on: ubuntu-24.04
+ # Use 'arctastic' self-hosted runner pool when building in the main repo
+ runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }}
outputs:
- artifact-id: ${{ steps.upload.outputs.artifact-id }}
+ artifact-id: ${{ steps.upload-firmware.outputs.artifact-id }}
steps:
- uses: actions/checkout@v6
with:
@@ -55,15 +56,40 @@ jobs:
ota_firmware_source: ${{ steps.ota_dir.outputs.src || '' }}
ota_firmware_target: ${{ steps.ota_dir.outputs.tgt || '' }}
+ - name: Job summary
+ env:
+ PIO_ENV: ${{ inputs.pio_env }}
+ run: |
+ echo "## $PIO_ENV" >> $GITHUB_STEP_SUMMARY
+ echo "Manifest
" >> $GITHUB_STEP_SUMMARY
+ echo '' >> $GITHUB_STEP_SUMMARY
+ echo '```json' >> $GITHUB_STEP_SUMMARY
+ cat release/firmware-*.mt.json >> $GITHUB_STEP_SUMMARY
+ echo '' >> $GITHUB_STEP_SUMMARY
+ echo '```' >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v5
- id: upload
+ uses: actions/upload-artifact@v6
+ id: upload-firmware
with:
- name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}.zip
+ name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}
overwrite: true
path: |
+ release/*.mt.json
release/*.bin
release/*.elf
release/*.uf2
release/*.hex
- release/*-ota.zip
+ release/*.zip
+ release/device-*.sh
+ release/device-*.bat
+
+ - name: Store manifests as an artifact
+ uses: actions/upload-artifact@v6
+ id: upload-manifest
+ with:
+ name: manifest-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}
+ overwrite: true
+ path: |
+ release/*.mt.json
diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml
index e4b332a06..9cc0bac78 100644
--- a/.github/workflows/build_one_target.yml
+++ b/.github/workflows/build_one_target.yml
@@ -98,7 +98,7 @@ jobs:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
path: ./
pattern: firmware-*-*
@@ -111,7 +111,7 @@ jobs:
run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
- name: Repackage in single firmware zip
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
name: firmware-${{inputs.target}}-${{ needs.version.outputs.long }}
overwrite: true
@@ -119,7 +119,7 @@ jobs:
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
- ./firmware-*-ota.zip
+ ./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
@@ -127,7 +127,7 @@ jobs:
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-*-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -139,14 +139,14 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{inputs.target}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
name: debug-elfs-${{inputs.target}}-${{ needs.version.outputs.long }}.zip
overwrite: true
diff --git a/.github/workflows/first_time_contributor.yml b/.github/workflows/first_time_contributor.yml
new file mode 100644
index 000000000..1ebc9a602
--- /dev/null
+++ b/.github/workflows/first_time_contributor.yml
@@ -0,0 +1,47 @@
+name: Welcome First-Time Contributor
+
+on:
+ issues:
+ types: opened
+ pull_request_target:
+ types: opened
+
+permissions: {}
+
+jobs:
+ welcome:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write # Required to post comments and labels on issues
+ pull-requests: write # Required to post comments and labels on PRs
+ steps:
+ - uses: plbstl/first-contribution@v4
+ with:
+ labels: first-contribution
+ issue-opened-msg: |
+ ### @{fc-author}, Welcome to Meshtastic! :wave:
+
+ Thanks for opening your first issue. If it's helpful, an easy way
+ to get logs is the "Open Serial Monitor" button on the [Web Flasher](https://flasher.meshtastic.org).
+
+ If you have ideas for features, note that we often debate big ideas
+ in the [discussions tab](https://github.com/meshtastic/firmware/discussions/categories/ideas)
+ first. This tracker tends to be for ideas that have community
+ consensus and a clear implementation.
+
+ We're very active [on discord](https://discord.com/invite/meshtastic),
+ especially the \#firmware and \#alphanauts-testing channels. If you'll
+ be around for a while, we'd love to see you there!
+
+ Welcome to the community! :heart:
+
+ pr-opened-msg: |
+ ### @{fc-author}, Welcome to Meshtastic!
+
+ Thanks for opening your first pull request. We really appreciate it.
+
+ We discuss work as a team in discord, please join us in the [#firmware channel](https://discord.com/invite/meshtastic).
+ There's a big backlog of patches at the moment. If you have time,
+ please help us with some code review and testing of [other PRs](https://github.com/meshtastic/firmware/pulls)!
+
+ Welcome to the team :smile:
diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml
index 38373a2fc..4f7cbf194 100644
--- a/.github/workflows/main_matrix.yml
+++ b/.github/workflows/main_matrix.yml
@@ -8,7 +8,9 @@ on:
branches:
- master
- develop
+ - pioarduino # Remove when merged // use `feature/` in the future.
- event/*
+ - feature/*
paths-ignore:
- "**.md"
- version.properties
@@ -18,7 +20,9 @@ on:
branches:
- master
- develop
+ - pioarduino # Remove when merged // use `feature/` in the future.
- event/*
+ - feature/*
paths-ignore:
- "**.md"
#- "**.yml"
@@ -77,16 +81,21 @@ jobs:
fail-fast: false
matrix:
check: ${{ fromJson(needs.setup.outputs.check) }}
-
- runs-on: ubuntu-latest
+ # Use 'arctastic' self-hosted runner pool when checking in the main repo
+ runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }}
if: ${{ github.event_name != 'workflow_dispatch' && github.repository == 'meshtastic/firmware' }}
steps:
- uses: actions/checkout@v6
- - name: Build base
- id: base
- uses: ./.github/actions/setup-base
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Check ${{ matrix.check.board }}
- run: bin/check-all.sh ${{ matrix.check.board }}
+ uses: meshtastic/gh-action-firmware@main
+ with:
+ pio_platform: ${{ matrix.check.platform }}
+ pio_env: ${{ matrix.check.board }}
+ pio_target: check
build:
needs: [setup, version]
@@ -168,7 +177,7 @@ jobs:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
path: ./
pattern: firmware-${{matrix.arch}}-*
@@ -177,19 +186,17 @@ jobs:
- name: Display structure of downloaded files
run: ls -R
- - name: Move files up
- run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
-
- name: Repackage in single firmware zip
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: |
+ ./firmware-*.mt.json
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
- ./firmware-*-ota.zip
+ ./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
@@ -197,7 +204,7 @@ jobs:
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -209,16 +216,16 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: ./*.elf
retention-days: 30
@@ -230,12 +237,55 @@ jobs:
description: "Download firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip. This artifact will be available for 90 days from creation"
github-token: ${{ secrets.GITHUB_TOKEN }}
+ shame:
+ if: github.repository == 'meshtastic/firmware'
+ continue-on-error: true
+ runs-on: ubuntu-latest
+ needs: [build]
+ steps:
+ - uses: actions/checkout@v6
+ if: github.event_name == 'pull_request_target'
+ with:
+ filter: blob:none # means we download all the git history but none of the commit (except ones with checkout like the head)
+ fetch-depth: 0
+ - name: Download the current manifests
+ uses: actions/download-artifact@v7
+ with:
+ path: ./manifests-new/
+ pattern: manifest-*
+ merge-multiple: true
+ - name: Upload combined manifests for later commit and global stats crunching.
+ uses: actions/upload-artifact@v6
+ id: upload-manifest
+ with:
+ name: manifests-${{ github.sha }}
+ overwrite: true
+ path: manifests-new/*.mt.json
+ - name: Find the merge base
+ if: github.event_name == 'pull_request_target'
+ run: echo "MERGE_BASE=$(git merge-base "origin/$base" "$head")" >> $GITHUB_ENV
+ env:
+ base: ${{ github.base_ref }}
+ head: ${{ github.sha }}
+ # Currently broken (for-loop through EVERY artifact -- rate limiting)
+ # - name: Download the old manifests
+ # if: github.event_name == 'pull_request_target'
+ # run: gh run download -R "$repo" --name "manifests-$merge_base" --dir manifest-old/
+ # env:
+ # GH_TOKEN: ${{ github.token }}
+ # merge_base: ${{ env.MERGE_BASE }}
+ # repo: ${{ github.repository }}
+ # - name: Do scan and post comment
+ # if: github.event_name == 'pull_request_target'
+ # run: python3 bin/shame.py ${{ github.event.pull_request.number }} manifests-old/ manifests-new/
+
release-artifacts:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' && github.repository == 'meshtastic/firmware' }}
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
needs:
+ - setup
- version
- gather-artifacts
- build-debian-src
@@ -244,11 +294,6 @@ jobs:
- name: Checkout
uses: actions/checkout@v6
- - name: Setup Python
- uses: actions/setup-python@v6
- with:
- python-version: 3.x
-
- name: Create release
uses: softprops/action-gh-release@v2
id: create_release
@@ -261,14 +306,14 @@ jobs:
Autogenerated by github action, developer should edit as required before publishing...
- name: Download source deb
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src
merge-multiple: true
path: ./output/debian-src
- name: Download `native-tft` pio deps
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -284,10 +329,25 @@ jobs:
- name: Display structure of downloaded files
run: ls -lR
- - name: Add Linux sources to GtiHub Release
+ - name: Generate Release manifest
+ run: |
+ jq -n --arg ver "${{ needs.version.outputs.long }}" --argjson targets ${{ toJson(needs.setup.outputs.all) }} '{
+ "version": $ver,
+ "targets": $targets
+ }' > firmware-${{ needs.version.outputs.long }}.json
+
+ - name: Save Release manifest artifact
+ uses: actions/upload-artifact@v6
+ with:
+ name: manifest-${{ needs.version.outputs.long }}
+ overwrite: true
+ path: firmware-${{ needs.version.outputs.long }}.json
+
+ - name: Add sources to GitHub Release
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
+ gh release upload v${{ needs.version.outputs.long }} ./firmware-${{ needs.version.outputs.long }}.json
gh release upload v${{ needs.version.outputs.long }} ./output/meshtasticd-${{ needs.version.outputs.deb }}-src.zip
gh release upload v${{ needs.version.outputs.long }} ./output/platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip
env:
@@ -318,7 +378,7 @@ jobs:
with:
python-version: 3.x
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -329,15 +389,15 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./elfs
@@ -373,12 +433,19 @@ jobs:
with:
python-version: 3.x
- - uses: actions/download-artifact@v6
+ - name: Get firmware artifacts
+ uses: actions/download-artifact@v7
with:
pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./publish
+ - name: Get manifest artifact
+ uses: actions/download-artifact@v7
+ with:
+ pattern: manifest-${{ needs.version.outputs.long }}
+ path: ./publish
+
- name: Publish firmware to meshtastic.github.io
uses: peaceiris/actions-gh-pages@v4
env:
diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml
index 154b230c7..bd3f6d4eb 100644
--- a/.github/workflows/merge_queue.yml
+++ b/.github/workflows/merge_queue.yml
@@ -147,7 +147,7 @@ jobs:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
path: ./
pattern: firmware-${{matrix.arch}}-*
@@ -160,7 +160,7 @@ jobs:
run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
- name: Repackage in single firmware zip
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
@@ -168,7 +168,7 @@ jobs:
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
- ./firmware-*-ota.zip
+ ./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
@@ -176,7 +176,7 @@ jobs:
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -188,16 +188,16 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: ./*.elf
retention-days: 30
@@ -223,11 +223,6 @@ jobs:
- name: Checkout
uses: actions/checkout@v6
- - name: Setup Python
- uses: actions/setup-python@v6
- with:
- python-version: 3.x
-
- name: Create release
uses: softprops/action-gh-release@v2
id: create_release
@@ -240,14 +235,14 @@ jobs:
Autogenerated by github action, developer should edit as required before publishing...
- name: Download source deb
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src
merge-multiple: true
path: ./output/debian-src
- name: Download `native-tft` pio deps
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -297,7 +292,7 @@ jobs:
with:
python-version: 3.x
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -308,15 +303,15 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./elfs
@@ -352,7 +347,7 @@ jobs:
with:
python-version: 3.x
- - uses: actions/download-artifact@v6
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }}
merge-multiple: true
diff --git a/.github/workflows/package_obs.yml b/.github/workflows/package_obs.yml
index 2b202ed95..63f1fe8a0 100644
--- a/.github/workflows/package_obs.yml
+++ b/.github/workflows/package_obs.yml
@@ -58,7 +58,7 @@ jobs:
id: version
- name: Download artifacts
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
merge-multiple: true
diff --git a/.github/workflows/package_pio_deps.yml b/.github/workflows/package_pio_deps.yml
index cb10a79f3..82ffe66e9 100644
--- a/.github/workflows/package_pio_deps.yml
+++ b/.github/workflows/package_pio_deps.yml
@@ -56,7 +56,7 @@ jobs:
PLATFORMIO_CORE_DIR: pio/core
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
name: platformio-deps-${{ inputs.pio_env }}-${{ steps.version.outputs.long }}
overwrite: true
diff --git a/.github/workflows/package_ppa.yml b/.github/workflows/package_ppa.yml
index 2e3278041..9a463dbea 100644
--- a/.github/workflows/package_ppa.yml
+++ b/.github/workflows/package_ppa.yml
@@ -60,7 +60,7 @@ jobs:
id: version
- name: Download artifacts
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
merge-multiple: true
diff --git a/.github/workflows/pr_enforce_labels.yml b/.github/workflows/pr_enforce_labels.yml
index 543e23558..d60c9c8ca 100644
--- a/.github/workflows/pr_enforce_labels.yml
+++ b/.github/workflows/pr_enforce_labels.yml
@@ -17,7 +17,7 @@ jobs:
with:
script: |
const labels = context.payload.pull_request.labels.map(label => label.name);
- const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk'];
+ const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk', 'cleanup'];
const hasRequiredLabel = labels.some(label => requiredLabels.includes(label));
if (!hasRequiredLabel) {
core.setFailed(`PR must have at least one of the following labels before it can be merged: ${requiredLabels.join(', ')}.`);
diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml
index 048186538..6306d777f 100644
--- a/.github/workflows/pr_tests.yml
+++ b/.github/workflows/pr_tests.yml
@@ -50,9 +50,9 @@ jobs:
- name: Download test artifacts
if: needs.native-tests.result != 'skipped'
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
- name: platformio-test-report-${{ steps.version.outputs.long }}.zip
+ name: platformio-test-report-${{ steps.version.outputs.long }}
merge-multiple: true
- name: Parse test results and create detailed summary
diff --git a/.github/workflows/release_channels.yml b/.github/workflows/release_channels.yml
index f21b13ee1..badbb31d4 100644
--- a/.github/workflows/release_channels.yml
+++ b/.github/workflows/release_channels.yml
@@ -102,7 +102,7 @@ jobs:
PIP_DISABLE_PIP_VERSION_CHECK: 1
- name: Create Bumps pull request
- uses: peter-evans/create-pull-request@v7
+ uses: peter-evans/create-pull-request@v8
with:
base: ${{ github.event.repository.default_branch }}
branch: create-pull-request/bump-version
diff --git a/.github/workflows/sec_sast_semgrep_cron.yml b/.github/workflows/sec_sast_semgrep_cron.yml
index d044f9038..d93449d6d 100644
--- a/.github/workflows/sec_sast_semgrep_cron.yml
+++ b/.github/workflows/sec_sast_semgrep_cron.yml
@@ -33,7 +33,7 @@ jobs:
# step 3
- name: save report as pipeline artifact
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
name: report.sarif
overwrite: true
diff --git a/.github/workflows/stale_bot.yml b/.github/workflows/stale_bot.yml
index 11ba59386..fc0702bd8 100644
--- a/.github/workflows/stale_bot.yml
+++ b/.github/workflows/stale_bot.yml
@@ -17,7 +17,7 @@ jobs:
steps:
- name: Stale PR+Issues
- uses: actions/stale@v10.1.0
+ uses: actions/stale@v10.1.1
with:
days-before-stale: 45
stale-issue-message: This issue has not had any comment or update in the last month. If it is still relevant, please post update comments. If no comments are made, this issue will be closed automagically in 7 days.
diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml
index a2328022e..40fcd7109 100644
--- a/.github/workflows/test_native.yml
+++ b/.github/workflows/test_native.yml
@@ -40,7 +40,7 @@ jobs:
- name: Integration test
run: |
- .pio/build/coverage/program -s &
+ .pio/build/coverage/meshtasticd -s &
PID=$!
timeout 20 bash -c "until ls -al /proc/$PID/fd | grep socket; do sleep 1; done"
echo "Simulator started, launching python test..."
@@ -59,10 +59,10 @@ jobs:
id: version
- name: Save coverage information
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
if: always() # run this step even if previous step failed
with:
- name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }}.zip
+ name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }}
overwrite: true
path: ./coverage_*.info
@@ -94,9 +94,9 @@ jobs:
- name: Save test results
if: always() # run this step even if previous step failed
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
- name: platformio-test-report-${{ steps.version.outputs.long }}.zip
+ name: platformio-test-report-${{ steps.version.outputs.long }}
overwrite: true
path: ./testreport.xml
@@ -108,10 +108,10 @@ jobs:
sed -i -e "s#${PWD}#.#" coverage_tests.info # Make paths relative.
- name: Save coverage information
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
if: always() # run this step even if previous step failed
with:
- name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }}.zip
+ name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }}
overwrite: true
path: ./coverage_*.info
@@ -137,22 +137,22 @@ jobs:
id: version
- name: Download test artifacts
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
- name: platformio-test-report-${{ steps.version.outputs.long }}.zip
+ name: platformio-test-report-${{ steps.version.outputs.long }}
merge-multiple: true
- name: Test Report
- uses: dorny/test-reporter@v2.2.0
+ uses: dorny/test-reporter@v2.4.0
with:
name: PlatformIO Tests
path: testreport.xml
reporter: java-junit
- name: Download coverage artifacts
- uses: actions/download-artifact@v6
+ uses: actions/download-artifact@v7
with:
- pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }}.zip
+ pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }}
path: code-coverage-report
merge-multiple: true
@@ -163,7 +163,7 @@ jobs:
genhtml --quiet --legend --prefix "${PWD}" code-coverage-report/coverage_src.info --output-directory code-coverage-report
- name: Save Code Coverage Report
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v6
with:
- name: code-coverage-report-${{ steps.version.outputs.long }}.zip
+ name: code-coverage-report-${{ steps.version.outputs.long }}
path: code-coverage-report
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 4a97853e2..241f2cd10 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -22,7 +22,7 @@ jobs:
- name: Checkout code
uses: actions/checkout@v6
- # - uses: actions/setup-python@v5
+ # - uses: actions/setup-python@v6
# with:
# python-version: '3.10'
diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml
index af0557fda..35565d1e4 100644
--- a/.github/workflows/update_protobufs.yml
+++ b/.github/workflows/update_protobufs.yml
@@ -16,7 +16,7 @@ jobs:
submodules: true
- name: Update submodule
- if: ${{ github.ref == 'refs/heads/master' }}
+ if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' }}
run: |
git submodule update --remote protobufs
@@ -31,7 +31,7 @@ jobs:
./bin/regen-protos.sh
- name: Create pull request
- uses: peter-evans/create-pull-request@v7
+ uses: peter-evans/create-pull-request@v8
with:
branch: create-pull-request/update-protobufs
labels: submodules
diff --git a/.gitignore b/.gitignore
index cc742c6c1..06e8c472f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,3 +41,12 @@ src/mesh/raspihttp/private_key.pem
# Ignore logo (set at build time with platformio-custom.py)
data/boot/logo.*
+
+# pioarduino platform
+managed_components/*
+arduino-lib-builder*
+dependencies.lock
+idf_component.yml
+CMakeLists.txt
+sdkconfig.*
+.dummy/*
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index 1fd8790f2..705f0177c 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -4,31 +4,31 @@ cli:
plugins:
sources:
- id: trunk
- ref: v1.7.3
+ ref: v1.7.4
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- - checkov@3.2.492
- - renovate@42.5.4
- - prettier@3.6.2
- - trufflehog@3.90.13
+ - checkov@3.2.496
+ - renovate@42.66.14
+ - prettier@3.7.4
+ - trufflehog@3.92.4
- yamllint@1.37.1
- - bandit@1.8.6
- - trivy@0.67.2
+ - bandit@1.9.2
+ - trivy@0.68.2
- taplo@0.10.0
- - ruff@0.14.4
+ - ruff@0.14.10
- isort@7.0.0
- - markdownlint@0.45.0
- - oxipng@9.1.5
+ - markdownlint@0.47.0
+ - oxipng@10.0.0
- svgo@4.0.0
- - actionlint@1.7.8
+ - actionlint@1.7.9
- flake8@7.3.0
- hadolint@2.14.0
- shfmt@3.6.0
- shellcheck@0.11.0
- - black@25.11.0
+ - black@25.12.0
- git-diff-check
- - gitleaks@8.29.0
+ - gitleaks@8.30.0
- clang-format@16.0.3
ignore:
- linters: [ALL]
diff --git a/SECURITY.md b/SECURITY.md
index 5092595e1..a77a4d028 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -4,8 +4,8 @@
| Firmware Version | Supported |
| ---------------- | ------------------ |
-| 2.6.x | :white_check_mark: |
-| <= 2.5.x | :x: |
+| 2.7.x | :white_check_mark: |
+| <= 2.6.x | :x: |
## Reporting a Vulnerability
diff --git a/alpine.Dockerfile b/alpine.Dockerfile
index bdee57d79..b3b384101 100644
--- a/alpine.Dockerfile
+++ b/alpine.Dockerfile
@@ -28,7 +28,7 @@ RUN bash ./bin/build-native.sh "$PIO_ENV" && \
# ##### PRODUCTION BUILD #############
-FROM alpine:3.22
+FROM alpine:3.23
LABEL org.opencontainers.image.title="Meshtastic" \
org.opencontainers.image.description="Alpine Meshtastic daemon" \
org.opencontainers.image.url="https://meshtastic.org" \
diff --git a/arch/nrf52/nrf52832.ini b/arch/nrf52/nrf52832.ini
deleted file mode 100644
index ce94283b1..000000000
--- a/arch/nrf52/nrf52832.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[nrf52832_base]
-extends = nrf52_base
-
-build_flags = ${nrf52_base.build_flags}
-
-lib_deps =
- ${nrf52_base.lib_deps}
diff --git a/bin/analyze_map.py b/bin/analyze_map.py
new file mode 100644
index 000000000..99997c703
--- /dev/null
+++ b/bin/analyze_map.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python3
+"""Summarise linker map output to highlight heavy object files and libraries.
+
+Usage:
+ python bin/analyze_map.py --map .pio/build/rak4631/output.map --top 20
+
+The script parses GNU ld map files and aggregates section sizes per object file
+and per archive/library, then prints sortable tables that make it easy to spot
+modules worth trimming or hiding behind feature flags.
+"""
+from __future__ import annotations
+
+import argparse
+import collections
+import os
+import re
+import sys
+from typing import DefaultDict, Dict, Tuple
+
+
+SECTION_LINE_RE = re.compile(r"^\s+(?P\S+)\s+0x[0-9A-Fa-f]+\s+0x(?P[0-9A-Fa-f]+)\s+(?P