Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions .github/workflows/assigner-workflow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Pull Request Assigner Completion Workflow

# read-write repo token
# access to secrets
on:
workflow_run:
workflows: ["Pull Request Assigner"]
types:
- completed

permissions:
contents: read

jobs:
assignment:
name: Pull Request Assignment
runs-on: ubuntu-24.04
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'

steps:
- name: Check out source code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
fetch-depth: 0
persist-credentials: false
- name: Download artifacts
id: download-artifacts
uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11
with:
workflow: assigner.yml
run_id: ${{ github.event.workflow_run.id }}
if_no_artifact_found: ignore

- name: Load PR number
if: steps.download-artifacts.outputs.found_artifact == 'true'
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
script: |
let fs = require("fs");
let pr_number = Number(fs.readFileSync("./pr/NR"));
core.exportVariable("PR_NUM", pr_number);

- name: Check PR number
if: steps.download-artifacts.outputs.found_artifact == 'true'
id: check-pr
uses: carpentries/actions/check-valid-pr@2e20fd5ee53b691e27455ce7ca3b16ea885140e8 # v0.15.0
with:
pr: ${{ env.PR_NUM }}
sha: ${{ github.event.workflow_run.head_sha }}

- name: Validate PR number
if: |
steps.download-artifacts.outputs.found_artifact == 'true' &&
steps.check-pr.outputs.VALID != 'true'
run: |
echo "ABORT: PR number validation failed!"
exit 1

- name: Set up Python
uses: zephyrproject-rtos/action-python-env@main
with:
python-version: 3.12

- name: Run assignment script
env:
GITHUB_TOKEN: ${{ secrets.ZB_PR_ASSIGNER_GITHUB_TOKEN }}
run: |
if [ -f "./pr/manifest_areas.json" ]; then
ARGS="--areas ./pr/manifest_areas.json"
else
ARGS=""
fi
python3 scripts/set_assignees.py -P ${{ env.PR_NUM }} -M MAINTAINERS.yml -v \
--repo ${{ github.event.repository.name }} ${ARGS}
81 changes: 51 additions & 30 deletions .github/workflows/assigner.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Pull Request Assigner

on:
pull_request_target:
pull_request:
types:
- opened
- synchronize
Expand All @@ -24,41 +24,62 @@ jobs:
if: github.event.pull_request.draft == false
runs-on: ubuntu-24.04
permissions:
pull-requests: write # to add assignees to pull requests
issues: write # to add assignees to issues

steps:
- name: Check out source code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Check out source code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
fetch-depth: 0
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: 3.12
cache: pip
cache-dependency-path: scripts/requirements-actions.txt
- name: Set up Python
uses: zephyrproject-rtos/action-python-env@main
with:
python-version: 3.12

- name: Install Python packages
run: |
pip install -r scripts/requirements-actions.txt --require-hashes
- name: west setup
if: >
github.event_name == 'pull_request'
run: |
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
west init -l . || true
mkdir -p ./pr

- name: Run assignment script
env:
GITHUB_TOKEN: ${{ secrets.ZB_PR_ASSIGNER_GITHUB_TOKEN }}
run: |
FLAGS="-v"
FLAGS+=" -o ${{ github.event.repository.owner.login }}"
FLAGS+=" -r ${{ github.event.repository.name }}"
FLAGS+=" -M MAINTAINERS.yml"
if [ "${{ github.event_name }}" = "pull_request_target" ]; then
FLAGS+=" -P ${{ github.event.pull_request.number }}"
elif [ "${{ github.event_name }}" = "issues" ]; then
- name: Run assignment script
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
FLAGS="-v"
FLAGS+=" -o ${{ github.event.repository.owner.login }}"
FLAGS+=" -r ${{ github.event.repository.name }}"
FLAGS+=" -M MAINTAINERS.yml"
if [ "${{ github.event_name }}" = "pull_request" ]; then
FLAGS+=" -P ${{ github.event.pull_request.number }} --manifest -c origin/${{ github.base_ref }}.."
python3 scripts/set_assignees.py $FLAGS
cp -f manifest_areas.json ./pr/
elif [ "${{ github.event_name }}" = "issues" ]; then
FLAGS+=" -I ${{ github.event.issue.number }}"
elif [ "${{ github.event_name }}" = "schedule" ]; then
python3 scripts/set_assignees.py $FLAGS
elif [ "${{ github.event_name }}" = "schedule" ]; then
FLAGS+=" --modules"
else
echo "Unknown event: ${{ github.event_name }}"
exit 1
fi
python3 scripts/set_assignees.py $FLAGS
else
echo "Unknown event: ${{ github.event_name }}"
exit 1
fi


- name: Save PR number
if: >
github.event_name == 'pull_request'
run: |
echo ${{ github.event.number }} > ./pr/NR
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: >
github.event_name == 'pull_request'
with:
name: pr
path: pr/

