99from buildbot .process .build import Build
1010from buildbot .reporters .utils import getDetailsForBuild
1111from datetime import datetime , timezone
12+ from buildbot .reporters import utils
13+ from buildbot .process .buildrequest import BuildRequest
14+ from buildbot .process .properties import Properties
15+ from buildbot .process .results import CANCELLED
16+ from twisted .logger import Logger
17+
18+ log = Logger ()
1219
1320@implementer (IReportGenerator )
1421class BuildNixEvalStatusGenerator (BuildStatusGeneratorMixin ):
@@ -17,6 +24,8 @@ class BuildNixEvalStatusGenerator(BuildStatusGeneratorMixin):
1724 ('builds' , None , 'finished-nix-eval' ),
1825 ('builds' , None , 'started-nix-build' ),
1926 ('builds' , None , 'finished-nix-build' ),
27+ ('buildrequests' , None , 'started-nix-build' ),
28+ ('buildrequests' , None , 'canceled-nix-build' ),
2029 ]
2130
2231 compare_attrs = ['start_formatter' , 'end_formatter' ]
@@ -43,34 +52,88 @@ def __init__(
4352 if self .end_formatter is None :
4453 self .end_formatter = MessageFormatterRenderable ('Build done.' )
4554
55+ # TODO: copy pasted from buildbot, make it static upstream and reuse
56+ @staticmethod
4657 @defer .inlineCallbacks
47- def generate (self , master : BuildMaster , reporter : ReporterBase , key : tuple [str , None | Any , str ], build : Build ) -> defer .Generator [Any , object , Any ]:
48- _ , _ , event = key
49- is_new = event == 'new'
50-
51- formatter = self .start_formatter if is_new else self .end_formatter
52-
53- yield getDetailsForBuild (
54- master ,
55- build ,
56- want_properties = formatter .want_properties ,
57- want_steps = formatter .want_steps ,
58- want_logs = formatter .want_logs ,
59- want_logs_content = formatter .want_logs_content ,
58+ def partial_build_dict (master : BuildMaster , buildrequest : BuildRequest ) -> defer .Generator [Any , object , dict [str , Any ]]:
59+ brdict : Any = yield master .db .buildrequests .getBuildRequest (buildrequest ['buildrequestid' ])
60+ bdict = {}
61+
62+ props = Properties ()
63+ buildrequest = yield BuildRequest .fromBrdict (master , brdict )
64+ builder = yield master .botmaster .getBuilderById (brdict ["builderid" ])
65+
66+ yield Build .setup_properties_known_before_build_starts (props , [buildrequest ], builder )
67+ Build .setupBuildProperties (props , [buildrequest ])
68+
69+ bdict ['properties' ] = props .asDict ()
70+ yield utils .get_details_for_buildrequest (master , brdict , bdict )
71+ return bdict
72+
73+ # TODO: copy pasted from buildbot, somehow reuse
74+ @defer .inlineCallbacks
75+ def buildrequest_message (self , master : BuildMaster , build : dict [str , Any ]) -> defer .Generator [Any , Any , dict [str , Any ]]:
76+ patches = self ._get_patches_for_build (build )
77+ users : list [str ] = []
78+ buildmsg = yield self .start_formatter .format_message_for_build (
79+ master , build , is_buildset = True , mode = self .mode , users = users
6080 )
6181
62- if not self .is_message_needed_by_props (build ):
63- return None
82+ return {
83+ 'body' : buildmsg ['body' ],
84+ 'subject' : buildmsg ['subject' ],
85+ 'type' : buildmsg ['type' ],
86+ 'results' : build ['results' ],
87+ 'builds' : [build ],
88+ "buildset" : build ["buildset" ],
89+ 'users' : list (users ),
90+ 'patches' : patches ,
91+ 'logs' : [],
92+ "extra_info" : buildmsg ["extra_info" ],
93+ }
94+
95+ @defer .inlineCallbacks
96+ def generate (self , master : BuildMaster , reporter : ReporterBase , key : tuple [str , None | Any , str ], data : Build | BuildRequest ) -> defer .Generator [Any , Any , Any ]:
97+ what , _ , event = key
98+ log .info ("{what} produced {event}" , what = what , event = event )
99+ if what == "builds" :
100+ is_new = event == 'new'
101+
102+ formatter = self .start_formatter if is_new else self .end_formatter
103+
104+ yield getDetailsForBuild (
105+ master ,
106+ data ,
107+ want_properties = formatter .want_properties ,
108+ want_steps = formatter .want_steps ,
109+ want_logs = formatter .want_logs ,
110+ want_logs_content = formatter .want_logs_content ,
111+ )
112+
113+ if not self .is_message_needed_by_props (data ):
114+ return None
115+
116+ report = yield self .build_message (formatter , master , reporter , data )
117+ reportT : dict [str , Any ] = cast (dict [str , Any ], report )
118+
119+ if event == "started-nix-eval" or event == "finished-nix-eval" :
120+ reportT ["builds" ][0 ]["properties" ]["status_name" ] = ("nix-eval" , "generator" )
121+ if (event == "started-nix-build" or event == "finished-nix-build" ) and reportT ["builds" ][0 ]["properties" ]["status_name" ][0 ] == "nix-eval" :
122+ reportT ["builds" ][0 ]["properties" ]["status_name" ] = ("nix-build" , "generator" )
123+ if event == "finished-nix-eval" or event == "finished-nix-build" :
124+ reportT ["builds" ][0 ]["complete" ] = True
125+ reportT ["builds" ][0 ]["complete_at" ] = datetime .now (tz = timezone .utc )
126+
127+ return reportT
128+ elif what == "buildrequests" :
129+ build : dict [str , Any ] = yield self .partial_build_dict (master , data )
64130
65- report = yield self .build_message (formatter , master , reporter , build )
66- reportT : dict [str , Any ] = cast (dict [str , Any ], report )
131+ if event == 'canceled-nix-build' :
132+ build ['complete' ] = True
133+ build ['results' ] = CANCELLED
67134
68- if event == "started-nix-eval" or event == "finished-nix-eval" :
69- reportT ["builds" ][0 ]["properties" ]["status_name" ] = ("nix-eval" , "generator" )
70- if (event == "started-nix-build" or event == "finished-nix-build" ) and reportT ["builds" ][0 ]["properties" ]["status_name" ][0 ] == "nix-eval" :
71- reportT ["builds" ][0 ]["properties" ]["status_name" ] = ("nix-build" , "generator" )
72- if event == "finished-nix-eval" or event == "finished-nix-build" :
73- reportT ["builds" ][0 ]["complete" ] = True
74- reportT ["builds" ][0 ]["complete_at" ] = datetime .now (tz = timezone .utc )
135+ if not self .is_message_needed_by_props (build ):
136+ return None
75137
76- return reportT
138+ report = yield self .buildrequest_message (master , build )
139+ return report
0 commit comments