From f0f0e5de619b0f69759be09e50d3b637f9d4cb3f Mon Sep 17 00:00:00 2001
From: Christopher O'Brien <cobrien@redhat.com>
Date: Dec 19 2019 16:49:56 +0000
Subject: [PATCH 1/2] allow python to find its own version of nose rather than looking for a binary which may not exist


---

diff --git a/Makefile b/Makefile
index 995b23f..cee8982 100644
--- a/Makefile
+++ b/Makefile
@@ -81,7 +81,7 @@ test: test2 test3
 test2:
 	coverage2 erase
 	PYTHONPATH=hub/.:plugins/hub/.:plugins/builder/.:plugins/cli/.:cli/.:www/lib coverage2 run \
-	    --source . /usr/bin/nosetests
+	    --source . -m nose
 	coverage2 report
 	coverage2 html
 	@echo Full coverage report at file://${CURDIR}/htmlcov/py2/index.html
@@ -89,8 +89,7 @@ test2:
 test3:
 	coverage3 erase --rcfile .coveragerc3
 	PYTHONPATH=hub/.:plugins/hub/.:plugins/builder/.:plugins/cli/.:cli/.:www/lib coverage3 run \
-	    --rcfile .coveragerc3 --source . \
-	    /usr/bin/nosetests-3
+	    --rcfile .coveragerc3 --source . -m nose
 	coverage3 report --rcfile .coveragerc3
 	coverage3 html --rcfile .coveragerc3
 	@echo Full coverage report at file://${CURDIR}/htmlcov/py3/index.html

From 7093cdb597a795384e5149b9d4496a6a60f246e4 Mon Sep 17 00:00:00 2001
From: Christopher O'Brien <cobrien@redhat.com>
Date: Dec 19 2019 16:50:42 +0000
Subject: [PATCH 2/2] Disable notifications from clone-tag by default


The tagBuildBypass and untagBuildBypass invocations in the clone-tag
CLI were not setting the notify option, leaving it at the default of
True. This means in some cases many hundreds of notification events
would be triggered from a clone-tag call.

Change the default behavior of clone-tag to explicitly disable
notifications

Add a new --notify option to clone-tag to re-enable notifications for
tagging and untagging of builds.

Fixes: #1890

---

diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py
index faca3a9..c47bb40 100644
--- a/cli/koji_cli/commands.py
+++ b/cli/koji_cli/commands.py
@@ -3249,6 +3249,8 @@ def handle_clone_tag(goptions, session, args):
             help=_('Clone tag at a specific repo event'))
     parser.add_option("-v", "--verbose", action="store_true",
             help=_("show changes"))
+    parser.add_option("--notify", action="store_true", default=False,
+            help=_('Send tagging/untagging notifications'))
     parser.add_option("-f", "--force", action="store_true",
             help=_("override tag locks if necessary"))
     parser.add_option("-n", "--test", action="store_true", help=_("test mode"))
@@ -3348,7 +3350,8 @@ def handle_clone_tag(goptions, session, args):
                 if not options.test:
                     session.tagBuildBypass(newtag['name'],
                                            build,
-                                           force=options.force)
+                                           force=options.force,
+                                           notify=options.notify)
             if not options.test:
                 session.multiCall(batch=options.batch)
         if options.groups:
@@ -3523,7 +3526,8 @@ def handle_clone_tag(goptions, session, args):
                 if not options.test:
                     session.untagBuildBypass(dsttag['name'],
                                              build,
-                                             force=options.force)
+                                             force=options.force,
+                                             notify=options.notify)
         if not options.test:
             session.multiCall(batch=options.batch)
         # ADD builds.
@@ -3542,7 +3546,8 @@ def handle_clone_tag(goptions, session, args):
             if not options.test:
                 session.tagBuildBypass(dsttag['name'],
                                        build,
-                                       force=options.force)
+                                       force=options.force,
+                                       notify=options.notify)
         if not options.test:
             session.multiCall(batch=options.batch)
         # ADD groups.
@@ -3608,7 +3613,8 @@ def handle_clone_tag(goptions, session, args):
                 if not options.test:
                     session.untagBuildBypass(dsttag['name'],
                                              build,
-                                             force=options.force)
+                                             force=options.force,
+                                             notify=options.notify)
             # now safe to remove package itself since we resolved its builds.
             chgpkglist.append(('[del]',
                                pkg['package_name'],
diff --git a/tests/test_cli/test_clone_tag.py b/tests/test_cli/test_clone_tag.py
index 8257097..1fde1ce 100644
--- a/tests/test_cli/test_clone_tag.py
+++ b/tests/test_cli/test_clone_tag.py
@@ -244,25 +244,29 @@ clone-tag will create the destination tag if it does not already exist
                                            'nvr': 'pkg2-1.0-1',
                                            'package_name': 'pkg2', 'state': 2,
                                            'tag_name': 'src-tag-p',
-                                           'name': 'pkg2'}, force=None),
+                                           'name': 'pkg2'}, force=None,
+                                                           notify=False),
                                        call.tagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg1-1.0-1',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'src-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                           notify=False),
                                        call.tagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg1-1.0-2',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'src-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                           notify=False),
                                        call.tagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg1-1.1-2',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'src-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                           notify=False),
                                        call.multiCall(batch=1000),
                                        call.getTagGroups('src-tag',
                                                          event=None),
@@ -506,38 +510,44 @@ List of changes:
                                            'nvr': 'pkg1-2.1-2',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'dst-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                             notify=False),
                                        call.untagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg1-0.1-1',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'dst-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                             notify=False),
                                        call.untagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg3-1.0-1',
                                            'package_name': 'pkg3', 'state': 1,
                                            'tag_name': 'dst-tag',
-                                           'name': 'pkg3'}, force=None),
+                                           'name': 'pkg3'}, force=None,
+                                                             notify=False),
                                        call.multiCall(batch=1000),
                                        call.tagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg1-0.1-1',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'src-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                           notify=False),
                                        call.tagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg1-1.0-2',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'src-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                             notify=False),
                                        call.tagBuildBypass('dst-tag', {
                                            'owner_name': 'b_owner',
                                            'nvr': 'pkg1-1.1-2',
                                            'package_name': 'pkg1', 'state': 1,
                                            'tag_name': 'src-tag',
-                                           'name': 'pkg1'}, force=None),
+                                           'name': 'pkg1'}, force=None,
+                                                           notify=False),
                                        call.multiCall(batch=1000),
                                        call.multiCall(batch=1000),
                                        call.groupPackageListAdd('dst-tag',
@@ -633,6 +643,7 @@ Options:
   --event=EVENT     Clone tag at a specific event
   --repo=REPO       Clone tag at a specific repo event
   -v, --verbose     show changes
+  --notify          Send tagging/untagging notifications
   -f, --force       override tag locks if necessary
   -n, --test        test mode
   --batch=SIZE      batch size of multicalls [0 to disable, default: 1000]

