When the PR already has MAX_REVIEWERS or more reviewers the old
fallback set was list(all_maintainers.keys()) — the union of all area
maintainers across every file touched by the PR. For a broad PR that
touches many areas this set can be large and unfiltered, so:
1. The fallback could push the reviewer count far above the 15-user
limit that GitHub enforces per review request.
2. The PR author, users already on the review list, users who
previously self-removed, and non-collaborators were never skipped
in the overflow path, even though the normal path skips all of
them.
Fix both problems:
* Use only the maintainers of the primary (highest-weight) area as
overflow candidates. The primary area's maintainers represent the
most relevant reviewers for a PR; pulling in maintainers from all
areas makes the signal weaker, not stronger.
* Apply the same four filters (author, existing reviewer, self-
removed, collaborator status) to the overflow candidates.
Update the module docstring 'Reviewer selection' section accordingly.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
The previous implementation called pr.add_to_labels(label) once per
label in a loop. Each call is a separate GitHub API request and
creates a separate timeline event on the PR, adding noise for reviewers
who watch the label history.
Replace the loop with a single pr.add_to_labels(*new_labels) call.
Also filter out labels already present on the PR so re-runs do not
create redundant timeline events or waste API quota.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
By default the script only manages the 'size: XS' label. Add an
opt-in --size-labels flag that activates the complete size label suite:
size: XS -- 1 commit, <=1 line changed, no manifest file touched
size: S -- <=9 lines changed
size: M -- <=49 lines changed
size: L -- <=499 lines changed
size: XL -- >499 lines changed
The new update_size_labels() function computes the correct bucket,
removes any stale size label already on the PR, and queues the correct
label for application. The XS bucket reuses the existing stricter
rules (single commit, manifest-file exclusion) from
update_size_xs_label().
When --size-labels is not given, behaviour is identical to before.
New module-level constants:
_SIZE_LABELS -- frozenset of all label names this script manages
_SIZE_THRESHOLDS -- (max_lines, label) table for S/M/L buckets
Update the module docstring 'Labeling strategy' section to document
the full suite and the --size-labels flag.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Between the GitHub search query in main() and the individual process_pr
call, a PR can be closed or merged (e.g. by a concurrent merge or a
maintainer closing it during the batch run). Without a state check,
the script would add labels and review requests to an already-closed
PR, creating spurious timeline events.
Add an early return when pr.state is not 'open'.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
When -P/--pull_request is used to target a single PR, the draft state
was never checked. The batch search in main() already excludes drafts
via -is:draft, but process_pr itself could still be called on a draft
when invoked directly.
Draft PRs are work-in-progress; assigning reviewers and labels before
the author marks them ready creates noise and may trigger notifications
on incomplete work.
Add an early return at the top of process_pr when pr.draft is True.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Expand the module docstring with a thorough description of how the
script decides what to do for each PR and issue:
- Labeling strategy: area label union, MAX_LABELS cap, size: XS rules.
- Area weighting: CMakeLists.txt and meta-area scoring exceptions,
Platform (is_instance) double-count prevention.
- Reviewer selection: candidate ordering, filtering rules (author,
existing reviewers, non-collaborators, self-removed users), the
MAX_REVIEWERS fallback strategy, and the vacancy cap.
- Assignee selection: meta-only shortcut, weight-0/no-maintainer skip,
author exclusion, non-platform vs. platform priority, last-resort
highest-file-count fallback.
- Manifest / MAINTAINERS.yml change handling for west.yml,
submanifests/optional.yaml, and MAINTAINERS.yml diffs.
- Issue assignment label-matching logic.
- Module PR assignment across active west projects.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Add scripts/tests/ci/test_set_assignees.py with 50 tests covering the
pure-logic and lightly-stateful helpers in set_assignees.py.
Heavy third-party dependencies (PyGithub, west, get_maintainer) are
stubbed out in sys.modules before the SUT is imported so the suite
runs without a GitHub token or a full Zephyr build environment.
Coverage:
load_areas - includes/excludes areas based on
files/files-regex keys
set_or_empty - missing key, None value, empty list
_diff_area_entry - maintainer/collaborator/label/files/status changes
compare_areas - added, removed, changed, unchanged areas
update_size_xs_label
- XS qualification criteria (commits, additions,
deletions, manifest files)
- stale label removal with and without dry-run
_pick_assignees - non-platform priority, platform fallback, author
exclusion, meta-only area, zero-count skip,
empty-maintainer skip, all-maintainers fallback,
zero num_files divide-by-zero guard
setup_logging - verbose=0/1/2/3 log level mapping
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Move the 'size: XS' label add/remove logic out of process_pr() and
into a dedicated update_size_xs_label() function. The set of manifest
files that disqualify a PR from the label is promoted to a module-level
constant (_MANIFEST_FILES) so it is defined in one place.
No behavioural change.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Replace ad-hoc log()/print() mix with Python's logging module.
Verbosity levels are now -v (INFO) and -vv (DEBUG).
Fix a bug in reviewer enumeration: get_review_requests() returns a
(users, teams) tuple; the old enumerate() loop was treating the
list index as a page number and querying teams instead of users,
causing existing reviewers to be missed and potentially re-added.
Fix silent error swallowing in _assign_maintainers: the original
try/except wrapped the entire loop, aborting all remaining assignees
on the first unknown-user exception. Each user lookup is now
handled independently.
Fix labels.add('size: XS') replacing the already-collected label
set with a one-element set literal.
Remove an O(n^2) get_collaborators_for_path() inner loop that ran
once per (file x area) pair; moved outside both loops.
Remove dead repo_fullname and token parameters from compare_areas().
Remove redundant if len(area.maintainers) > 0 guard that was
unreachable due to the continue statement directly above it.
Extract _pick_assignees(), _add_reviewers(), _assign_maintainers()
and _diff_area_entry() helpers to break up the 200-line process_pr().
Replace multi-pass filter(lambda ...) chains in process_manifest()
with readable set comprehensions.
Add module docstring so argparse --help displays a description.
Replace all inline magic numbers with named module-level constants:
MAX_FILES, MAX_REVIEWERS, MAX_LABELS, API_SLEEP_SECONDS, META_AREAS.
Fix misleading log message in MAINTAINERS.yml processing branch that
said "skipping" immediately before processing the changes.
Fix typo "adding reviewrs".
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Pass board targets and snippet names to _describe through local arrays.
This avoids treating the first completion candidate as an array name.
Assisted-by: Codex:GPT-5
Signed-off-by: Shan Pen <bricle031@gmail.com>
cbprintf dictionary logging ships read-only string arguments to the host
as bare pointers (resolved by address) and deep-copies the rest,
choosing via linker_is_in_rodata() -- which only checks the default
__rodata_region. Strings in libraries moved by
zephyr_code_relocate(... CCM_RODATA/SMEM_RODATA) land in
.ccm_rodata_reloc / .smem_rodata_reloc, outside that range, so they are
misclassified as transient and the dictionary backend cannot
reconstruct them: string columns render blank/garbled.
Both halves are required -- a firmware-only fix ships pointers the host
cannot resolve, and a database-only fix still ships them as transient:
- linker/utils.h: linker_is_in_rodata() also accepts the relocated
spans __ccm_rodata_reloc_* / __smem_rodata_reloc_*. These are declared
as weak symbols and NULL-guarded so builds that do not relocate rodata
are unaffected.
- database_gen.py: include relocated rodata sections in the dictionary
string extraction so the host can resolve those pointers.
Signed-off-by: Sreekanth Boga <sreekanth@meta.com>
Never hide OpenOCD errors, always log them out to stderr, except when
the user specifies --log-file. Useful for when GDB or other tool uses
a TUI which makes the output garbled from mixing OpenOCD output with GDB.
Signed-off-by: Josuah Demangeon <me@josuah.net>
Since 8bcc333e65 ("llext: custom sections for
heap"), heaps used by LLEXT are placed in dedicated sections that are not
named with a ".noinit." prefix. This causes the gen_relocate_app.py script
to fail to recognize these as usable for relocation, so the CMake function
zephyr_code_relocate() cannot be used on those.
This change adds the LLEXT heap sections to the list of sections that are
categorized as NOINIT, ensuring they are available for the relocation
process.
Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
Removes the truncation of thread ID, as it prevents other scripts/apps
from e.g. matching thread ID and thread name.
Signed-off-by: Eryk Szpotanski <eszpotanski@antmicro.com>
Fix a crash in device dependency generation when CONFIG_DEVICE_DEPS is
enabled and the ELF contains helper objects whose names start with
__device__ prefix but are not actual struct device instances.
Filter __device__ symbols by address range: real struct devices are
allocated consecutively inside the device section [_device_list_start,
_device_list_end].
Signed-off-by: Daniele Cloralio <d.cloralio@arduino.cc>
Previously --shuffle-tests required --subset to be set, which
limited shuffling to subset-based runs. Remove that restriction
so test execution order can be randomized in any run.
When shuffling with a random seed across multiple subsets, not
all tests are guaranteed to be covered. Add a warning suggesting
a fixed seed via --shuffle-tests-seed in that case.
Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
When a ZTEST_P test is dispatched with multiple parameter values the
console output previously repeated the same test name for every
invocation, making it impossible to tell which parameter value caused
a failure at a glance.
Format a unique display name for each parameterized invocation using
the same bracket convention as Google Test:
test_name[instance_name/N]
where N is the 0-based index, or a custom label returned by the
optional name_cb callback:
test_name[instance_name/custom_label]
The display name is stored in a 128-byte buffer inside the existing
z_ztest_param_ctx struct and is used only by TC_START() and
Z_TC_END_RESULT() inside run_test(); the base test->name is unchanged
everywhere else (stats, verbose summary).
Non-parameterized tests are not affected: the display_name buffer is
cleared before each plain run_test() call.
The Twister Test harness test_case_start_pattern is relaxed from the
character-class [a-zA-Z0-9_-]+ to \S+ so it can parse the new
[instance/N] suffix; the end-of-test pattern already used \S* and
requires no change.
Before:
START - test_param_index
PASS - test_param_index in 0.000 seconds
START - test_param_index
PASS - test_param_index in 0.000 seconds
After:
START - test_param_index[idx_check/0]
PASS - test_param_index[idx_check/0] in 0.000 seconds
START - test_param_index[idx_check/1]
PASS - test_param_index[idx_check/1] in 0.000 seconds
Assisted-by: GitHub Copilot:claude-sonnet-4-5
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Extract XUnitXMLReport and JsonReport classes from the monolithic
Reporting class so that each class has a single, well-defined
responsibility. Move build error parsing methods
(_parse_cmake_build_failure, _parse_build_failure, get_detailed_reason)
to a dedicated class.
Rename xunit_report() to XUnitXMLReport.create() and
xunit_report_suites() to XUnitXMLReport.create_with_all_testsuites()
to better reflect their purpose. Add type annotations to new class
constructors and key methods.
Update Reporting.reports() to instantiate and delegate to the new
classes instead of calling methods on self directly.
Signed-off-by: Lukasz Fundakowski <lukasz.fundakowski@nordicsemi.no>
`forward_logging_to_west()` just added by commit 5ac32bd7dd ("scripts:
west_commands: bridge module loggers to WestCommand output") was
silently doing nothing whenever the loggers already had one handler or
more. This was inherited from the earlier code (which had a much
narrower scope) to minimize changes in a big refactoring and migration
but I can't find a rationale. The design of
https://docs.python.org/3/howto/logging.html is very clearly meant to
support multiple handlers per logger and there is no reason to restrict
that. Considering this new `forward_logging_to_west()` approach is
likely to be used as a template for a more generic, non-Zephyr specific
implementation/recommendation in
https://github.com/zephyrproject-rtos/west/issues/952, we don't want it
to set the wrong example. So, remove that single-handler restriction and
also add some... debug logs (!) inside forward_logging_to_west().
Print an error and return when trying to add the _same_ handler
instance.
Signed-off-by: Marc Herbert <marc.herbert@gmail.com>
No need to configure logging once per domain, that never made sense.
In 2019, commit ddce583ca2 ("scripts: west_commands: decouple runners
pkg from west") adds the `logging.getLogger('runners').addHandler(...)`
configuration code for the first time. No --sysbuild at the time.
In 2020, big refactoring commit eb95bed552 ("scripts: west_commands:
fix argument handling with runners.yaml") shuffles things around but the
`do_run_common()` function and the
`getLogger('runners').addHandler(...)`` setup call now inside it are
still called only once.
In 2022, commit 8408af6d7c ("scripts: west commands to support
--domain") starts running `do_run_common()` in loop (once for each
#domain). Instead of moving the logging configuration outside of the for
loop, it adds a check to configure only on the first domain iteration. I
can't see any rationale for not moving that logging setup out of the
domain `for` loop. Pull request #40555 was a massive new feature with 9
commits and a lot of lines changed, so I bet @tejlmand did this only
because it was quick and because he had a lot of other, bigger fish to
try.
In may 2026, commit 5ac32bd7dd ("scripts: west_commands: bridge module
loggers to WestCommand output") generalizes the forwarding approach and
includes its "only" the first time logic. In
https://github.com/zephyrproject-rtos/zephyr/pull/109165/changes#r3294817222
I wondered about this logic and I asked some vague, low priority
questions that were left unanswered. As part of this refactoring, the
connection with --sysbuild got lost.
In https://github.com/zephyrproject-rtos/zephyr/pull/110671 where I
naively tried to "promote" this to an ERROR, @sylvioalves immediately
spotted the issue and reconnected with --sysbuild, sharing how to
reproduce a spurious ERROR.
In this commit, I'm finally moving the logging setup out of the domain
`for` loop!
Phew.
Signed-off-by: Marc Herbert <marc.herbert@gmail.com>
OpenOCD cannot handle Windows-style backslash paths, so switch
to POSIX-style paths for log file handling.
Signed-off-by: Tahsin Mutlugun <Tahsin.Mutlugun@analog.com>
Add scripts/ci/sarif_summary.py and a new 'Summarize SARIF results'
workflow step that runs after the scan and artifact upload.
The script reads results.sarif and:
- Writes a Markdown table to $GITHUB_STEP_SUMMARY, which surfaces on
the GitHub Actions job summary page. Rules are sorted by
classification (mandatory first, then required, then advisory) and
by descending violation count within each group. The header shows
the total violation count and the number of distinct rules triggered.
- Emits one ::notice:: workflow annotation per triggered rule so each
rule ID, classification, description, and count appears in the
Actions log viewer.
Both outputs are derived from the SARIF tool.driver.rules metadata
(fullDescription.text and properties.tags) and the per-result ruleId
counts. The script handles multi-run SARIF files and falls back to
stdout when $GITHUB_STEP_SUMMARY is not set, making it usable locally
for inspection.
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
lld requires ALIGN() arguments to be powers of 2. GNU ld accepts
arbitrary values as an extension, so this worked with GCC toolchains
but broke builds using ZEPHYR_TOOLCHAIN_VARIANT=zephyr/llvm:
ld.lld: error: isr_tables_swi.ld:35: alignment must be power of 2
The shared ISR table entry size on 32-bit ARM is 20 bytes
(2 x sizeof(_isr_table_entry) + sizeof(size_t)), which is not a
power of 2. The generator was emitting ALIGN(20) to advance the
location counter to the next entry boundary.
Since each entry section fills exactly sizeof(entry) bytes, ALIGN is
always a no-op when the sections are placed correctly. The only
semantically meaningful value is the struct's natural C alignment,
which equals the largest power-of-2 divisor of sizeof(entry):
_linker_align(n) = n & -n
For entry size 20 this gives 4; for 8 it gives 8. Using this value
produces a linker script accepted by both GNU ld and lld.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
git diff on a binary file (image, compiled object, archive)
produces only a "Binary files ... differ" header line with no
+/- content lines. _all_changes_boilerplate() found nothing to
reject in that output and returned True, causing binary files
to be consumed as boilerplate and silently dropped from the
pipeline instead of reaching IgnoreStrategy or other handlers.
Fix _is_boilerplate_only() to check for the "Binary files"
marker in the diff output immediately after the first git diff
call. When found, return False so the file is not treated as
boilerplate and passes through to downstream strategies for
proper handling.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
For each changed west project, look up the corresponding
"West project: <name>" area in MAINTAINERS.yml and emit an
additional TwisterCall using --test-pattern arguments built
from the area's tests: list.
This complements the existing --tag <name> --integration call
with explicitly catalogued tests that may not carry a tags:
field matching the project name (e.g. mbedtls crypto suites,
mcuboot bootloader tests, lvgl GUI samples).
The maintainers_file parameter is now threaded through
build_strategies() into ManifestStrategy.__init__() so that
the MAINTAINERS.yml path is available at analysis time.
When no maintainers_file is configured the new helper returns
an empty dict and behaviour is unchanged.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Ignore webp files as well when processing testplan for twister and more
image extensions to the ignore list.
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Add a generic resolve_port_by_chip() helper to the base runner so
flash backends can pick a serial port by matching the connected
chip against the build target. It probes attached devices through
a caller-supplied detect callback and prefers a given set of USB
VIDs to avoid resetting unrelated adapters.
The esp32 runner uses it when no port is given: it probes with
esptool and flashes the first device whose chip matches CONFIG_SOC.
Identification connects to each candidate, so other attached boards
may be reset during the scan; pass --esp-device to skip probing and
target a fixed port.
Signed-off-by: Sylvio Alves <sylvio.alves@espressif.com>
Replace – with -.
The character U+2013 "–" could be confused with the ASCII character
U+002d "-", which is more common in source code.
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Add a new BoilerplateFilter consuming strategy that runs after the
existing IgnoreStrategy. The filter inspects the actual diff of each
changed file and silently consumes those whose entire change set is
non-substantive, i.e. made up exclusively of:
- Whitespace adjustments and blank-line additions/removals
(detected via 'git diff -w --ignore-blank-lines').
- SPDX-License-Identifier and SPDX-FileCopyrightText header lines.
- Copyright notice lines.
- Lines consisting solely of comment delimiter characters
(/* */ // # *).
A file is only consumed when every added/removed line in its diff falls
into one of those categories. A single substantive line (changed
statement, macro, declaration) causes the file to pass through to
downstream strategies unchanged so normal test selection proceeds.
The filter is a no-op when no git commit range is available (e.g. when
--modified-files is used without --commits), because the diff cannot be
computed in that case.
Also add 14 unit tests in scripts/tests/ci/test_test_plan_v2.py covering
the helper methods and the analyze() interface, and update the developer
documentation in doc/develop/test/ci_test_plan.rst with a new
'Boilerplate filter' section and a table row for the strategy.
Assisted-by: GitHub Copilot:claude-opus-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Add scripts/ci/test_plan_v2.py, a modular CI test-selection
tool that analyses the files changed in a Pull Request and emits a
targeted twister test plan, avoiding tests unrelated to the change
while maximising coverage of what was touched.
Architecture
============
A pipeline of independent strategies each receives the full (or
remaining) list of changed files and returns a list of TwisterCall
descriptors. An Orchestrator executes the calls, merges results,
removes duplicates and writes testplan.json. A shared PipelineContext
carries cross-strategy state (complexity score, per-file metrics).
Strategies (execution order)
=============================
0. ComplexityStrategy – analyses patchset complexity with pydriller
(commit-level churn, changed-method CCN, DMM unit-complexity) and
lizard (avg CCN delta between old and new file versions). Emits a
composite score into PipelineContext; no twister calls generated.
1. IgnoreStrategy – reads scripts/ci/twister_ignore.txt and silently
consumes files matching any glob pattern (docs, tooling, workflows).
2. DirectTestStrategy – for files under tests/ or samples/, walks up
to the nearest testcase.yaml/sample.yaml root and runs that exact
suite with --integration.
3. SnippetStrategy – for files under snippets/, reads the snippet name
from snippet.yml, finds tests that declare it as required_snippets
and runs those test roots.
4. BoardStrategy – for files under boards/, enumerates all board
variants via list_boards.py (including twister.yaml consolidated
boards) and runs tests/integration/kernel on each variant.
5. SoCStrategy – for files under soc/, resolves SoC names from
soc.yml, finds boards referencing those SoCs and runs
tests/integration/kernel on them.
6. ManifestStrategy – for changed west.yml / submanifests files, diffs
old vs new revision via git show, identifies added/removed/updated
projects and runs --tag <module> --integration.
7. DriverCompatStrategy – for driver source files, extracts
DT_DRV_COMPAT, finds test overlays that instantiate the compatible
and adds those test directories as -T roots.
8. DtsBindingStrategy – for changed dts/bindings YAML files, reads the
compatible: field and feeds it through the same compat-resolution
chain as DriverCompatStrategy.
9. KconfigImpactStrategy – for changed Kconfig files and defconfigs,
extracts symbol names and greps tests for .conf/.yaml files that
enable those symbols.
10. HeaderImpactStrategy – for changed public headers, greps for
#include users and maps them back to MAINTAINERS areas with tests.
11. MaintainerAreaStrategy – catch-all: matches remaining files against
MAINTAINERS.yml areas and uses their tests: list.
RiskClassifierStrategy is implemented but disabled pending further
tuning of its classification rules. When enabled it reads the
complexity score from PipelineContext to escalate NORMAL-risk files to
WIDE coverage when the score exceeds the threshold.
Output
======
* testplan.json – loaded by twister via --load-tests
* .testplan – env-var file (TWISTER_TESTS, TWISTER_NODES,
TWISTER_FULL) consumed by CI orchestration
Assisted-by: GitHub Copilot:claude-opus-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Extend the DTS catalog schema produced by scripts/ci/gen_catalogs.py
with the additional fields required to eliminate duplicated logic in the
doc build:
- Each dts_sources entry now carries an "okay" boolean so consumers
can distinguish enabled from disabled nodes without re-processing EDT
objects.
- Each compatible entry now carries "binding_path" (workspace-relative)
and "custom_binding" (bool) so consumers do not need access to the
raw binding files at catalog-consumption time.
- Each board entry now carries a "runners" dict (runners list plus
flash_runner / debug_runner) populated by the new
gather_board_runners() helper.
build_catalog() gains an optional board_runners argument; main() now
calls gather_board_runners() and passes the result when building the
DTS catalog.
doc/_scripts/gen_boards_catalog.py is updated to import gen_catalogs
and delegate the twister/EDT gathering to it rather than duplicating
the implementation. The public API (get_catalog, gather_board_build_info,
run_twister_cmake_only) and all surrounding logic are unchanged.
Assisted-by: GitHub Copilot:claude-sonnet-4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Create a DTS catalog that can be used for documentation, tesplan
generation and other tooling.
This is mostly based on what already being used when building
documentation and the board catalog in the docs.
Assisted-by: GitHub Copilot:Claude Sonnet 4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Make the documentation guidelines and board template prescriptive about
board photos: they must be WebP, capped at 600 px on their largest
dimension, and preferably use a transparent background. Add conversion
tips using cwebp and ImageMagick.
Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Add a --check flag intended for use in the GitHub Actions workflow.
When --check is passed with a single -p PR number, the script verifies
that the PR body contains a 'Fixes #N' (or equivalent URL) reference.
If no issue is found, a comment is posted on the PR asking the
contributor to add one, and the script exits with a non-zero status,
failing the CI check.
Assisted-by: GitHub Copilot:Claude Sonnet 4.6
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Allow running the test suite locally without creating a west workspace
first. Without the monkeypatch a WestNotFound exception would be raised.
Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
Prevent reuse to trip on "... SPDX-License-Identifier: tag." and
complain about "License may not be allowed:License file for 'tag.'"
Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Do not have different sorting based on mode, always sort the same and
run all tests in the same subsets or runnings. A test failing on
multiple platforms should not cause majority of runners to fail.
Also adapt related tests.
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Add explicit RTS/CTS flow-control options to the Wi-Fi Enterprise
certificate installer.
This makes the script usable with boards and serial adapters that do not
support or expect hardware flow control.
Signed-off-by: Siddhant Modi <siddhant.modi@gmail.com>
Two sources of over-counting caused (hidden) to go negative,
breaking the dashboard sunburst chart:
1. Symbols with SHN_ABS/SHN_UNDEF/SHN_COMMON section indices have
a non-zero st_size but occupy no actual ROM/RAM bytes. Skip them
in get_symbols() before address-range classification.
2. Address aliases were not removed from symbol_dict after
mark_address_aliases() identified them, so generate_any_tree()
counted their size a second time. Remove them from symbol_dict
to match the documented intent of the function.
Fixes#110380
Signed-off-by: Yves Wang <zhengjia.wang@nxp.com>
The ``WestAppNoRun`` subclass only existed to populate the deprecated
``west.configuration.config`` global so the previous ``get_build_dir()``
could read it. We can now pass a newly constructed configuration as an
optional argument.
Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
The `LicenseAndCopyrightCheck` test was reporting warnings for some image
files while ignoring others. This was caused by modifying the
changed_files list during iteration, leading to inconsistent filtering
of files.
This aligns the implementation with the intended behavior and avoids
spurious warnings on binary files.
Signed-off-by: Elie Carrot <elie.carrot@smile.fr>
This workflow has been running for a while capturing bug state, however,
it is not being used anywhere and right now it is not generating any
useful data given that we changed how we use Github issues for tracking
bugs.
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Fixes checkpatch not warning when a blank line between a declaration
and a statement is removed by a patch. The check only fired on added
('+') lines, missing violations left as context lines.
Track removed blank lines via a flag and extend the check to also
fire when a blank was deleted immediately before a context line.
Fixes: #98976
Signed-off-by: Vignesh Pandian <vignesh@aerlync.com>
default_allow_list_file is not set in the case KCONFIG_ALLOWLIST is set.
In the case of failure, this causes the failure msg itself to throw error.
Signed-off-by: James Growden <jgrowden@tenstorrent.com>
Keep zephyr/edt.pickle when cleaning artifacts for test-only
packages.
Add edt.pickle to the single-domain and multi-domain allow-lists
used by cleanup_device_testing_artifacts(). Update the related
Twister unit tests to match the new retained artifact lists.
Some runners need edt.pickle at flash time to resolve the code
partition from the EDT, so removing it breaks flashing from
packaged device-testing artifacts.
Signed-off-by: Hake Huang <hake.huang@nxp.com>
Drop the deprecated ``from west.configuration import config`` import
from ``build.py`` along with the ``config_get`` / ``config_getboolean``
module-level wrappers. Inline the seven call sites with
``self.config.get('build.<key>', default=...)`` /
``self.config.getboolean('build.<key>', default=...)``, which uses the
dotted-key API exposed by ``west.configuration.Configuration``.
Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
Assisted-by: Claude:claude-opus-4.7