From e182d1f7bb6bc4daa2a6587175f310b4df713aa3 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: May 16 2018 13:56:40 +0000 Subject: [PATCH 1/2] Allow listing of blocked data in readTagGroups Fixes: https://pagure.io/koji/issue/870 --- diff --git a/hub/kojihub.py b/hub/kojihub.py index af87e77..83a6819 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -2013,20 +2013,32 @@ def get_tag_groups(tag, event=None, inherit=True, incl_pkgs=True, incl_reqs=True return groups -def readTagGroups(tag, event=None, inherit=True, incl_pkgs=True, incl_reqs=True): +def readTagGroups(tag, event=None, inherit=True, incl_pkgs=True, incl_reqs=True, incl_blocked=False): """Return group data for the tag with blocked entries removed Also scrubs data into an xmlrpc-safe format (no integer keys) + + Blocked packages/groups can alternatively also be listed if incl_blocked is set to True """ groups = get_tag_groups(tag, event, inherit, incl_pkgs, incl_reqs) - for group in groups.values(): + groups = list(groups.values()) + for group in groups: #filter blocked entries and collapse to a list if 'packagelist' in group: - group['packagelist'] = [x for x in group['packagelist'].values() if not x['blocked']] + if incl_blocked: + group['packagelist'] = list(group['packagelist'].values()) + else: + group['packagelist'] = [x for x in group['packagelist'].values() if not x['blocked']] if 'grouplist' in group: - group['grouplist'] = [x for x in group['grouplist'].values() if not x['blocked']] + if incl_blocked: + group['grouplist'] = list(group['grouplist'].values()) + else: + group['grouplist'] = [x for x in group['grouplist'].values() if not x['blocked']] #filter blocked entries and collapse to a list - return [x for x in groups.values() if not x['blocked']] + if incl_blocked: + return groups + else: + return [x for x in groups if not x['blocked']] def set_host_enabled(hostname, enabled=True): context.session.assertPerm('admin') diff --git a/tests/test_hub/test_group_operations.py b/tests/test_hub/test_group_operations.py index c62cab4..eda0923 100644 --- a/tests/test_hub/test_group_operations.py +++ b/tests/test_hub/test_group_operations.py @@ -201,3 +201,41 @@ class TestGrouplist(unittest.TestCase): self.assertEqual(actual, q) self.assertEqual(len(self.updates), 0) self.assertEqual(len(self.inserts), 0) + + def test_readTagGroups_empty(self): + self.get_tag_groups.return_value = {} + + r = kojihub.readTagGroups('tag') + self.assertEqual(r, []) + + self.get_tag_groups.assert_called_once_with('tag', None, True, True, True) + + def test_readTagGroups(self): + group = { + 'name': 'a', + 'packagelist': {}, + 'grouplist': {}, + 'blocked': False, + } + self.get_tag_groups.return_value = {1: group} + + r = kojihub.readTagGroups('tag') + self.assertEqual(r, [{'name': 'a', 'packagelist': [], 'grouplist': [], 'blocked': False}]) + + def test_readTagGroups_blocked(self): + group = { + 'name': 'a', + 'packagelist': {}, + 'grouplist': {}, + 'blocked': True, + } + self.get_tag_groups.return_value = {1: group.copy()} + + # without blocked + r = kojihub.readTagGroups('tag') + self.assertEqual(r, []) + + # with blocked + self.get_tag_groups.return_value = {1: group.copy()} + r = kojihub.readTagGroups('tag', incl_blocked=True) + self.assertEqual(r, [{'name': 'a', 'packagelist': [], 'grouplist': [], 'blocked': True}]) From bed08922485fba88f55ec057ddbc426601e7a3c0 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: May 16 2018 13:56:41 +0000 Subject: [PATCH 2/2] CLI update for readTagGroups blocked --- diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index a9c14ac..b793146 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -2561,7 +2561,10 @@ def print_group_list_req_group(group): def print_group_list_req_package(pkg): - print(" %(package)s: %(basearchonly)s, %(type)s [%(tag_name)s]" % pkg) + fmt = " %(package)s: %(basearchonly)s, %(type)s [%(tag_name)s]" + if pkg['blocked']: + fmt += " [BLOCKED]" + print(fmt % pkg) def anon_handle_list_groups(goptions, session, args): @@ -2572,11 +2575,12 @@ def anon_handle_list_groups(goptions, session, args): parser.add_option("--event", type='int', metavar="EVENT#", help=_("query at event")) parser.add_option("--ts", type='int', metavar="TIMESTAMP", help=_("query at timestamp")) parser.add_option("--repo", type='int', metavar="REPO#", help=_("query at event for a repo")) + parser.add_option("--show-blocked", action="store_true", dest="incl_blocked", help=_("Show blocked packages")) (options, args) = parser.parse_args(args) if len(args) < 1 or len(args) > 2: parser.error(_("Incorrect number of arguments")) assert False # pragma: no cover - opts = {} + opts = {'incl_blocked': options.incl_blocked} activate_session(session, goptions) event = koji.util.eventFromOpts(session, options) if event: @@ -5074,13 +5078,16 @@ def anon_handle_show_groups(goptions, session, args): parser.add_option("-x", "--expand", action="store_true", default=False, help=_("Expand groups in comps format")) parser.add_option("--spec", action="store_true", help=_("Print build spec")) + parser.add_option("--show-blocked", action="store_true", dest="incl_blocked", help=_("Show blocked packages")) (options, args) = parser.parse_args(args) if len(args) != 1: parser.error(_("Incorrect number of arguments")) assert False # pragma: no cover + if options.incl_blocked and (options.comps or options.spec): + parser.error(_("--show-blocked doesn't make sense for comps/spec output")) activate_session(session, goptions) tag = args[0] - groups = session.getTagGroups(tag) + groups = session.getTagGroups(tag, incl_blocked=options.incl_blocked) if options.comps: print(koji.generate_comps(groups, expand_groups=options.expand)) elif options.spec: diff --git a/tests/test_cli/test_list_groups.py b/tests/test_cli/test_list_groups.py index 61e12d0..e6a60f4 100644 --- a/tests/test_cli/test_list_groups.py +++ b/tests/test_cli/test_list_groups.py @@ -189,6 +189,7 @@ Options: --event=EVENT# query at event --ts=TIMESTAMP query at timestamp --repo=REPO# query at event for a repo + --show-blocked Show blocked packages """ % self.progname)