Skip to content

Commit 99f2599

Browse files
committed
Merge tag 'refs/tags/2025.08.1'
# Conflicts: # build.yaml
2 parents b2ebaa1 + 0513ea0 commit 99f2599

File tree

4,102 files changed

+6467
-4687
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

4,102 files changed

+6467
-4687
lines changed

.github/workflows/builder.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ jobs:
106106
107107
- name: Build wheels
108108
if: needs.init.outputs.requirements == 'true'
109-
uses: home-assistant/wheels@2025.03.0
109+
uses: home-assistant/wheels@2025.07.0
110110
with:
111111
abi: cp313
112112
tag: musllinux_1_2
@@ -149,7 +149,7 @@ jobs:
149149
150150
- name: Login to GitHub Container Registry
151151
if: needs.init.outputs.publish == 'true'
152-
uses: docker/login-action@v3.4.0
152+
uses: docker/login-action@v3.5.0
153153
with:
154154
registry: ghcr.io
155155
username: ${{ github.repository_owner }}

.github/workflows/ci.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ jobs:
388388
- name: Upload coverage artifact
389389
uses: actions/[email protected]
390390
with:
391-
name: coverage-${{ matrix.python-version }}
391+
name: coverage
392392
path: .coverage
393393
include-hidden-files: true
394394

@@ -417,7 +417,10 @@ jobs:
417417
echo "Failed to restore Python virtual environment from cache"
418418
exit 1
419419
- name: Download all coverage artifacts
420-
uses: actions/[email protected]
420+
uses: actions/[email protected]
421+
with:
422+
name: coverage
423+
path: coverage/
421424
- name: Combine coverage results
422425
run: |
423426
. venv/bin/activate

.ha-frontend-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20250401.0
1+
20250806.0

build.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
image: ghcr.nju.edu.cn/home-assistant/{arch}-hassio-supervisor
22
build_from:
3-
aarch64: ghcr.nju.edu.cn/home-assistant/aarch64-base-python:3.13-alpine3.21
4-
armhf: ghcr.nju.edu.cn/home-assistant/armhf-base-python:3.13-alpine3.21
5-
armv7: ghcr.nju.edu.cn/home-assistant/armv7-base-python:3.13-alpine3.21
6-
amd64: ghcr.nju.edu.cn/home-assistant/amd64-base-python:3.13-alpine3.21
7-
i386: ghcr.nju.edu.cn/home-assistant/i386-base-python:3.13-alpine3.21
3+
aarch64: ghcr.nju.edu.cn/home-assistant/aarch64-base-python:3.13-alpine3.22
4+
armhf: ghcr.nju.edu.cn/home-assistant/armhf-base-python:3.13-alpine3.22
5+
armv7: ghcr.nju.edu.cn/home-assistant/armv7-base-python:3.13-alpine3.22
6+
amd64: ghcr.nju.edu.cn/home-assistant/amd64-base-python:3.13-alpine3.22
7+
i386: ghcr.nju.edu.cn/home-assistant/i386-base-python:3.13-alpine3.22
88
codenotary:
99
1010
base_image: [email protected]

requirements.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ aiodns==3.5.0
22
aiohttp==3.12.15
33
atomicwrites-homeassistant==1.4.1
44
attrs==25.3.0
5-
awesomeversion==25.5.0
5+
awesomeversion==25.8.0
66
blockbuster==1.5.25
77
brotli==1.1.0
88
ciso8601==2.3.2
99
colorlog==6.9.0
1010
cpe==1.3.1
11-
cryptography==45.0.5
12-
debugpy==1.8.15
11+
cryptography==45.0.6
12+
debugpy==1.8.16
1313
deepmerge==2.0
1414
dirhash==0.5.0
1515
docker==7.1.0
@@ -26,5 +26,5 @@ securetar==2025.2.1
2626
sentry-sdk==2.34.1
2727
setuptools==80.9.0
2828
voluptuous==0.15.2
29-
dbus-fast==2.44.2
29+
dbus-fast==2.44.3
3030
zlib-fast==0.2.1

