From 94991e0de7e0c2b5220e14be47e7262a477f5285 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Mon, 4 Apr 2022 16:24:39 +0200 Subject: [PATCH] fix group cloning --- hub/kojihub.py | 55 ++++++++++++------------ tests/test_hub/test_snapshotTagModify.py | 23 +++++++--- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/hub/kojihub.py b/hub/kojihub.py index fc67b66d..5789236b 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -11839,13 +11839,13 @@ class RootExports(object): if groups: srcgroups = OrderedDict() dstgroups = OrderedDict() - for group in readTagGroups(src['name'], event=event): + for group in readTagGroups(src['name'], event=event, incl_blocked=True): srcgroups[group['name']] = group - for group in readTagGroups(dst['name']): + for group in readTagGroups(dst['name'], incl_blocked=True): dstgroups[group['name']] = group for (grpname, group) in srcgroups.items(): - if grpname not in dstgroups: + if grpname not in dstgroups or group['blocked'] != dstgroups[grpname]['blocked']: _grplist_add(dst['id'], group['name'], block=group['blocked'], force=force) _delete_event_id() @@ -11862,42 +11862,43 @@ class RootExports(object): for (grpname, group) in srcgroups.items(): if grpname in dstgroups: - _grplist_add(dst['id'], grpname, block=group['blocked'], force=force, - opts=group) - srcgrppkglist = [] - dstgrppkglist = [] + srcgrppkglist = {} + dstgrppkglist = {} for pkg in group['packagelist']: - srcgrppkglist.append(pkg) + srcgrppkglist[pkg['package']] = pkg for pkg in dstgroups[grpname]['packagelist']: - dstgrppkglist.append(pkg) - for pkg in srcgrppkglist: - if pkg not in dstgrppkglist: + dstgrppkglist[pkg['package']] = pkg + for pkg in srcgrppkglist.values(): + if pkg['package'] not in dstgrppkglist: _grp_pkg_add(dst['name'], grpname, pkg['package'], force=force, block=False) _delete_event_id() - srcgrpreqlist = [] - dstgrpreqlist = [] + srcgrpreqlist = {} + dstgrpreqlist = {} for grp in group['grouplist']: - srcgrpreqlist.append(grp) + srcgrpreqlist[grp['name']] = grp for grp in dstgroups[grpname]['grouplist']: - dstgrpreqlist.append(grp) - for grp in srcgrpreqlist: - if grp not in dstgrpreqlist: + dstgrpreqlist[grp['name']] = grp + for grp in srcgrpreqlist.values(): + if grp['name'] not in dstgrpreqlist: _grp_req_add(dst['name'], grpname, grp['name'], force=force, block=grp['blocked']) _delete_event_id() if remove: - for pkg in dstgrppkglist: - if pkg not in srcgrppkglist: - if pkg['tag_id'] == dst['id']: - _grp_pkg_remove(dst['name'], grpname, pkg['package'], - force=force) - else: - _grp_pkg_add(dst['id'], grpname, pkg['package'], - block=True, force=force) + for pkgname, pkg in dstgrppkglist.items(): + if pkg['blocked']: + continue + if srcgrppkglist.get(pkgname, {}).get('blocked'): + _grp_pkg_add(dst['id'], grpname, pkg['package'], + block=True, force=force) _delete_event_id() - for grp in dstgrpreqlist: - if grp not in srcgrpreqlist: + elif pkgname not in srcgrppkglist and pkg['tag_id'] == dst['id']: + _grp_pkg_remove(dst['name'], grpname, pkg['package'], force=force) + _delete_event_id() + for grp in dstgrpreqlist.values(): + if grp['blocked']: + continue + if grp['name'] not in srcgrpreqlist: if grp['group_id'] == dst['id']: _grp_req_remove(dst['name'], grpname, grp['name'], force=force) else: diff --git a/tests/test_hub/test_snapshotTagModify.py b/tests/test_hub/test_snapshotTagModify.py index 386bf196..7eb995bc 100644 --- a/tests/test_hub/test_snapshotTagModify.py +++ b/tests/test_hub/test_snapshotTagModify.py @@ -117,7 +117,13 @@ class TestSnapshotTagModify(unittest.TestCase): 'id': 1, 'name': 'group1', 'blocked': False, - 'packagelist': [{'package': pkg1['package_name'], 'tag_id': src['id']}], + 'packagelist': [ + { + 'package': pkg1['package_name'], + 'tag_id': src['id'], + 'blocked': False, + } + ], 'grouplist': [{'group_id': 5, 'name': 'group5', 'blocked': False}], 'inherited': False, } @@ -125,7 +131,7 @@ class TestSnapshotTagModify(unittest.TestCase): 'id': 2, 'name': 'group2', 'blocked': False, - 'package_list': [], + 'packagelist': [], 'grouplist': [], 'inherited': False, } @@ -133,7 +139,13 @@ class TestSnapshotTagModify(unittest.TestCase): 'id': 3, 'name': 'group1', 'blocked': False, - 'packagelist': [{'package': pkg2['package_name'], 'tag_id': dst['id']}], + 'packagelist': [ + { + 'package': pkg2['package_name'], + 'tag_id': dst['id'], + 'blocked': False, + } + ], 'grouplist': [{'group_id': 4, 'name': 'group4', 'blocked': False}], 'inherited': False, } @@ -201,9 +213,6 @@ class TestSnapshotTagModify(unittest.TestCase): mock.call('dst', 'group1', 'group5', block=False, force=True), mock.call('dst', 'group1', 'group4', block=True, force=True), ]) - self._grplist_add.assert_has_calls([ - mock.call(dst['id'], 'group2', block=False, force=True), - mock.call(dst['id'], 'group1', block=False, force=True, opts=src_group1), - ]) + self._grplist_add.assert_called_once_with(dst['id'], 'group2', block=False, force=True) self._grplist_remove.assert_not_called() self.hub.massTag.assert_not_called()