python3 scripts/set_assignees.py $FLAGS
56 changes: 46 additions & 10 deletions doc/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --universal --python-version 3.10 --generate-hashes requirements.in --output-file requirements.txt
alabaster==1.0.0 \
alabaster==0.7.16 ; python_full_version < '3.10' \
--hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \
--hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92
# via sphinx
alabaster==1.0.0 ; python_full_version >= '3.10' \
--hash=sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e \
--hash=sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b
# via sphinx
Expand All @@ -10,7 +14,11 @@ anyio==4.9.0 \
# via
# starlette
# watchfiles
anytree==2.13.0 \
anytree==2.12.1 ; python_full_version < '3.9.2' \
--hash=sha256:244def434ccf31b668ed282954e5d315b4e066c4940b94aff4a7962d85947830 \
--hash=sha256:5ea9e61caf96db1e5b3d0a914378d2cd83c269dfce1fb8242ce96589fa3382f0
# via -r requirements.in
anytree==2.13.0 ; python_full_version >= '3.9.2' \
--hash=sha256:4cbcf10df36b1f1cba131b7e487ff3edafc9d6e932a3c70071b5b768bab901ff \
--hash=sha256:c9d3aa6825fdd06af7ebb05b4ef291d2db63e62bb1f9b7d9b71354be9d362714
# via -r requirements.in
Expand Down Expand Up @@ -116,7 +124,11 @@ charset-normalizer==3.4.2 \
--hash=sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a \
--hash=sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f
# via requests
click==8.2.1 \
click==8.1.8 ; python_full_version < '3.10' \
--hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 \
--hash=sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a
# via uvicorn
click==8.2.1 ; python_full_version >= '3.10' \
--hash=sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202 \
--hash=sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b
# via uvicorn
Expand Down Expand Up @@ -165,6 +177,10 @@ imagesize==1.4.1 \
--hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \
--hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a
# via sphinx
importlib-metadata==8.7.0 ; python_full_version < '3.10' \
--hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \
--hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd
# via sphinx
iniconfig==2.1.0 \
--hash=sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7 \
--hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760
Expand Down Expand Up @@ -354,9 +370,9 @@ pyserial==3.5 \
--hash=sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb \
--hash=sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0
# via -r requirements.in
pytest==8.4.1 \
--hash=sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7 \
--hash=sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c
pytest==8.4.2 \
--hash=sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01 \
--hash=sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79
# via -r requirements.in
python-dateutil==2.9.0.post0 \
--hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \
Expand Down Expand Up @@ -485,6 +501,7 @@ six==1.17.0 \
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
# via
# anytree
# doxmlparser
# python-dateutil
sniffio==1.3.1 \
Expand All @@ -495,7 +512,22 @@ snowballstemmer==3.0.1 \
--hash=sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 \
--hash=sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895
# via sphinx
sphinx==8.1.3 ; python_full_version < '3.11' \
sphinx==7.4.7 ; python_full_version < '3.10' \
--hash=sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe \
--hash=sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239
# via
# -r requirements.in
# sphinx-autobuild
# sphinx-copybutton
# sphinx-last-updated-by-git
# sphinx-notfound-page
# sphinx-rtd-theme
# sphinx-tabs
# sphinx-togglebutton
# sphinxcontrib-jquery
# sphinxcontrib-programoutput
# sphinxcontrib-svg2pdfconverter
sphinx==8.1.3 ; python_full_version == '3.10.*' \
--hash=sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2 \
--hash=sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927
# via
Expand Down Expand Up @@ -545,9 +577,9 @@ sphinx-rtd-theme==3.0.2 \
--hash=sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13 \
--hash=sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85
# via -r requirements.in
sphinx-sitemap==2.7.2 \
--hash=sha256:1a6a8dcecb0ffb85fd37678f785cfcc40adfe3eebafb05e678971e5260b117e4 \
--hash=sha256:819e028e27579b47efa0e2f863b87136b711c45f13e84730610e80316f6883da
sphinx-sitemap==2.8.0 \
--hash=sha256:332042cd5b9385f61ec2861dfd550d9bccbdfcff86f6b68c7072cf40c9f16363 \
--hash=sha256:749d7184a0c7b73d486a232b54b5c1b38a0e2d6f18cf19fb1b033b8162b44a82
# via -r requirements.in
sphinx-tabs==3.4.7 \
--hash=sha256:991ad4a424ff54119799ba1491701aa8130dd43509474aef45a81c42d889784d \
Expand Down Expand Up @@ -832,3 +864,7 @@ wheel==0.45.1 \
--hash=sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729 \
--hash=sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248
# via sphinx-togglebutton
zipp==3.23.0 ; python_full_version < '3.10' \
--hash=sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e \
--hash=sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166
# via importlib-metadata
26 changes: 26 additions & 0 deletions scripts/get_maintainer.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,18 @@ def _parse_args():
nargs="?",
help="List all areas maintained by maintainer.")


area_parser = subparsers.add_parser(
"area",
help="List area(s) by name")
area_parser.add_argument(
"name",
metavar="AREA",
nargs="?",
help="List all areas with the given name.")

area_parser.set_defaults(cmd_fn=Maintainers._area_cmd)

# New arguments for filtering
areas_parser.add_argument(
"--without-maintainers",
Expand Down Expand Up @@ -220,6 +232,12 @@ def __init__(self, filename=None):

self.areas[area_name] = area

def name2areas(self, name):
"""
Returns a list of Area instances for the areas that match 'name'.
"""
return [area for area in self.areas.values() if area.name == name]

def path2areas(self, path):
"""
Returns a list of Area instances for the areas that contain 'path',
Expand Down Expand Up @@ -262,6 +280,14 @@ def __repr__(self):
# Command-line subcommands
#

def _area_cmd(self, args):
# 'area' subcommand implementation

res = set()
areas = self.name2areas(args.name)
res.update(areas)
_print_areas(res)

def _path_cmd(self, args):
# 'path' subcommand implementation

Expand Down
Loading