@@ -148,8 +148,15 @@ def normalize_check_state(check: dict[str, Any]) -> str:
148148 return "UNKNOWN"
149149
150150
151+ def check_identity (check : dict [str , Any ], name : str ) -> tuple [str , str ]:
152+ typename = str (check .get ("__typename" ) or "" )
153+ if not typename :
154+ typename = "StatusContext" if check .get ("context" ) else "CheckRun"
155+ return (typename , name )
156+
157+
151158def check_states (checks : Iterable [dict [str , Any ]]) -> dict [str , str ]:
152- grouped : dict [str , tuple [str , int , str ]] = {}
159+ grouped : dict [tuple [ str , tuple [ str , str ]] , tuple [str , int , str ]] = {}
153160 for index , check in enumerate (checks ):
154161 name = str (check .get ("name" ) or check .get ("context" ) or "" )
155162 if not name :
@@ -168,17 +175,23 @@ def check_states(checks: Iterable[dict[str, Any]]) -> dict[str, str]:
168175 state = normalize_check_state (check )
169176 # A newly queued run may not have a timestamp yet. Fail closed instead
170177 # of letting an older success hide that pending rerun.
171- order = "\uffff " if not timestamp and state not in PASSED_CHECK_STATES else timestamp
178+ order = (
179+ "\uffff " if not timestamp and state not in PASSED_CHECK_STATES else timestamp
180+ )
172181 candidate = (order , index , state )
173- if name not in grouped or candidate [:2 ] > grouped [name ][:2 ]:
174- grouped [name ] = candidate
182+ key = (name , check_identity (check , name ))
183+ if key not in grouped or candidate [:2 ] > grouped [key ][:2 ]:
184+ grouped [key ] = candidate
185+
186+ states_by_name : dict [str , list [str ]] = {}
187+ for (name , _identity ), value in grouped .items ():
188+ states_by_name .setdefault (name , []).append (value [2 ])
175189
176190 result : dict [str , str ] = {}
177- for name , value in grouped .items ():
178- state = value [2 ]
179- if state in FAILED_CHECK_STATES :
191+ for name , states in states_by_name .items ():
192+ if any (state in FAILED_CHECK_STATES for state in states ):
180193 result [name ] = "failed"
181- elif state in PASSED_CHECK_STATES :
194+ elif all ( state in PASSED_CHECK_STATES for state in states ) :
182195 result [name ] = "passed"
183196 else :
184197 result [name ] = "pending"
0 commit comments