7171)
7272
7373DOWNLOADS_LINKS = {
74- "GRADLE_JAVA_HOME" : "https://download.oracle.com/java/{major_version}/latest/jdk-{major_version}_{os}-{arch_short}_bin{ext}"
74+ "GRADLE_JAVA_HOME" : "https://download.oracle.com/java/{major_version}/latest/jdk-{major_version}_{os}-{arch_short}_bin{ext}" ,
75+ "ECLIPSE" : "https://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops4/R-4.26-202211231800/eclipse-SDK-4.26-linux-gtk-x86_64.tar.gz"
7576}
7677
7778# Gitlab Runners OSS
8283 "windows-latest" : ["windows" , "amd64" ]
8384}
8485
85- # Override unavailable Python versions for some OS/Arch combinations
86+ # Override unavailable Python versions for some OS/Arch / job name combinations
8687PYTHON_VERSIONS = {
8788 "ubuntu-24.04-arm" : "3.12.8" ,
89+ "ubuntu-latest" : "3.12.8" ,
90+ "style-gate" : "3.8.12"
91+ }
92+
93+ EXCLUDED_SYSTEM_PACKAGES = {
94+ "devkit" ,
95+ "msvc_source" ,
8896}
8997
9098
99+ PYTHON_PACKAGES_VERSIONS = {
100+ "pylint" : "==2.4" ,
101+ "astroid" : "==2.4"
102+ }
103+
91104@dataclass
92105class Artifact :
93106 name : str
@@ -148,8 +161,10 @@ def python_version(self) -> str | None:
148161 if "MX_PYTHON_VERSION" in self .env :
149162 del self .env ["MX_PYTHON_VERSION" ]
150163
151- if self .runs_on in PYTHON_VERSIONS :
152- python_version = PYTHON_VERSIONS [self .runs_on ]
164+ for key , version in PYTHON_VERSIONS .items ():
165+ if self .runs_on == key or key in self .name :
166+ python_version = version
167+
153168 return python_version
154169
155170 @cached_property
@@ -163,16 +178,20 @@ def system_packages(self) -> list[str]:
163178 continue
164179 elif k .startswith ("00:" ) or k .startswith ("01:" ):
165180 k = k [3 :]
181+ if any (excluded in k for excluded in EXCLUDED_SYSTEM_PACKAGES ):
182+ continue
166183 system_packages .append (f"'{ k } '" if self .runs_on != "windows-latest" else f"{ k } " )
167184 return system_packages
168185
169186 @cached_property
170187 def python_packages (self ) -> list [str ]:
171- python_packages = []
188+ python_packages = [f" { key } { value } " for key , value in PYTHON_PACKAGES_VERSIONS . items () ]
172189 for k , v in self .job .get ("packages" , {}).items ():
173190 if k .startswith ("pip:" ):
174- python_packages .append (f"'{ k [4 :]} { v } '" if self .runs_on != "windows-latest" else f"{ k [4 :]} { v } " )
175- return python_packages
191+ key = k [4 :]
192+ if key in PYTHON_PACKAGES_VERSIONS : continue
193+ python_packages .append (f"{ key } { v } " )
194+ return [f"'{ pkg } '" if self .runs_on != "windows-latest" else f"{ pkg } " for pkg in python_packages ]
176195
177196 def get_download_steps (self , key : str , version : str ) -> str :
178197 download_link = self .get_download_link (key , version )
@@ -186,7 +205,7 @@ def get_download_steps(self, key: str, version: str) -> str:
186205 Add-Content $env:GITHUB_ENV "{ key } =$(Resolve-Path $dirname)"
187206 """ )
188207
189- return (f"wget -q { download_link } && "
208+ return (f"wget -q ' { download_link } ' -O { filename } && "
190209 f"dirname=$(tar -tzf { filename } | head -1 | cut -f1 -d '/') && "
191210 f"tar -xzf { filename } && "
192211 f'echo { key } =$(realpath "$dirname") >> $GITHUB_ENV' )
@@ -201,7 +220,7 @@ def get_download_link(self, key: str, version: str) -> str:
201220
202221 vars = {
203222 "major_version" : major_version ,
204- "os" :os ,
223+ "os" : os ,
205224 "arch" : arch ,
206225 "arch_short" : arch_short ,
207226 "ext" : extension ,
@@ -261,6 +280,15 @@ def download_artifact(self) -> Artifact | None:
261280 return Artifact (pattern , os .path .normpath (artifacts [0 ].get ("dir" , "." )))
262281 return None
263282
283+ @staticmethod
284+ def safe_join (args : list [str ]) -> str :
285+ safe_args = []
286+ for s in args :
287+ if s .startswith ("$(" ) and s .endswith (")" ):
288+ safe_args .append (s )
289+ else :
290+ safe_args .append (shlex .quote (s ))
291+ return " " .join (safe_args )
264292
265293 @staticmethod
266294 def flatten_command (args : list [str | list [str ]]) -> list [str ]:
@@ -269,18 +297,19 @@ def flatten_command(args: list[str | list[str]]) -> list[str]:
269297 if isinstance (s , list ):
270298 flattened_args .append (f"$( { shlex .join (s )} )" )
271299 else :
272- flattened_args .append (s )
300+ out = re .sub (r"\$\{([A-Z0-9_]+)\}" , r"$\1" , s ).replace ("'" , "" )
301+ flattened_args .append (out )
273302 return flattened_args
274303
275304 @cached_property
276305 def setup (self ) -> str :
277306 cmds = [self .flatten_command (step ) for step in self .job .get ("setup" , [])]
278- return "\n " .join (shlex . join (s ) for s in cmds )
307+ return "\n " .join (self . safe_join (s ) for s in cmds )
279308
280309 @cached_property
281310 def run (self ) -> str :
282311 cmds = [self .flatten_command (step ) for step in self .job .get ("run" , [])]
283- return "\n " .join (shlex . join (s ) for s in cmds )
312+ return "\n " .join (self . safe_join (s ) for s in cmds )
284313
285314 @cached_property
286315 def logs (self ) -> str :
@@ -304,7 +333,7 @@ def to_dict(self):
304333 "require_artifact" : [self .download_artifact .name , self .download_artifact .pattern ] if self .download_artifact else None ,
305334 "logs" : self .logs .replace ("../" , "${{ env.PARENT_DIRECTORY }}/" ),
306335 "env" : self .env ,
307- "downloads_steps" : " " .join (self .downloads ),
336+ "downloads_steps" : "\n " .join (self .downloads ),
308337 }
309338
310339 def __str__ (self ):
0 commit comments