Ejemplo n.º 1
0
 def test_regular(self):
     self.assertEqual(
         split_dependent_bugs(
             {
                 1: BugInfo(BugCategory.STABLEREQ, '', depends=[2]),
                 2: BugInfo(None, '', blocks=[1]),
             }, 1), ([], [2]))
Ejemplo n.º 2
0
 def test_streq_mixed(self):
     self.assertEqual(
         split_dependent_bugs(
             {
                 1: BugInfo(BugCategory.STABLEREQ, '', depends=[2]),
                 2: BugInfo(
                     BugCategory.KEYWORDREQ, '', depends=[3], blocks=[1]),
                 3: BugInfo(BugCategory.STABLEREQ, '', blocks=[2]),
             }, 1), ([], [2]))
Ejemplo n.º 3
0
 def test_kwreq(self):
     self.assertEqual(
         split_dependent_bugs(
             {
                 1: BugInfo(BugCategory.KEYWORDREQ, '', depends=[2]),
                 2: BugInfo(
                     BugCategory.KEYWORDREQ, '', depends=[3], blocks=[1]),
                 3: BugInfo(BugCategory.KEYWORDREQ, '', blocks=[2]),
             }, 1), ([2, 3], []))
Ejemplo n.º 4
0
 def test_common_dep(self):
     self.assertEqual(
         split_dependent_bugs(
             {
                 1: BugInfo(BugCategory.STABLEREQ, '', depends=[2, 3]),
                 2: BugInfo(
                     BugCategory.STABLEREQ, '', depends=[4], blocks=[1]),
                 3: BugInfo(
                     BugCategory.STABLEREQ, '', depends=[4], blocks=[1]),
                 4: BugInfo(BugCategory.STABLEREQ, '', blocks=[2, 3]),
             }, 1), ([2, 3, 4], []))
Ejemplo n.º 5
0
    def make_package_list(self) -> int:
        repo, git_repo = self.get_git_repository()

        with git_repo:
            start_time = datetime.datetime.utcnow()
            packages = self.args.package
            if self.args.arch is None:
                initial_arches = '*'
            else:
                initial_arches = ' '.join(self.args.arch)

            b = BugInfo(BugCategory.KEYWORDREQ,
                        f'{packages[0]} {initial_arches}\n')
            plist = dict(match_package_list(repo, b, only_new=True))
            assert len(plist) == 1
            cc_arches = sorted([
                f'{x}@gentoo.org'
                for x in set(itertools.chain.from_iterable(plist.values()))
                if '-' not in x
            ])

            it = 1
            # prepare the initial set
            b = BugInfo(BugCategory.KEYWORDREQ,
                        '\n'.join(packages),
                        cc=cc_arches)
            new_plist = dict(match_package_list(repo, b, only_new=True))
            add_keywords(plist.items(), b.category == BugCategory.STABLEREQ)

            while True:
                log.info(f'Iteration {it}: running pkgcheck ...')
                plist = new_plist
                check_res, issues = check_dependencies(repo, plist.items())

                # all good? we're done!
                if check_res:
                    break

                new_packages = set()
                for i in issues:
                    eapi = repo[(i.category, i.package, i.version)].eapi
                    for d in i.deps:
                        # TODO: handle USE-deps meaningfully
                        # TODO: handle <-deps
                        r = atom(d, eapi=eapi).no_usedeps
                        for m in repo.itermatch(r):
                            new_packages.add(m.key)
                            break
                        else:
                            log.error(f'No match for dependency: {d}')
                            return 1

                assert new_packages
                log.info(f'New packages: {" ".join(sorted(new_packages))}')

                # apply on *new* packages
                b = BugInfo(BugCategory.KEYWORDREQ,
                            '\n'.join(new_packages),
                            cc=cc_arches)
                new_plist = dict(match_package_list(repo, b, only_new=True))
                for p in list(new_packages):
                    if not any(x.key == p for x in new_plist):
                        log.info(f'Package {p} seems to be a red herring '
                                 f'(already keyworded everywhere)')
                        new_packages.remove(p)
                add_keywords(new_plist.items(),
                             b.category == BugCategory.STABLEREQ)

                # but test on *old*
                log.info(f'Iteration {it}: verifying ...')
                check_res, issues = check_dependencies(repo, plist.items())
                if not check_res:
                    log.error('Attempt to satisfy dependencies failed:')
                    log.error('\n'.join(format_results(issues)))
                    log.error('Please correct the package list and retry.')
                    break

                for x in sorted(new_packages):
                    # TODO: handle it gracefully
                    assert x not in packages
                    packages.append(x)

                it += 1

        end_time = datetime.datetime.utcnow()
        log.info(f'Time elapsed: {end_time - start_time}')
        log.info(f'Target CC: {" ".join(cc_arches)}')
        log.info('Package list follows:')
        print(f'{packages[0]} {initial_arches}')
        print('\n'.join(f'{x} ^' for x in packages[1:]))

        return 0
