Skip to content

Commit 323f888

Browse files
committed
fix all types broken by 4.3
1 parent 70d218e commit 323f888

File tree

5 files changed

+96
-65
lines changed

5 files changed

+96
-65
lines changed

buildbot_nix/buildbot_nix/__init__.py

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ def __init__(
142142
self.show_trace = show_trace
143143

144144
async def produce_event(self, event: str, result: None | int) -> None:
145+
if not self.build:
146+
return
145147
build: dict[str, Any] = await self.master.data.get(
146148
("builds", str(self.build.buildid))
147149
)
@@ -191,9 +193,10 @@ async def run(self) -> int:
191193

192194
# if the command passes extract the list of stages
193195
result = cmd.results()
194-
await CombinedBuildEvent.produce_event_for_build(
195-
self.master, CombinedBuildEvent.FINISHED_NIX_EVAL, self.build, result
196-
)
196+
if self.build:
197+
await CombinedBuildEvent.produce_event_for_build(
198+
self.master, CombinedBuildEvent.FINISHED_NIX_EVAL, self.build, result
199+
)
197200
if result == util.SUCCESS:
198201
# create a ShellCommand for each stage and add them to the build
199202
jobs: list[NixEvalJob] = []
@@ -221,26 +224,27 @@ async def run(self) -> int:
221224

222225
self.number_of_jobs = len(successful_jobs)
223226

224-
self.build.addStepsAfterCurrentStep(
225-
[
226-
BuildTrigger(
227-
project=self.project,
228-
builds_scheduler=f"{self.project.project_id}-nix-build",
229-
skipped_builds_scheduler=f"{self.project.project_id}-nix-skipped-build",
230-
failed_eval_scheduler=f"{self.project.project_id}-nix-failed-eval",
231-
dependency_failed_scheduler=f"{self.project.project_id}-nix-dependency-failed",
232-
cached_failure_scheduler=f"{self.project.project_id}-nix-cached-failure",
233-
name="build flake",
234-
successful_jobs=successful_jobs,
235-
failed_jobs=failed_jobs,
236-
combine_builds=(
237-
self.job_report_limit is not None
238-
and self.number_of_jobs > self.job_report_limit
227+
if self.build:
228+
self.build.addStepsAfterCurrentStep(
229+
[
230+
BuildTrigger(
231+
project=self.project,
232+
builds_scheduler=f"{self.project.project_id}-nix-build",
233+
skipped_builds_scheduler=f"{self.project.project_id}-nix-skipped-build",
234+
failed_eval_scheduler=f"{self.project.project_id}-nix-failed-eval",
235+
dependency_failed_scheduler=f"{self.project.project_id}-nix-dependency-failed",
236+
cached_failure_scheduler=f"{self.project.project_id}-nix-cached-failure",
237+
name="build flake",
238+
successful_jobs=successful_jobs,
239+
failed_jobs=failed_jobs,
240+
combine_builds=(
241+
self.job_report_limit is not None
242+
and self.number_of_jobs > self.job_report_limit
243+
),
244+
failed_builds_db=self.failed_builds_db,
239245
),
240-
failed_builds_db=self.failed_builds_db,
241-
),
242-
]
243-
)
246+
]
247+
)
244248

245249
return result
246250

@@ -266,16 +270,17 @@ async def run(self) -> int:
266270
# create a ShellCommand for each stage and add them to the build
267271
effects = json.loads(self.observer.getStdout())
268272

269-
self.build.addStepsAfterCurrentStep(
270-
[
271-
BuildbotEffectsTrigger(
272-
project=self.project,
273-
effects_scheduler=f"{self.project.project_id}-run-effect",
274-
name="Buildbot effect",
275-
effects=effects,
276-
),
277-
],
278-
)
273+
if self.build:
274+
self.build.addStepsAfterCurrentStep(
275+
[
276+
BuildbotEffectsTrigger(
277+
project=self.project,
278+
effects_scheduler=f"{self.project.project_id}-run-effect",
279+
name="Buildbot effect",
280+
effects=effects,
281+
),
282+
],
283+
)
279284

280285
return result
281286

@@ -336,7 +341,7 @@ def __init__(
336341
super().__init__(**kwargs)
337342

338343
async def run(self) -> int:
339-
if self.build.reason != "rebuild":
344+
if self.build and self.build.reason != "rebuild":
340345
attr = self.getProperty("attr")
341346
# show eval error
342347
error_log: StreamLog = await self.addLog("nix_error")
@@ -369,7 +374,11 @@ def __init__(self, **kwargs: Any) -> None:
369374
super().__init__(**kwargs)
370375

371376
async def run(self) -> int:
372-
if self.build.reason == "rebuild" and not self.getProperty("combine_builds"):
377+
if (
378+
self.build
379+
and self.build.reason == "rebuild"
380+
and not self.getProperty("combine_builds")
381+
):
373382
await CombinedBuildEvent.produce_event_for_build(
374383
self.master, CombinedBuildEvent.STARTED_NIX_BUILD, self.build, None
375384
)
@@ -380,7 +389,11 @@ async def run(self) -> int:
380389

381390
res = cmd.results()
382391

383-
if self.build.reason == "rebuild" and not self.getProperty("combine_builds"):
392+
if (
393+
self.build
394+
and self.build.reason == "rebuild"
395+
and not self.getProperty("combine_builds")
396+
):
384397
await CombinedBuildEvent.produce_event_for_build(
385398
self.master, CombinedBuildEvent.FINISHED_NIX_BUILD, self.build, res
386399
)

buildbot_nix/buildbot_nix/build_trigger.py

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,11 @@ def interrupt(self, reason: str | Failure) -> None:
125125
if self.running and not self.ended:
126126
self.ended = True
127127
# if we are interrupted because of a connection lost, we interrupt synchronously
128-
if self.build.conn is None and self.wait_for_finish_deferred is not None:
128+
if (
129+
self.build
130+
and self.build.conn is None
131+
and self.wait_for_finish_deferred is not None
132+
):
129133
self.wait_for_finish_deferred.cancel()
130134

131135
def get_scheduler_by_name(self, name: str) -> Triggerable:
@@ -232,7 +236,7 @@ async def schedule(
232236
waited_for=True,
233237
sourcestamps=ss_for_trigger,
234238
set_props=props,
235-
parent_buildid=self.build.buildid,
239+
parent_buildid=self.build.buildid if self.build else None,
236240
parent_relationship="Triggered from",
237241
)
238242

@@ -278,7 +282,7 @@ def prepare_sourcestamp_list_for_trigger(
278282
dict[str, Any]
279283
]: # TODO: ISourceStamp? its defined but never used anywhere an doesn't include `asDict` method
280284
ss_for_trigger = {}
281-
objs_from_build = self.build.getAllSourceStamps()
285+
objs_from_build = self.build.getAllSourceStamps() if self.build else []
282286
for ss in objs_from_build:
283287
ss_for_trigger[ss.codebase] = ss.asDict()
284288

@@ -340,15 +344,16 @@ async def run(self) -> int:
340344
reports. The reporting is based on custom events and logic, see `BuildNixEvalStatusGenerator` for
341345
the receiving side.
342346
"""
343-
await CombinedBuildEvent.produce_event_for_build(
344-
self.master, CombinedBuildEvent.STARTED_NIX_BUILD, self.build, None
345-
)
347+
if self.build:
348+
await CombinedBuildEvent.produce_event_for_build(
349+
self.master, CombinedBuildEvent.STARTED_NIX_BUILD, self.build, None
350+
)
346351

347352
done: list[BuildTrigger.DoneJob] = []
348353
scheduled: list[BuildTrigger.ScheduledJob] = []
349354

350355
self.running = True
351-
build_props = self.build.getProperties()
356+
build_props = self.build.getProperties() if self.build else Properties()
352357
ss_for_trigger = self.prepare_sourcestamp_list_for_trigger()
353358
scheduler_log: StreamLog = await self.addLog("scheduler")
354359

@@ -394,7 +399,11 @@ async def run(self) -> int:
394399
failed_build = self.failed_builds_db.check_build(build.drvPath)
395400
if job_closures.get(build.drvPath):
396401
pass
397-
elif failed_build is not None and self.build.reason != "rebuild":
402+
elif (
403+
failed_build is not None
404+
and self.build
405+
and self.build.reason != "rebuild"
406+
):
398407
scheduler_log.addStdout(
399408
f"\t- skipping {build.attr} due to cached failure, first failed at {failed_build.time}\n"
400409
f"\t see build at {failed_build.url}\n"
@@ -409,7 +418,11 @@ async def run(self) -> int:
409418
BuildTrigger.ScheduledJob(build, brids, results_deferred)
410419
)
411420
self.brids.extend(brids.values())
412-
elif failed_build is not None and self.build.reason == "rebuild":
421+
elif (
422+
failed_build is not None
423+
and self.build
424+
and self.build.reason == "rebuild"
425+
):
413426
self.failed_builds_db.remove_build(build.drvPath)
414427
scheduler_log.addStdout(
415428
f"\t- not skipping {build.attr} with cached failure due to rebuild, first failed at {failed_build.time}\n"
@@ -470,10 +483,10 @@ async def run(self) -> int:
470483
if isinstance(job, NixEvalJobSuccess):
471484
if result != SUCCESS:
472485
if (
473-
self.build.reason == "rebuild"
486+
(self.build and self.build.reason == "rebuild")
474487
or not self.failed_builds_db.check_build(job.drvPath)
475488
) and result == util.FAILURE:
476-
url = await self.build.getUrl()
489+
url = await self.build.getUrl() if self.build else ""
477490
self.failed_builds_db.add_build(
478491
job.drvPath, datetime.now(tz=UTC), url
479492
)
@@ -513,12 +526,13 @@ async def run(self) -> int:
513526
while self.update_result_futures:
514527
await self.update_result_futures.pop()
515528

516-
await CombinedBuildEvent.produce_event_for_build(
517-
self.master,
518-
CombinedBuildEvent.FINISHED_NIX_BUILD,
519-
self.build,
520-
overall_result,
521-
)
529+
if self.build:
530+
await CombinedBuildEvent.produce_event_for_build(
531+
self.master,
532+
CombinedBuildEvent.FINISHED_NIX_BUILD,
533+
self.build,
534+
overall_result,
535+
)
522536
scheduler_log.addStdout("Done!\n")
523537
return overall_result
524538

buildbot_nix/buildbot_nix/common.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
from typing import TYPE_CHECKING, Any, TypeVar
1010

1111
if TYPE_CHECKING:
12-
from buildbot.process.log import StreamLog
1312
from pydantic import BaseModel
1413

1514

1615
from buildbot.plugins import util
1716
from buildbot.process.buildstep import BuildStep
17+
from buildbot.util.twisted import async_to_deferred
1818
from twisted.internet import threads
1919
from twisted.python.failure import Failure
2020

@@ -156,6 +156,7 @@ def run_deferred(self) -> None:
156156
def run_post(self) -> Any:
157157
pass
158158

159+
@async_to_deferred
159160
async def run(self) -> int:
160161
d = threads.deferToThread(self.run_deferred) # type: ignore[no-untyped-call]
161162

@@ -169,8 +170,8 @@ def error_cb(failure: Failure) -> int:
169170
res = await d
170171
if res == util.SUCCESS:
171172
return self.run_post()
172-
log: StreamLog = await self.addLog("log")
173-
log.addStderr(f"Failed to reload project list: {self.error_msg}")
173+
log = await self.addLog("log")
174+
log.addStderr(f"Failed to reload project list: {self.error_msg}") # type: ignore[attr-defined]
174175
return util.FAILURE
175176

176177

buildbot_nix/buildbot_nix/oauth2_proxy_auth.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import Any, ClassVar
44

55
from buildbot.util import bytes2unicode, unicode2bytes
6+
from buildbot.util.twisted import async_to_deferred
67
from buildbot.www.auth import AuthBase, UserInfoProviderBase
78
from twisted.logger import Logger
89
from twisted.web.error import Error
@@ -31,6 +32,7 @@ def getLoginResource(self) -> IResource: # noqa: N802
3132
def getLogoutResource(self) -> IResource: # noqa: N802
3233
return typing.cast("IResource", Redirect(b"/oauth2/sign_out"))
3334

35+
@async_to_deferred
3436
async def maybeAutoLogin( # noqa: N802
3537
self, request: Request
3638
) -> None:

buildbot_nix/buildbot_nix/repo_config/__init__.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
import tomllib
22
from pathlib import Path
33
from tomllib import TOMLDecodeError
4-
from typing import TYPE_CHECKING, Self
4+
from typing import Self
55

66
from buildbot.process.buildstep import BuildStep, ShellMixin
77
from pydantic import BaseModel, ValidationError
88

99
from buildbot_nix.errors import BuildbotNixError
1010

11-
if TYPE_CHECKING:
12-
from buildbot.process.log import StreamLog
1311

14-
15-
class BuildStepShellMixin(BuildStep, ShellMixin):
12+
class BuildStepShellMixin(BuildStep, ShellMixin): # type: ignore[misc]
1613
pass
1714

1815

@@ -27,11 +24,11 @@ class BranchConfig(BaseModel):
2724

2825
@classmethod
2926
async def extract_during_step(cls, buildstep: BuildStepShellMixin) -> Self:
30-
stdio: StreamLog = await buildstep.addLog("stdio")
27+
stdio = await buildstep.addLog("stdio")
3128
cmd = await buildstep.makeRemoteShellCommand(
3229
collectStdout=True,
3330
collectStderr=True,
34-
stdioLogName=None,
31+
stdioLogName="stdio",
3532
# TODO: replace this with something like buildbot.steps.transfer.StringUpload
3633
# in the future... this one doesn't not exist yet.
3734
command=[
@@ -42,7 +39,7 @@ async def extract_during_step(cls, buildstep: BuildStepShellMixin) -> Self:
4239
)
4340
await buildstep.runCommand(cmd)
4441
if cmd.didFail():
45-
stdio.addStderr(
42+
stdio.addStderr( # type: ignore[attr-defined]
4643
f"Failed to read repository local configuration, {cmd.stderr}.\n"
4744
)
4845
return cls()
@@ -54,9 +51,13 @@ async def extract_during_step(cls, buildstep: BuildStepShellMixin) -> Self:
5451
msg = f"Invalid flake_dir {config.flake_dir}"
5552
raise BuildbotNixError(msg)
5653
except ValidationError as e:
57-
stdio.addStderr(f"Failed to read repository local configuration, {e}.\n")
54+
stdio.addStderr( # type: ignore[attr-defined]
55+
f"Failed to read repository local configuration, {e}.\n"
56+
)
5857
return cls()
5958
except TOMLDecodeError as e:
60-
stdio.addStderr(f"Failed to read repository local configuration, {e}.\n")
59+
stdio.addStderr( # type: ignore[attr-defined]
60+
f"Failed to read repository local configuration, {e}.\n"
61+
)
6162
return cls()
6263
return config

0 commit comments

Comments
 (0)