Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 926061
Collapse All | Expand All

(-)a/nattka/__main__.py (-88 / +87 lines)
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}')

Return to bug 926061