@@ -12,7 +12,6 @@ from typing import List, Any, DefaultDict, Tuple
12
12
from collections .abc import Set
13
13
from pathlib import Path
14
14
import graphlib
15
- import json
16
15
import datetime
17
16
import threading
18
17
from concurrent .futures import (
@@ -70,6 +69,7 @@ MYNAME = config['lilac']['name']
70
69
71
70
nvdata : dict [str , NvResults ] = {}
72
71
DEPMAP : dict [str , set [Dependency ]] = {}
72
+ BUILD_DEPMAP : dict [str , set [Dependency ]] = {}
73
73
build_reasons : DefaultDict [str , list [BuildReason ]] = defaultdict (list )
74
74
75
75
logger = logging .getLogger (__name__ )
@@ -163,7 +163,7 @@ def packages_with_depends(
163
163
pkgbase = pkg ,
164
164
index = idx ,
165
165
status = 'pending' ,
166
- build_reasons = json . dumps ( rs ) ,
166
+ build_reasons = rs ,
167
167
)
168
168
s .add (p )
169
169
db .build_updated (s )
@@ -263,12 +263,18 @@ def start_build(
263
263
limit = max_concurrency - len (futures ),
264
264
)
265
265
for pkg in pkgs :
266
+ if pkg not in nvdata :
267
+ # this can happen when cmdline packages are specified and
268
+ # a package is pulled in by OnBuild
269
+ logger .warning ('%s not in nvdata, skipping' , pkg )
270
+ buildsorter .done (pkg )
271
+ continue
266
272
fu = executor .submit (
267
273
build_it , pkg , repo , buildsorter , built , failed )
268
274
futures [fu ] = pkg
269
275
270
- if not futures :
271
- # no task is running: we're done
276
+ if not pkgs and not futures :
277
+ # no more packages and no task is running: we're done
272
278
break
273
279
274
280
done , pending = futures_wait (futures , return_when = FIRST_COMPLETED )
@@ -312,7 +318,7 @@ def try_pick_some(
312
318
313
319
if rs := build_reasons .get (pkg ):
314
320
if len (rs ) == 1 and isinstance (rs [0 ], BuildReason .FailedByDeps ):
315
- ds = DEPMAP [pkg ]
321
+ ds = BUILD_DEPMAP [pkg ]
316
322
if not all (d .resolve () for d in ds ):
317
323
buildsorter .done (pkg )
318
324
if db .USE :
@@ -370,7 +376,7 @@ def build_it(
370
376
update_info = nvdata [pkg ],
371
377
bindmounts = repo .bindmounts ,
372
378
tmpfs = repo .tmpfs ,
373
- depends = DEPMAP .get (pkg , ()),
379
+ depends = BUILD_DEPMAP .get (pkg , ()),
374
380
repo = REPO ,
375
381
myname = MYNAME ,
376
382
destdir = DESTDIR ,
@@ -454,6 +460,7 @@ def build_it(
454
460
cputime = memory = None
455
461
rs = [r .to_dict () for r in build_reasons [pkg ]]
456
462
with db .get_session () as s :
463
+ maintainers = repo .lilacinfos [pkg ].maintainers
457
464
p = db .PkgLog (
458
465
pkgbase = pkg ,
459
466
nv_version = newver ,
@@ -463,7 +470,8 @@ def build_it(
463
470
cputime = cputime ,
464
471
memory = memory ,
465
472
msg = msg ,
466
- build_reasons = json .dumps (rs ),
473
+ build_reasons = rs ,
474
+ maintainers = maintainers ,
467
475
)
468
476
s .add (p )
469
477
db .mark_pkg_as (s , pkg , 'done' )
@@ -489,12 +497,13 @@ def setup_thread():
489
497
def main_may_raise (
490
498
D : dict [str , Any ], pkgs_from_args : List [str ], logdir : Path ,
491
499
) -> None :
492
- global DEPMAP
500
+ global DEPMAP , BUILD_DEPMAP
493
501
494
502
if get_git_branch () not in ['master' , 'main' ]:
495
503
raise Exception ('repo not on master or main, aborting.' )
496
504
497
- pkgbuild .update_data (PACMAN_DB_DIR )
505
+ pacman_conf = config ['misc' ].get ('pacman_conf' )
506
+ pkgbuild .update_data (PACMAN_DB_DIR , pacman_conf )
498
507
499
508
if dburl := config ['lilac' ].get ('dburl' ):
500
509
import sqlalchemy
@@ -510,34 +519,42 @@ def main_may_raise(
510
519
failed = REPO .load_managed_lilac_and_report ()
511
520
512
521
depman = DependencyManager (REPO .repodir )
513
- DEPMAP = get_dependency_map (depman , REPO .lilacinfos )
522
+ DEPMAP , BUILD_DEPMAP = get_dependency_map (depman , REPO .lilacinfos )
523
+
524
+ failed_info = D .get ('failed' , {})
525
+
526
+ U = set (REPO .lilacinfos )
527
+ last_commit = D .get ('last_commit' , EMPTY_COMMIT )
528
+ changed = get_changed_packages (last_commit , 'HEAD' ) & U
529
+
530
+ failed_prev = set (failed_info .keys ())
531
+ # no update from upstream, but build instructions have changed; rebuild
532
+ # failed ones
533
+ need_rebuild_failed = failed_prev & changed
534
+ # if pkgrel is updated, build a new release
535
+ need_rebuild_pkgrel = {x for x in changed
536
+ if pkgrel_changed (last_commit , 'HEAD' , x )}
514
537
515
538
# packages we care about
516
539
care_pkgs : set [str ] = set ()
517
- for pkg_to_build in pkgs_from_args :
518
- care_pkgs .update (dep .pkgname for dep in DEPMAP [pkg_to_build ])
519
- care_pkgs .add (pkg_to_build )
540
+ for p in pkgs_from_args :
541
+ if ':' in p :
542
+ pkg = p .split (':' , 1 )[0 ]
543
+ else :
544
+ pkg = p
545
+ care_pkgs .update (dep .pkgname for dep in DEPMAP [pkg ])
546
+ care_pkgs .add (pkg )
547
+ # make sure they have nvdata
548
+ care_pkgs .update (need_rebuild_failed )
549
+ care_pkgs .update (need_rebuild_pkgrel )
520
550
521
551
proxy = config ['nvchecker' ].get ('proxy' )
522
552
_nvdata , unknown , rebuild = packages_need_update (
523
553
REPO , proxy , care_pkgs ,
524
554
)
525
555
nvdata .update (_nvdata ) # update to the global object
526
556
527
- failed_info = D .get ('failed' , {})
528
-
529
- if not pkgs_from_args :
530
- U = set (REPO .lilacinfos )
531
- last_commit = D .get ('last_commit' , EMPTY_COMMIT )
532
- changed = get_changed_packages (last_commit , 'HEAD' ) & U
533
-
534
- failed_prev = set (failed_info .keys ())
535
- # no update from upstream, but build instructions have changed; rebuild
536
- # failed ones
537
- need_rebuild_failed = failed_prev & changed
538
- # if pkgrel is updated, build a new release
539
- need_rebuild_pkgrel = {x for x in changed
540
- if pkgrel_changed (last_commit , 'HEAD' , x )} - unknown
557
+ need_rebuild_pkgrel -= unknown
541
558
542
559
nv_changed = {}
543
560
for p , vers in nvdata .items ():
@@ -569,14 +586,19 @@ def main_may_raise(
569
586
570
587
if pkgs_from_args :
571
588
for p in pkgs_from_args :
572
- build_reasons [p ].append (BuildReason .Cmdline ())
573
- else :
574
- for p in need_rebuild_pkgrel :
575
- build_reasons [p ].append (BuildReason .UpdatedPkgrel ())
589
+ if ':' in p :
590
+ p , runner = p .split (':' , 1 )
591
+ else :
592
+ runner = None
593
+ build_reasons [p ].append (BuildReason .Cmdline (runner ))
576
594
577
- for p in need_rebuild_failed :
578
- build_reasons [p ].append (BuildReason .UpdatedFailed ())
595
+ for p in need_rebuild_pkgrel :
596
+ build_reasons [p ].append (BuildReason .UpdatedPkgrel ())
579
597
598
+ for p in need_rebuild_failed :
599
+ build_reasons [p ].append (BuildReason .UpdatedFailed ())
600
+
601
+ if not pkgs_from_args :
580
602
for p , i in failed_info .items ():
581
603
# p might have been removed
582
604
if p in REPO .lilacinfos and (deps := i ['missing' ]):
@@ -587,15 +609,17 @@ def main_may_raise(
587
609
for i in info .update_on_build :
588
610
if_this_then_those [i .pkgbase ].add (p )
589
611
more_pkgs = set ()
590
- count = 0
591
612
for p in build_reasons :
592
613
if pkgs := if_this_then_those .get (p ):
593
614
more_pkgs .update (pkgs )
594
- while len ( more_pkgs ) != count : # has new
595
- count = len ( more_pkgs )
615
+ while True :
616
+ add_to_more_pkgs = set ( )
596
617
for p in more_pkgs :
597
618
if pkgs := if_this_then_those .get (p ):
598
- more_pkgs .update (pkgs )
619
+ add_to_more_pkgs .update (pkgs )
620
+ if add_to_more_pkgs .issubset (more_pkgs ):
621
+ break
622
+ more_pkgs .update (add_to_more_pkgs )
599
623
for p in more_pkgs :
600
624
update_on_build = REPO .lilacinfos [p ].update_on_build
601
625
build_reasons [p ].append (BuildReason .OnBuild (update_on_build ))
@@ -626,10 +650,9 @@ def main_may_raise(
626
650
if x in failed_info :
627
651
del failed_info [x ]
628
652
# cleanup removed package failed_info
629
- if not pkgs_from_args :
630
- for x in tuple (failed_info .keys ()):
631
- if x not in REPO .lilacinfos :
632
- del failed_info [x ]
653
+ for x in tuple (failed_info .keys ()):
654
+ if x not in REPO .lilacinfos :
655
+ del failed_info [x ]
633
656
D ['failed' ] = failed_info
634
657
635
658
if config ['lilac' ]['rebuild_failed_pkgs' ]:
0 commit comments