def test_regular(self): self.assertEqual( split_dependent_bugs( { 1: BugInfo(BugCategory.STABLEREQ, '', depends=[2]), 2: BugInfo(None, '', blocks=[1]), }, 1), ([], [2]))
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]))
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], []))
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], []))
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
def test_empty(self): self.assertEqual( split_dependent_bugs({1: BugInfo(BugCategory.STABLEREQ, '')}, 1), ([], []))
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