requirements_tests.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
astroid==3.3.11
2-
coverage==7.10.1
3-
mypy==1.17.0
2+
coverage==7.10.2
3+
mypy==1.17.1
44
pre-commit==4.2.0
55
pylint==3.3.7
66
pytest-aiohttp==1.1.0
@@ -9,7 +9,7 @@ pytest-cov==6.2.1
99
pytest-timeout==2.4.0
1010
pytest==8.4.1
1111
ruff==0.12.7
12-
time-machine==2.16.0
12+
time-machine==2.17.0
1313
types-docker==7.1.0.20250705
1414
types-pyyaml==6.0.12.20250516
1515
types-requests==2.32.4.20250611

supervisor/addons/addon.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
)
7878
from ..hardware.data import Device
7979
from ..homeassistant.const import WSEvent
80-
from ..jobs.const import JobExecutionLimit
80+
from ..jobs.const import JobConcurrency, JobThrottle
8181
from ..jobs.decorator import Job
8282
from ..resolution.const import ContextType, IssueType, UnhealthyReason
8383
from ..resolution.data import Issue
@@ -733,8 +733,8 @@ async def write_options(self) -> None:
733733

734734
@Job(
735735
name="addon_unload",
736-
limit=JobExecutionLimit.GROUP_ONCE,
737736
on_condition=AddonsJobError,
737+
concurrency=JobConcurrency.GROUP_REJECT,
738738
)
739739
async def unload(self) -> None:
740740
"""Unload add-on and remove data."""
@@ -766,8 +766,8 @@ async def _check_ingress_port(self):
766766

767767
@Job(
768768
name="addon_install",
769-
limit=JobExecutionLimit.GROUP_ONCE,
770769
on_condition=AddonsJobError,
770+
concurrency=JobConcurrency.GROUP_REJECT,
771771
)
772772
async def install(self) -> None:
773773
"""Install and setup this addon."""
@@ -807,8 +807,8 @@ def setup_data():
807807

