Lines 392-487
class NattkaCommands(object):
Link Here
|
392 |
return ret |
392 |
return ret |
393 |
|
393 |
|
394 |
def make_package_list(self) -> int: |
394 |
def make_package_list(self) -> int: |
395 |
repo, git_repo = self.get_git_repository() |
395 |
repo = self.get_repository() |
396 |
|
396 |
|
397 |
with git_repo: |
397 |
start_time = datetime.datetime.utcnow() |
398 |
start_time = datetime.datetime.utcnow() |
398 |
packages = self.args.package |
399 |
packages = self.args.package |
399 |
if self.args.arch is None: |
400 |
if self.args.arch is None: |
400 |
initial_arches = '*' |
401 |
initial_arches = '*' |
401 |
else: |
402 |
else: |
402 |
initial_arches = ' '.join(self.args.arch) |
403 |
initial_arches = ' '.join(self.args.arch) |
403 |
if self.args.stabilization: |
404 |
if self.args.stabilization: |
404 |
bug_cat = BugCategory.STABLEREQ |
405 |
bug_cat = BugCategory.STABLEREQ |
405 |
pkg_attr = 'cpvstr' |
406 |
pkg_attr = 'cpvstr' |
406 |
else: |
407 |
else: |
407 |
bug_cat = BugCategory.KEYWORDREQ |
408 |
bug_cat = BugCategory.KEYWORDREQ |
408 |
pkg_attr = 'key' |
409 |
pkg_attr = 'key' |
409 |
|
410 |
|
410 |
b = BugInfo(bug_cat, f'{packages[0]} {initial_arches}\n') |
411 |
b = BugInfo(bug_cat, f'{packages[0]} {initial_arches}\n') |
411 |
plist = dict(match_package_list(repo, b, only_new=True)) |
412 |
plist = dict(match_package_list(repo, b, only_new=True)) |
412 |
assert len(plist) == 1 |
413 |
assert len(plist) == 1 |
413 |
cc_arches = sorted( |
414 |
cc_arches = sorted( |
414 |
[f'{x}@gentoo.org' for x |
415 |
[f'{x}@gentoo.org' for x |
415 |
in set(itertools.chain.from_iterable(plist.values())) |
416 |
in set(itertools.chain.from_iterable(plist.values())) |
416 |
if '-' not in x]) |
417 |
if '-' not in x]) |
417 |
|
418 |
|
418 |
it = 1 |
419 |
it = 1 |
419 |
# prepare the initial set |
420 |
# prepare the initial set |
420 |
b = BugInfo(bug_cat, '\n'.join(packages), cc=cc_arches) |
421 |
b = BugInfo(bug_cat, '\n'.join(packages), cc=cc_arches) |
421 |
new_plist = dict(match_package_list(repo, b, only_new=True)) |
|
|
422 |
add_keywords(plist.items(), |
423 |
b.category == BugCategory.STABLEREQ) |
424 |
|
425 |
while True: |
426 |
log.info(f'Iteration {it}: running pkgcheck ...') |
427 |
plist = new_plist |
428 |
check_res, issues = check_dependencies( |
429 |
repo, plist.items(), profiles=self.args.profiles) |
430 |
|
431 |
# all good? we're done! |
432 |
if check_res: |
433 |
break |
434 |
|
435 |
new_packages = set() |
436 |
for i in issues: |
437 |
eapi = repo[(i.category, i.package, i.version)].eapi |
438 |
for d in i.deps: |
439 |
# TODO: handle USE-deps meaningfully |
440 |
# TODO: handle <-deps |
441 |
r = eapi.atom_kls(d).no_usedeps |
442 |
for m in reversed(sorted(repo.itermatch(r))): |
443 |
if b.category == BugCategory.STABLEREQ: |
444 |
# skip unkeyworded ebuilds |
445 |
if not m.keywords: |
446 |
continue |
447 |
new_packages.add(getattr(m, pkg_attr)) |
448 |
break |
449 |
else: |
450 |
log.error(f'No match for dependency: {d}') |
451 |
return 1 |
452 |
|
453 |
assert new_packages |
454 |
log.info( |
455 |
f'New packages: {" ".join(sorted(new_packages))}') |
456 |
|
457 |
# apply on *new* packages |
458 |
b = BugInfo(bug_cat, '\n'.join(new_packages), cc=cc_arches) |
422 |
new_plist = dict(match_package_list(repo, b, only_new=True)) |
459 |
new_plist = dict(match_package_list(repo, b, only_new=True)) |
423 |
add_keywords(plist.items(), |
460 |
for p in list(new_packages): |
424 |
b.category == BugCategory.STABLEREQ) |
461 |
if not any(getattr(x, pkg_attr) == p for x in new_plist): |
425 |
|
462 |
log.info(f'Package {p} seems to be a red herring ' |
426 |
while True: |
463 |
f'(already keyworded everywhere)') |
427 |
log.info(f'Iteration {it}: running pkgcheck ...') |
464 |
new_packages.remove(p) |
428 |
plist = new_plist |
465 |
add_keywords(new_plist.items(), |
429 |
check_res, issues = check_dependencies( |
466 |
b.category == BugCategory.STABLEREQ) |
430 |
repo, plist.items(), profiles=self.args.profiles) |
467 |
|
431 |
|
468 |
# but test on *old* |
432 |
# all good? we're done! |
469 |
log.info(f'Iteration {it}: verifying ...') |
433 |
if check_res: |
470 |
check_res, issues = check_dependencies( |
434 |
break |
471 |
repo, plist.items(), profiles=self.args.profiles) |
435 |
|
472 |
if not check_res: |
436 |
new_packages = set() |
473 |
log.error('Attempt to satisfy dependencies failed:') |
437 |
for i in issues: |
474 |
log.error('\n'.join(format_results(issues))) |
438 |
eapi = repo[(i.category, i.package, i.version)].eapi |
475 |
log.error('Please correct the package list and retry.') |
439 |
for d in i.deps: |
476 |
break |
440 |
# TODO: handle USE-deps meaningfully |
477 |
|
441 |
# TODO: handle <-deps |
478 |
for x in sorted(new_packages): |
442 |
r = eapi.atom_kls(d).no_usedeps |
479 |
# TODO: handle it gracefully |
443 |
for m in reversed(sorted(repo.itermatch(r))): |
480 |
assert x not in packages |
444 |
if b.category == BugCategory.STABLEREQ: |
481 |
packages.append(x) |
445 |
# skip unkeyworded ebuilds |
482 |
|
446 |
if not m.keywords: |
483 |
it += 1 |
447 |
continue |
|
|
448 |
new_packages.add(getattr(m, pkg_attr)) |
449 |
break |
450 |
else: |
451 |
log.error(f'No match for dependency: {d}') |
452 |
return 1 |
453 |
|
454 |
assert new_packages |
455 |
log.info( |
456 |
f'New packages: {" ".join(sorted(new_packages))}') |
457 |
|
458 |
# apply on *new* packages |
459 |
b = BugInfo(bug_cat, '\n'.join(new_packages), cc=cc_arches) |
460 |
new_plist = dict(match_package_list(repo, b, only_new=True)) |
461 |
for p in list(new_packages): |
462 |
if not any(getattr(x, pkg_attr) == p for x in new_plist): |
463 |
log.info(f'Package {p} seems to be a red herring ' |
464 |
f'(already keyworded everywhere)') |
465 |
new_packages.remove(p) |
466 |
add_keywords(new_plist.items(), |
467 |
b.category == BugCategory.STABLEREQ) |
468 |
|
469 |
# but test on *old* |
470 |
log.info(f'Iteration {it}: verifying ...') |
471 |
check_res, issues = check_dependencies( |
472 |
repo, plist.items(), profiles=self.args.profiles) |
473 |
if not check_res: |
474 |
log.error('Attempt to satisfy dependencies failed:') |
475 |
log.error('\n'.join(format_results(issues))) |
476 |
log.error('Please correct the package list and retry.') |
477 |
break |
478 |
|
479 |
for x in sorted(new_packages): |
480 |
# TODO: handle it gracefully |
481 |
assert x not in packages |
482 |
packages.append(x) |
483 |
|
484 |
it += 1 |
485 |
|
484 |
|
486 |
end_time = datetime.datetime.utcnow() |
485 |
end_time = datetime.datetime.utcnow() |
487 |
log.info(f'Time elapsed: {end_time - start_time}') |
486 |
log.info(f'Time elapsed: {end_time - start_time}') |