Ejemplo n.º 6
0
 def test_empty(self):
     self.assertEqual(
         split_dependent_bugs({1: BugInfo(BugCategory.STABLEREQ, '')}, 1),
         ([], []))
Ejemplo n.º 7
0
 def get_bugs(self, req: typing.Iterable[int]) -> typing.Dict[int, BugInfo]:
     """Return expected data for specified bugs"""
     bugs = {
         1:
         BugInfo(None,
                 '\r\n',
                 blocks=[2],
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 3, 13, 22,
                                                    41)),
         2:
         BugInfo(BugCategory.KEYWORDREQ,
                 'dev-python/unittest-mixins-1.6\r\n'
                 'dev-python/coverage-4.5.4\r\n',
                 [f'{x}@gentoo.org' for x in ('alpha', 'hppa')],
                 depends=[1],
                 blocks=[9],
                 sanity_check=True,
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 3, 13, 34,
                                                    59)),
         3:
         BugInfo(BugCategory.STABLEREQ,
                 'dev-python/mako-1.1.0 amd64\r\n',
                 [f'{x}@gentoo.org' for x in ('amd64', )],
                 depends=[7],
                 keywords=['STABLEREQ'],
                 sanity_check=False,
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 11, 26, 9, 42,
                                                    55)),
         4:
         BugInfo(BugCategory.KEYWORDREQ, 'dev-python/urllib3-1.25.8\r\n'
                 'dev-python/trustme-0.6.0\r\n'
                 'dev-python/brotlipy-0.7.0\r\n',
                 [f'{x}@gentoo.org' for x in ('hppa', )],
                 keywords=['KEYWORDREQ'],
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 3, 13, 34,
                                                    55)),
         5:
         BugInfo(BugCategory.STABLEREQ,
                 'app-arch/arj-3.10.22-r7 amd64 hppa\r\n',
                 ['*****@*****.**'],
                 whiteboard='test whiteboard',
                 security=True,
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 10, 9, 47,
                                                    22)),
         6:
         BugInfo(BugCategory.STABLEREQ,
                 'sys-kernel/gentoo-sources-4.1.6\r\n',
                 security=True,
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 3, 13, 31,
                                                    19)),
         7:
         BugInfo(BugCategory.STABLEREQ,
                 'dev-python/pytest-5.4.1\r\n',
                 blocks=[3],
                 keywords=['ALLARCHES'],
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 3, 13, 28,
                                                    17)),
         8:
         BugInfo(BugCategory.STABLEREQ,
                 'dev-lang/python-3.7.7\r\n',
                 resolved=True,
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 4, 7, 7, 56)),
         9:
         BugInfo(BugCategory.KEYWORDREQ,
                 'dev-python/frobnicate-11\r\n',
                 depends=[2],
                 assigned_to='*****@*****.**',
                 last_change_time=datetime.datetime(2020, 4, 5, 14, 35,
                                                    59)),
     }
     for k in list(bugs):
         if k not in req:
             del bugs[k]
     return bugs