88and filters them based on the event that happened on CI.
99"""
1010import dataclasses
11- import enum
1211import json
1312import logging
1413import os
14+ import re
15+ import typing
1516from pathlib import Path
1617from typing import List , Dict , Any , Optional
1718
@@ -44,22 +45,51 @@ def add_base_env(jobs: List[Job], environment: Dict[str, str]) -> List[Job]:
4445 return jobs
4546
4647
47- class WorkflowRunType (enum .Enum ):
48- PR = enum .auto ()
49- Try = enum .auto ()
50- Auto = enum .auto ()
48+ @dataclasses .dataclass
49+ class PRRunType :
50+ pass
51+
52+
53+ @dataclasses .dataclass
54+ class TryRunType :
55+ job : Optional [str ] = None
56+
57+
58+ @dataclasses .dataclass
59+ class AutoRunType :
60+ pass
61+
62+
63+ WorkflowRunType = typing .Union [PRRunType , TryRunType , AutoRunType ]
5164
5265
5366@dataclasses .dataclass
5467class GitHubCtx :
5568 event_name : str
5669 ref : str
5770 repository : str
71+ commit_message : Optional [str ]
72+
73+
74+ def get_job_from_commit (ctx : GitHubCtx ) -> Optional [str ]:
75+ """
76+ Tries to parse a name of a CI job that should be executed in the form of
77+ ci-job: <job-name>
78+ from the commit message of the passed GitHub context.
79+ """
80+ if ctx .commit_message is None :
81+ return None
82+
83+ regex = re .compile (r"ci-job: (.*)" )
84+ match = regex .search (ctx .commit_message )
85+ if match is None :
86+ return None
87+ return match .group (1 )
5888
5989
6090def find_run_type (ctx : GitHubCtx ) -> Optional [WorkflowRunType ]:
6191 if ctx .event_name == "pull_request" :
62- return WorkflowRunType . PR
92+ return PRRunType ()
6393 elif ctx .event_name == "push" :
6494 old_bors_try_build = (
6595 ctx .ref in ("refs/heads/try" , "refs/heads/try-perf" ) and
@@ -72,22 +102,29 @@ def find_run_type(ctx: GitHubCtx) -> Optional[WorkflowRunType]:
72102 try_build = old_bors_try_build or new_bors_try_build
73103
74104 if try_build :
75- return WorkflowRunType .Try
105+ job_name = get_job_from_commit (ctx )
106+ return TryRunType (job = job_name )
76107
77108 if ctx .ref == "refs/heads/auto" and ctx .repository == "rust-lang-ci/rust" :
78- return WorkflowRunType . Auto
109+ return AutoRunType ()
79110
80111 return None
81112
82113
83114def calculate_jobs (run_type : WorkflowRunType , job_data : Dict [str , Any ]) -> List [Job ]:
84- if run_type == WorkflowRunType . PR :
115+ if isinstance ( run_type , PRRunType ) :
85116 return add_base_env (name_jobs (job_data ["pr" ], "PR" ), job_data ["envs" ]["pr" ])
86- elif run_type == WorkflowRunType .Try :
87- return add_base_env (name_jobs (job_data ["try" ], "try" ), job_data ["envs" ]["try" ])
88- elif run_type == WorkflowRunType .Auto :
117+ elif isinstance (run_type , TryRunType ):
118+ jobs = job_data ["try" ]
119+ if run_type .job is not None :
120+ jobs = [job for job in job_data ["auto" ] if job ["image" ] == run_type .job ]
121+ if not jobs :
122+ raise Exception (f"CI job `{ run_type .job } ` asked for in the try build does not exist" )
123+
124+ return add_base_env (name_jobs (jobs , "try" ), job_data ["envs" ]["try" ])
125+ elif run_type is AutoRunType :
89126 return add_base_env (name_jobs (job_data ["auto" ], "auto" ), job_data ["envs" ]["auto" ])
90-
127+ # Test
91128 return []
92129
93130
@@ -99,19 +136,25 @@ def skip_jobs(jobs: List[Dict[str, Any]], channel: str) -> List[Job]:
99136
100137
101138def get_github_ctx () -> GitHubCtx :
139+ event_name = os .environ ["GITHUB_EVENT_NAME" ]
140+
141+ commit_message = None
142+ if event_name == "push" :
143+ commit_message = os .environ ["COMMIT_MESSAGE" ]
102144 return GitHubCtx (
103- event_name = os . environ [ "GITHUB_EVENT_NAME" ] ,
145+ event_name = event_name ,
104146 ref = os .environ ["GITHUB_REF" ],
105- repository = os .environ ["GITHUB_REPOSITORY" ]
147+ repository = os .environ ["GITHUB_REPOSITORY" ],
148+ commit_message = commit_message
106149 )
107150
108151
109152def format_run_type (run_type : WorkflowRunType ) -> str :
110- if run_type == WorkflowRunType . PR :
153+ if isinstance ( run_type , PRRunType ) :
111154 return "pr"
112- elif run_type == WorkflowRunType . Auto :
155+ elif isinstance ( run_type , AutoRunType ) :
113156 return "auto"
114- elif run_type == WorkflowRunType . Try :
157+ elif isinstance ( run_type , TryRunType ) :
115158 return "try"
116159 else :
117160 raise AssertionError ()
0 commit comments