173173 """ ,
174174)
175175
176- accept_keywords = Path ("/etc/portage/package.accept_keywords" )
176+ portage_config = Path ("/etc/portage" )
177+ portage_accept_keywords = portage_config / "package.accept_keywords"
178+ portage_package_use = portage_config / "package.use"
179+ portage_package_env = portage_config / "package.env"
180+ portage_env = portage_config / "env"
177181
178182
179183@tatt .bind_final_check
@@ -232,8 +236,9 @@ def _groupby_use_expand(
232236 use_expand_prefixes : tuple [str , ...],
233237 domain_enabled : frozenset [str ],
234238 iuse : frozenset [str ],
235- ) -> dict [str , set [str ]]:
236- use_expand_dict = defaultdict (set )
239+ ):
240+ use_expand_dict : dict [str , set [str ]] = defaultdict (set )
241+ use_flags : set [str ] = set ()
237242 for var , state in assignment .items ():
238243 if var not in iuse :
239244 continue
@@ -245,8 +250,8 @@ def _groupby_use_expand(
245250 use_expand_dict [use_expand [:- 1 ]].add (var .removeprefix (use_expand ))
246251 break
247252 else :
248- use_expand_dict [ "USE" ] .add (("" if state else "-" ) + var )
249- return use_expand_dict
253+ use_flags .add (("" if state else "-" ) + var )
254+ return use_flags , use_expand_dict
250255
251256
252257def _build_job (namespace , pkg , is_test ):
@@ -286,11 +291,9 @@ def _build_job(namespace, pkg, is_test):
286291 frozenset (prefer_true ),
287292 )
288293 for solution in solutions :
289- yield " " .join (
290- f'{ var .upper ()} ="{ " " .join (vals )} "'
291- for var , vals in _groupby_use_expand (
292- solution , use_expand_prefixes , enabled , iuse
293- ).items ()
294+ use_flags , use_expand = _groupby_use_expand (solution , use_expand_prefixes , enabled , iuse )
295+ yield " " .join (use_flags ) + " " + " " .join (
296+ f'{ var .upper ()} : { " " .join (vals )} ' for var , vals in use_expand .items ()
294297 )
295298
296299
@@ -303,16 +306,37 @@ def _build_jobs(namespace, pkgs):
303306 yield pkg .versioned_atom , False , flags
304307
305308
309+ def _create_config_dir (directory : Path ):
310+ if not directory .exists ():
311+ directory .mkdir (parents = True )
312+ elif not directory .is_dir ():
313+ raise NotADirectoryError (f"{ directory } is not a directory" )
314+
315+
306316def _create_config_files (pkgs , job_name , is_keywording ):
307- if not accept_keywords .exists ():
308- accept_keywords .mkdir (parents = True )
309- elif not accept_keywords .is_dir ():
310- raise NotADirectoryError (f"{ accept_keywords } is not a directory" )
311- with (res := accept_keywords / f"pkgdev_tatt_{ job_name } .keywords" ).open ("w" ) as f :
317+ _create_config_dir (portage_accept_keywords )
318+ with (res := portage_accept_keywords / f"pkgdev_tatt_{ job_name } .keywords" ).open ("w" ) as f :
312319 f .write (f"# Job created by pkgdev tatt for { job_name !r} \n " )
313320 for pkg in pkgs :
314321 f .write (f'{ pkg .versioned_atom } { "**" if is_keywording else "" } \n ' )
315- return str (res )
322+ yield str (res )
323+
324+ _create_config_dir (portage_env )
325+ with (res := portage_env / f"pkgdev_tatt_{ job_name } _no_test" ).open ("w" ) as f :
326+ f .write (f"# Job created by pkgdev tatt for { job_name !r} \n " )
327+ f .write ('FEATURES="qa-unresolved-soname-deps multilib-strict"\n ' )
328+ yield str (res )
329+ with (res := portage_env / f"pkgdev_tatt_{ job_name } _test" ).open ("w" ) as f :
330+ f .write (f"# Job created by pkgdev tatt for { job_name !r} \n " )
331+ f .write ('FEATURES="qa-unresolved-soname-deps multilib-strict test"\n ' )
332+ yield str (res )
333+
334+ _create_config_dir (portage_package_use )
335+ (res := portage_package_use / f"pkgdev_tatt_{ job_name } " ).mkdir (exist_ok = True )
336+ yield str (res )
337+ _create_config_dir (portage_package_env )
338+ (res := portage_package_env / f"pkgdev_tatt_{ job_name } " ).mkdir (exist_ok = True )
339+ yield str (res )
316340
317341
318342@tatt .bind_main_func
@@ -329,9 +353,9 @@ def main(options, out, err):
329353 cleanup_files = []
330354
331355 try :
332- config_file = _create_config_files (pkgs , job_name , options .keywording )
333- out .write ("created config " , out .fg ("green" ), config_file , out .reset )
334- cleanup_files .append (config_file )
356+ for config_file in _create_config_files (pkgs , job_name , options .keywording ):
357+ out .write ("created config " , out .fg ("green" ), config_file , out .reset )
358+ cleanup_files .append (config_file )
335359 except Exception as exc :
336360 err .error (f"failed to create config files: { exc } " )
337361
@@ -346,6 +370,7 @@ def main(options, out, err):
346370 script = Template (template , trim_blocks = True , lstrip_blocks = True ).render (
347371 jobs = list (_build_jobs (options , pkgs )),
348372 report_file = job_name + ".report" ,
373+ job_name = job_name ,
349374 log_dir = options .logs_dir ,
350375 emerge_opts = options .emerge_opts ,
351376 cleanup_files = cleanup_files ,
0 commit comments