9
9
import traceback
10
10
import typing
11
11
from dataclasses import dataclass
12
- from typing import Literal , cast
12
+ from typing import Any , Literal , cast
13
13
from urllib .error import URLError
14
14
from uuid import uuid4
15
15
70
70
)
71
71
72
72
from .migrators_types import MigrationUidTypedDict
73
- from .models .pr_json import PullRequestData , PullRequestInfoSpecial , PullRequestState
73
+ from .models .pr_json import (
74
+ PullRequestData ,
75
+ PullRequestInfoSpecial ,
76
+ PullRequestState ,
77
+ )
74
78
75
79
logger = logging .getLogger (__name__ )
76
80
77
81
BOT_HOME_DIR : str = os .getcwd ()
78
- START_TIME = None
79
82
TIMEOUT = int (os .environ .get ("TIMEOUT" , 600 ))
80
83
81
84
# migrator runs on loop so avoid any seeds at current time should that happen
@@ -424,9 +427,9 @@ def _check_and_process_solvability(
424
427
425
428
def get_spoofed_closed_pr_info () -> PullRequestInfoSpecial :
426
429
return PullRequestInfoSpecial (
427
- id = str ( uuid4 () ),
430
+ id = uuid4 (),
428
431
merged_at = "never issued" ,
429
- state = "closed" ,
432
+ state = PullRequestState . CLOSED ,
430
433
)
431
434
432
435
@@ -437,7 +440,10 @@ def run_with_tmpdir(
437
440
rerender : bool = True ,
438
441
base_branch : str = "main" ,
439
442
** kwargs : typing .Any ,
440
- ) -> tuple [MigrationUidTypedDict , dict ] | tuple [Literal [False ], Literal [False ]]:
443
+ ) -> (
444
+ tuple [MigrationUidTypedDict , LazyJson | Literal [False ]]
445
+ | tuple [Literal [False ], Literal [False ]]
446
+ ):
441
447
"""
442
448
For a given feedstock and migration run the migration in a temporary directory that will be deleted after the
443
449
migration is complete.
@@ -465,7 +471,10 @@ def run(
465
471
rerender : bool = True ,
466
472
base_branch : str = "main" ,
467
473
** kwargs : typing .Any ,
468
- ) -> tuple [MigrationUidTypedDict , dict ] | tuple [Literal [False ], Literal [False ]]:
474
+ ) -> (
475
+ tuple [MigrationUidTypedDict , LazyJson | Literal [False ]]
476
+ | tuple [Literal [False ], Literal [False ]]
477
+ ):
469
478
"""For a given feedstock and migration run the migration
470
479
471
480
Parameters
@@ -601,19 +610,25 @@ def run(
601
610
and pr_data .state != PullRequestState .CLOSED
602
611
and rerender_info .rerender_comment
603
612
):
613
+ if pr_data .number is None :
614
+ raise ValueError (
615
+ f"Unexpected GitHub API response: PR number is missing for PR ID { pr_data .id } ."
616
+ )
604
617
git_backend .comment_on_pull_request (
605
618
repo_owner = context .git_repo_owner ,
606
619
repo_name = context .git_repo_name ,
607
620
pr_number = pr_data .number ,
608
621
comment = rerender_info .rerender_comment ,
609
622
)
610
623
624
+ pr_lazy_json : LazyJson | Literal [False ]
611
625
if pr_data :
612
- pr_lazy_json = LazyJson (
626
+ pr_lazy_json_present = LazyJson (
613
627
os .path .join ("pr_json" , f"{ pr_data .id } .json" ),
614
628
)
615
- with pr_lazy_json as __edit_pr_lazy_json :
629
+ with pr_lazy_json_present as __edit_pr_lazy_json :
616
630
__edit_pr_lazy_json .update (** pr_data .model_dump (mode = "json" ))
631
+ pr_lazy_json = pr_lazy_json_present
617
632
else :
618
633
pr_lazy_json = False
619
634
@@ -624,7 +639,10 @@ def run(
624
639
context .attrs , migrator_name , is_version = is_version_migration
625
640
)
626
641
627
- return migration_run_data ["migrate_return_value" ], pr_lazy_json
642
+ migrate_return_value : MigrationUidTypedDict = migration_run_data [
643
+ "migrate_return_value"
644
+ ]
645
+ return migrate_return_value , pr_lazy_json
628
646
629
647
630
648
def _compute_time_per_migrator (migrators ):
@@ -633,8 +651,8 @@ def _compute_time_per_migrator(migrators):
633
651
for migrator in tqdm .tqdm (migrators , ncols = 80 , desc = "computing time per migrator" ):
634
652
if isinstance (migrator , Version ):
635
653
_num_nodes = 0
636
- for node_name in migrator .effective_graph .nodes :
637
- with migrator .effective_graph .nodes [node_name ]["payload" ] as attrs :
654
+ for node_name in migrator .effective_graph .nodes : # type: ignore[union-attr] # TODO: effective_graph can be None
655
+ with migrator .effective_graph .nodes [node_name ]["payload" ] as attrs : # type: ignore[union-attr] # TODO: effective_graph can be None
638
656
with attrs ["version_pr_info" ] as vpri :
639
657
_attempts = vpri .get ("new_version_attempts" , {}).get (
640
658
vpri .get ("new_version" , "" ),
@@ -644,7 +662,7 @@ def _compute_time_per_migrator(migrators):
644
662
_num_nodes += 1
645
663
_num_nodes = max (
646
664
_num_nodes ,
647
- min (PR_LIMIT * 4 , len (migrator .effective_graph .nodes )),
665
+ min (PR_LIMIT * 4 , len (migrator .effective_graph .nodes )), # type: ignore[union-attr] # TODO: effective_graph can be None
648
666
)
649
667
num_nodes .append (_num_nodes )
650
668
else :
@@ -684,23 +702,6 @@ def _compute_time_per_migrator(migrators):
684
702
return num_nodes , time_per_migrator , tot_time_per_migrator
685
703
686
704
687
- def _over_time_limit ():
688
- _now = time .time ()
689
- print (
690
- """\
691
-
692
- =~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>
693
- =~> elpased time %ds (timeout %ds)
694
- =~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>=~>
695
-
696
- """
697
- % (_now - START_TIME , TIMEOUT ),
698
- flush = True ,
699
- end = "" ,
700
- )
701
- return _now - START_TIME > TIMEOUT
702
-
703
-
704
705
def _run_migrator_on_feedstock_branch (
705
706
attrs ,
706
707
base_branch ,
@@ -730,15 +731,15 @@ def _run_migrator_on_feedstock_branch(
730
731
# if migration successful
731
732
if migrator_uid :
732
733
with attrs ["pr_info" ] as pri :
733
- d = frozen_to_json_friendly (migrator_uid )
734
+ d : Any = frozen_to_json_friendly (migrator_uid )
734
735
# if we have the PR already do nothing
735
736
if d ["data" ] in [
736
737
existing_pr ["data" ] for existing_pr in pri .get ("PRed" , [])
737
738
]:
738
739
pass
739
740
else :
740
741
if not pr_json :
741
- pr_json = {
742
+ pr_json = { # type: ignore[assignment] # TODO: incompatible with LazyJson
742
743
"state" : "closed" ,
743
744
"head" : {
744
745
"ref" : "<this_is_not_a_branch>" ,
@@ -847,15 +848,15 @@ def _run_migrator_on_feedstock_branch(
847
848
return good_prs , break_loop
848
849
849
850
850
- def _is_migrator_done (_mg_start , good_prs , time_per , pr_limit ):
851
+ def _is_migrator_done (_mg_start , good_prs , time_per , pr_limit , start_time : float ):
851
852
curr_time = time .time ()
852
853
backend = github_backend ()
853
854
api_req = backend .get_api_requests_left ()
854
855
855
- if curr_time - START_TIME > TIMEOUT :
856
+ if curr_time - start_time > TIMEOUT :
856
857
logger .info (
857
858
"BOT TIMEOUT: breaking after %d seconds (limit %d)" ,
858
- curr_time - START_TIME ,
859
+ curr_time - start_time ,
859
860
TIMEOUT ,
860
861
)
861
862
return True
@@ -885,7 +886,9 @@ def _is_migrator_done(_mg_start, good_prs, time_per, pr_limit):
885
886
return False
886
887
887
888
888
- def _run_migrator (migrator , mctx , temp , time_per , git_backend : GitPlatformBackend ):
889
+ def _run_migrator (
890
+ migrator , mctx , temp , time_per , git_backend : GitPlatformBackend , start_time : float
891
+ ):
889
892
_mg_start = time .time ()
890
893
891
894
migrator_name = get_migrator_name (migrator )
@@ -939,7 +942,9 @@ def _run_migrator(migrator, mctx, temp, time_per, git_backend: GitPlatformBacken
939
942
flush = True ,
940
943
)
941
944
942
- if _is_migrator_done (_mg_start , good_prs , time_per , migrator .pr_limit ):
945
+ if _is_migrator_done (
946
+ _mg_start , good_prs , time_per , migrator .pr_limit , start_time
947
+ ):
943
948
return 0
944
949
945
950
for node_name in possible_nodes :
@@ -956,7 +961,9 @@ def _run_migrator(migrator, mctx, temp, time_per, git_backend: GitPlatformBacken
956
961
):
957
962
# Don't let CI timeout, break ahead of the timeout so we make certain
958
963
# to write to the repo
959
- if _is_migrator_done (_mg_start , good_prs , time_per , migrator .pr_limit ):
964
+ if _is_migrator_done (
965
+ _mg_start , good_prs , time_per , migrator .pr_limit , start_time
966
+ ):
960
967
break
961
968
962
969
base_branches = migrator .get_possible_feedstock_branches (attrs )
@@ -1201,8 +1208,7 @@ def _update_graph_with_pr_info():
1201
1208
1202
1209
1203
1210
def main (ctx : CliContext ) -> None :
1204
- global START_TIME
1205
- START_TIME = time .time ()
1211
+ start_time = time .time ()
1206
1212
1207
1213
_setup_limits ()
1208
1214
@@ -1260,7 +1266,12 @@ def main(ctx: CliContext) -> None:
1260
1266
1261
1267
for mg_ind , migrator in enumerate (migrators ):
1262
1268
good_prs = _run_migrator (
1263
- migrator , mctx , temp , time_per_migrator [mg_ind ], git_backend
1269
+ migrator ,
1270
+ mctx ,
1271
+ temp ,
1272
+ time_per_migrator [mg_ind ],
1273
+ git_backend ,
1274
+ start_time = start_time ,
1264
1275
)
1265
1276
if good_prs > 0 :
1266
1277
pass
0 commit comments