808808
@Job(
809809
name="addon_uninstall",
810-
limit=JobExecutionLimit.GROUP_ONCE,
811810
on_condition=AddonsJobError,
811+
concurrency=JobConcurrency.GROUP_REJECT,
812812
)
813813
async def uninstall(
814814
self, *, remove_config: bool, remove_image: bool = True
@@ -873,8 +873,8 @@ def cleanup_config_and_audio():
873873

874874
@Job(
875875
name="addon_update",
876-
limit=JobExecutionLimit.GROUP_ONCE,
877876
on_condition=AddonsJobError,
877+
concurrency=JobConcurrency.GROUP_REJECT,
878878
)
879879
async def update(self) -> asyncio.Task | None:
880880
"""Update this addon to latest version.
@@ -923,8 +923,8 @@ async def update(self) -> asyncio.Task | None:
923923

924924
@Job(
925925
name="addon_rebuild",
926-
limit=JobExecutionLimit.GROUP_ONCE,
927926
on_condition=AddonsJobError,
927+
concurrency=JobConcurrency.GROUP_REJECT,
928928
)
929929
async def rebuild(self) -> asyncio.Task | None:
930930
"""Rebuild this addons container and image.
@@ -1068,8 +1068,8 @@ async def _wait_for_startup(self) -> None:
10681068

10691069
@Job(
10701070
name="addon_start",
1071-
limit=JobExecutionLimit.GROUP_ONCE,
10721071
on_condition=AddonsJobError,
1072+
concurrency=JobConcurrency.GROUP_REJECT,
10731073
)
10741074
async def start(self) -> asyncio.Task:
10751075
"""Set options and start add-on.
@@ -1117,8 +1117,8 @@ def _check_addon_config_dir():
11171117

11181118
@Job(
11191119
name="addon_stop",
1120-
limit=JobExecutionLimit.GROUP_ONCE,
11211120
on_condition=AddonsJobError,
1121+
concurrency=JobConcurrency.GROUP_REJECT,
11221122
)
11231123
async def stop(self) -> None:
11241124
"""Stop add-on."""
@@ -1131,8 +1131,8 @@ async def stop(self) -> None:
11311131

11321132
@Job(
11331133
name="addon_restart",
1134-
limit=JobExecutionLimit.GROUP_ONCE,
11351134
on_condition=AddonsJobError,
1135+
concurrency=JobConcurrency.GROUP_REJECT,
11361136
)
11371137
async def restart(self) -> asyncio.Task:
11381138
"""Restart add-on.
@@ -1166,8 +1166,8 @@ async def stats(self) -> DockerStats:
11661166

11671167
@Job(
11681168
name="addon_write_stdin",
1169-
limit=JobExecutionLimit.GROUP_ONCE,
11701169
on_condition=AddonsJobError,
1170+
concurrency=JobConcurrency.GROUP_REJECT,
11711171
)
11721172
async def write_stdin(self, data) -> None:
11731173
"""Write data to add-on stdin."""
@@ -1200,8 +1200,8 @@ async def _backup_command(self, command: str) -> None:
12001200

12011201
@Job(
12021202
name="addon_begin_backup",
1203-
limit=JobExecutionLimit.GROUP_ONCE,
12041203
on_condition=AddonsJobError,
1204+
concurrency=JobConcurrency.GROUP_REJECT,
12051205
)
12061206
async def begin_backup(self) -> bool:
12071207
"""Execute pre commands or stop addon if necessary.
@@ -1222,8 +1222,8 @@ async def begin_backup(self) -> bool:
12221222

12231223
@Job(
12241224
name="addon_end_backup",
1225-
limit=JobExecutionLimit.GROUP_ONCE,
12261225
on_condition=AddonsJobError,
1226+
concurrency=JobConcurrency.GROUP_REJECT,
12271227
)
12281228
async def end_backup(self) -> asyncio.Task | None:
12291229
"""Execute post commands or restart addon if necessary.
@@ -1260,8 +1260,8 @@ def _is_excluded_by_filter(
12601260

12611261
@Job(
12621262
name="addon_backup",
1263-
limit=JobExecutionLimit.GROUP_ONCE,
12641263
on_condition=AddonsJobError,
1264+
concurrency=JobConcurrency.GROUP_REJECT,
12651265
)
12661266
async def backup(self, tar_file: tarfile.TarFile) -> asyncio.Task | None:
12671267
"""Backup state of an add-on.
@@ -1368,8 +1368,8 @@ def _addon_backup(
13681368

13691369
@Job(
13701370
name="addon_restore",
1371-
limit=JobExecutionLimit.GROUP_ONCE,
13721371
on_condition=AddonsJobError,
1372+
concurrency=JobConcurrency.GROUP_REJECT,
13731373
)
13741374
async def restore(self, tar_file: tarfile.TarFile) -> asyncio.Task | None:
13751375
"""Restore state of an add-on.
@@ -1521,10 +1521,10 @@ def check_trust(self) -> Awaitable[None]:
15211521

15221522
@Job(
15231523
name="addon_restart_after_problem",
1524-
limit=JobExecutionLimit.GROUP_THROTTLE_RATE_LIMIT,
15251524
throttle_period=WATCHDOG_THROTTLE_PERIOD,
15261525
throttle_max_calls=WATCHDOG_THROTTLE_MAX_CALLS,
15271526
on_condition=AddonsJobError,
1527+
throttle=JobThrottle.GROUP_RATE_LIMIT,
15281528
)
15291529
async def _restart_after_problem(self, state: ContainerState):
15301530
"""Restart unhealthy or failed addon."""

supervisor/addons/manager.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
from attr import evolve
1111

12+
from supervisor.jobs.const import JobConcurrency
13+
1214
from ..const import AddonBoot, AddonStartup, AddonState
1315
from ..coresys import CoreSys, CoreSysAttributes
1416
from ..exceptions import (
@@ -180,6 +182,7 @@ async def shutdown(self, stage: AddonStartup) -> None:
180182
name="addon_manager_install",
181183
conditions=ADDON_UPDATE_CONDITIONS,
182184
on_condition=AddonsJobError,
185+
concurrency=JobConcurrency.QUEUE,
183186
)
184187
async def install(self, slug: str) -> None:
185188
"""Install an add-on."""

supervisor/addons/model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ def read_readme() -> str | None:
645645
return None
646646

647647
# Return data
648-
return readme.read_text(encoding="utf-8")
648+
return readme.read_text(encoding="utf-8", errors="replace")
649649

650650
return await self.sys_run_in_executor(read_readme)
651651

supervisor/api/panel/entrypoint.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)